%% Generated by Sphinx. \def\sphinxdocclass{report} \documentclass[letterpaper,10pt,italian]{sphinxmanual} \ifdefined\pdfpxdimen \let\sphinxpxdimen\pdfpxdimen\else\newdimen\sphinxpxdimen \fi \sphinxpxdimen=.75bp\relax \PassOptionsToPackage{warn}{textcomp} \usepackage[utf8]{inputenc} \ifdefined\DeclareUnicodeCharacter % support both utf8 and utf8x syntaxes \ifdefined\DeclareUnicodeCharacterAsOptional \def\sphinxDUC#1{\DeclareUnicodeCharacter{"#1}} \else \let\sphinxDUC\DeclareUnicodeCharacter \fi \sphinxDUC{00A0}{\nobreakspace} \sphinxDUC{2500}{\sphinxunichar{2500}} \sphinxDUC{2502}{\sphinxunichar{2502}} \sphinxDUC{2514}{\sphinxunichar{2514}} \sphinxDUC{251C}{\sphinxunichar{251C}} \sphinxDUC{2572}{\textbackslash} \fi \usepackage{cmap} \usepackage[T1]{fontenc} \usepackage{amsmath,amssymb,amstext} \usepackage{babel} \usepackage{times} \expandafter\ifx\csname T@LGR\endcsname\relax \else % LGR was declared as font encoding \substitutefont{LGR}{\rmdefault}{cmr} \substitutefont{LGR}{\sfdefault}{cmss} \substitutefont{LGR}{\ttdefault}{cmtt} \fi \expandafter\ifx\csname T@X2\endcsname\relax \expandafter\ifx\csname T@T2A\endcsname\relax \else % T2A was declared as font encoding \substitutefont{T2A}{\rmdefault}{cmr} \substitutefont{T2A}{\sfdefault}{cmss} \substitutefont{T2A}{\ttdefault}{cmtt} \fi \else % X2 was declared as font encoding \substitutefont{X2}{\rmdefault}{cmr} \substitutefont{X2}{\sfdefault}{cmss} \substitutefont{X2}{\ttdefault}{cmtt} \fi \usepackage[Sonny]{fncychap} \ChNameVar{\Large\normalfont\sffamily} \ChTitleVar{\Large\normalfont\sffamily} \usepackage{sphinx} \fvset{fontsize=\small} \usepackage{geometry} % Include hyperref last. \usepackage{hyperref} % Fix anchor placement for figures with captions. \usepackage{hypcap}% it must be loaded after hyperref. % Set up styles of URL: it should be placed after hyperref. \urlstyle{same} \addto\captionsitalian{\renewcommand{\contentsname}{Manuale utente}} \usepackage{sphinxmessages} \setcounter{tocdepth}{3} \setcounter{secnumdepth}{3} \title{N.E.S.T.\@{}} \date{30 mag 2021} \release{0.1.0} \author{Gruppo 2} \newcommand{\sphinxlogo}{\vbox{}} \renewcommand{\releasename}{Release} \makeindex \begin{document} \ifdefined\shorthandoff \ifnum\catcode`\=\string=\active\shorthandoff{=}\fi \ifnum\catcode`\"=\active\shorthandoff{"}\fi \fi \pagestyle{empty} \sphinxmaketitle \pagestyle{plain} \sphinxtableofcontents \pagestyle{normal} \phantomsection\label{\detokenize{index::doc}} \sphinxAtStartPar Benvenuto alla documentazione di N.E.S.T.! \chapter{Il progetto in breve} \label{\detokenize{guide/about:il-progetto-in-breve}}\label{\detokenize{guide/about::doc}} \sphinxAtStartPar \sphinxstylestrong{N.E.S.T.} (Noi Estraiamo Statistiche Tweet) è un progetto realizzato nel 2021 per l\textquotesingle{}\sphinxstylestrong{esame di Progetto del Software} del corso di Informatica all\textquotesingle{}Unimore. \section{Suddivisione in moduli} \label{\detokenize{guide/about:suddivisione-in-moduli}} \sphinxAtStartPar Il progetto è composto da tre parti: \begin{description} \item[{{\hyperref[\detokenize{code/crawler/index:module-nest_crawler}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{nest\_crawler}}}}}}] \leavevmode \sphinxAtStartPar Un modulo scritto in \sphinxhref{https://www.python.org/}{Python} usando \sphinxcode{\sphinxupquote{tweepy}} che recupera tweet attraverso la \sphinxhref{https://developer.twitter.com/en/docs/twitter-api}{Twitter API} secondo le condizioni presenti all\textquotesingle{}interno del database e li salva per future elaborazioni. \item[{{\hyperref[\detokenize{code/backend/index:module-nest_backend}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{nest\_backend}}}}}}] \leavevmode \sphinxAtStartPar Un web server scritto in \sphinxhref{https://www.python.org/}{Python} usando il framework \sphinxhref{https://flask.palletsprojects.com/en/1.1.x/api/\#module-flask}{\sphinxcode{\sphinxupquote{flask}}} che fornisce un\textquotesingle{}API HTTP per visualizzare e manipolare i dati dell\textquotesingle{}applicazione, gestendo autenticazione, autorizzazione e comunicazione con il database. \item[{\sphinxcode{\sphinxupquote{nest\_frontend}}}] \leavevmode \sphinxAtStartPar Una applicazione web scritta in \sphinxhref{https://reactjs.org/docs/introducing-jsx.html}{JSX} usando il framework \sphinxcode{\sphinxupquote{react}} che comunica con il backend, mostrando all\textquotesingle{}utente i dati del backend in una formato immediatamente comprensibile. \end{description} \section{Screenshots} \label{\detokenize{guide/about:screenshots}} \noindent\sphinxincludegraphics{{frontendDashboard}.png} \noindent\sphinxincludegraphics{{frontendRepositoryCreate}.png} \noindent\sphinxincludegraphics{{frontendAnalysis}.png} \noindent\sphinxincludegraphics{{frontendRepositoryShare}.png} \noindent\sphinxincludegraphics{{frontendAlertCreate}.png} \chapter{Installazione} \label{\detokenize{guide/installation:installazione}}\label{\detokenize{guide/installation::doc}} \sphinxAtStartPar Questa guida illustra come installare interamente N.E.S.T. su un server Linux. \section{Prerequisiti} \label{\detokenize{guide/installation:prerequisiti}} \sphinxAtStartPar Per installare ed eseguire N.E.S.T., è necessario: \begin{itemize} \item {} \sphinxAtStartPar Una connessione a Internet \item {} \sphinxAtStartPar Un sistema operativo Linux\sphinxhyphen{}based (preferibilmente \sphinxhref{https://wiki.archlinux.org/title/Main\_page}{Arch Linux}) \item {} \sphinxAtStartPar \sphinxhref{https://www.freedesktop.org/wiki/Software/systemd/}{SystemD \textasciicircum{}248.2} \item {} \sphinxAtStartPar \sphinxhref{https://httpd.apache.org/}{Apache HTTP Server \textasciicircum{}2.4.46} \item {} \sphinxAtStartPar \sphinxhref{https://www.postgresql.org/download/}{PostgreSQL \textasciicircum{}13.2} \item {} \sphinxAtStartPar \sphinxhref{https://git-scm.com/}{Git \textasciicircum{}2.31.1} \item {} \sphinxAtStartPar \sphinxhref{https://www.python.org/downloads/}{Python \textasciicircum{}3.8} \item {} \sphinxAtStartPar \sphinxhref{https://python-poetry.org/}{Poetry \textasciicircum{}1.0} \item {} \sphinxAtStartPar \sphinxhref{https://nodejs.org/}{NodeJS \textasciicircum{}16.0} \item {} \sphinxAtStartPar \sphinxhref{https://www.npmjs.com/}{npm \textasciicircum{}7.13.0} \item {} \sphinxAtStartPar Un mail server (interno o esterno) che supporti l\textquotesingle{}\sphinxhref{https://it.wikipedia.org/wiki/Simple\_Mail\_Transfer\_Protocol}{SMTP} \end{itemize} \section{Creare un nuovo utente} \label{\detokenize{guide/installation:creare-un-nuovo-utente}} \sphinxAtStartPar Per motivi di sicurezza, si suggerisce di creare un nuovo utente con il quale eseguire il progetto: \begin{sphinxadmonition}{note}{Nota:} \sphinxAtStartPar È necessario essere amministratori di sistema per eseguire i seguenti comandi. Si veda il manuale di \sphinxhref{https://linux.die.net/man/8/useradd}{useradd} per più dettagli. \end{sphinxadmonition} \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{g+gp}{root:\PYGZti{}\PYGZsh{} }mkdir \PYGZhy{}\PYGZhy{}parents /srv/nest \PYG{g+gp}{root:\PYGZti{}\PYGZsh{} }useradd \PYGZhy{}\PYGZhy{}home\PYGZhy{}dir /srv/nest \PYGZhy{}\PYGZhy{}shell /bin/bash nest \PYG{g+gp}{root:\PYGZti{}\PYGZsh{} }chown \PYGZhy{}\PYGZhy{}recursive nest: /srv/nest \end{sphinxVerbatim} \section{Scaricare il codice sorgente} \label{\detokenize{guide/installation:scaricare-il-codice-sorgente}} \sphinxAtStartPar Per installare N.E.S.T., è necessario avere il codice sorgente disponibile sul server. \sphinxAtStartPar Si consiglia di scaricarlo tramite \sphinxstyleemphasis{Git}: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{g+gp}{nest:\PYGZti{}\PYGZdl{} }git clone https://gitlab.steffo.eu/nest/g2\PYGZhy{}progetto.git \end{sphinxVerbatim} \sphinxAtStartPar Questo creerà una nuova cartella \sphinxcode{\sphinxupquote{g2\sphinxhyphen{}progetto}} nella directory in cui è stato eseguito il comando. \sphinxAtStartPar Per proseguire, sarà necessario entrarvi: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{g+gp}{nest:\PYGZti{}\PYGZdl{} }\PYG{n+nb}{cd} g2\PYGZhy{}progetto \end{sphinxVerbatim} \section{Creare il database} \label{\detokenize{guide/installation:creare-il-database}} \sphinxAtStartPar N.E.S.T. necessita di un database PostgreSQL in cui salvare i dati. \sphinxAtStartPar Per motivi di sicurezza, si suggerisce di creare un ruolo isolato dal resto del DBMS apposta per N.E.S.T.: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{g+gp}{postgres:\PYGZti{}\PYGZdl{} }createuser nest \end{sphinxVerbatim} \sphinxAtStartPar Per creare il database PostgreSQL, si esegua: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{g+gp}{postgres:\PYGZti{}\PYGZdl{} }createdb \PYGZhy{}\PYGZhy{}owner\PYG{o}{=}nest nest \end{sphinxVerbatim} \section{Creare un file di configurazione per il backend} \label{\detokenize{guide/installation:creare-un-file-di-configurazione-per-il-backend}} \sphinxAtStartPar Il backend usa un file di configurazione per impostare alcune variabili. \sphinxAtStartPar Si crei un nuovo file nella working directory del progetto denominato \sphinxcode{\sphinxupquote{config.py}}: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{g+gp}{nest:\PYGZti{}/g2\PYGZhy{}progetto\PYGZdl{} }vim config.py \end{sphinxVerbatim} \sphinxAtStartPar Il file dovrà avere i seguenti contenuti: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{c+c1}{\PYGZsh{} Una stringa rappresentante il database da utilizzare} \PYG{c+c1}{\PYGZsh{} Per maggiori informazioni sulla sintassi, si veda https://docs.sqlalchemy.org/en/14/core/engines.html} \PYG{n}{SQLALCHEMY\PYGZus{}DATABASE\PYGZus{}URI} \PYG{o}{=} \PYG{l+s+s2}{\PYGZdq{}}\PYG{l+s+s2}{postgresql://nest@/nest}\PYG{l+s+s2}{\PYGZdq{}} \PYG{c+c1}{\PYGZsh{} Una stringa casuale utilizzata per generare i JSON Web Token (JWT)} \PYG{c+c1}{\PYGZsh{} Va mantenuta segreta e costante per tutta l\PYGZsq{}operazione del backend!} \PYG{c+c1}{\PYGZsh{} Si suggerisce di premere tasti casuali sulla tastiera finchè la riga non è piena.} \PYG{n}{SECRET\PYGZus{}KEY} \PYG{o}{=} \PYG{l+s+s2}{\PYGZdq{}}\PYG{l+s+s2}{dsjiofgvinmodfiojvbnio3erfnoiweraqugu43ghjwrevniuwerng43iugnreuwignhritmj43i43nb8i42ug0wevkwovmwigtjj}\PYG{l+s+s2}{\PYGZdq{}} \end{sphinxVerbatim} \section{Installare le dipendenze Python} \label{\detokenize{guide/installation:installare-le-dipendenze-python}} \sphinxAtStartPar Le dipendenze Python sono gestite da \sphinxstyleemphasis{Poetry}, e possono essere installate con: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{g+gp}{nest:\PYGZti{}/g2\PYGZhy{}progetto\PYGZdl{} }poetry install \end{sphinxVerbatim} \sphinxAtStartPar Poetry creerà automaticamente un \sphinxhref{https://docs.python.org/3/library/venv.html}{venv} e vi installerà all\textquotesingle{}interno tutti i pacchetti necessari all\textquotesingle{}esecuzione del backend e del crawler di N.E.S.T. . \sphinxAtStartPar \sphinxstylestrong{Si suggerisce di ricordare il nome del venv creato da Poetry}, in quanto sarà necessario per {\hyperref[\detokenize{guide/installation:creare-un-servizio-systemd-per-il-backend}]{\sphinxcrossref{\DUrole{std,std-ref}{Creare un servizio SystemD per il backend}}}}: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{g+go}{Creating virtualenv nest\PYGZhy{}7C2fm2VD\PYGZhy{}py3.9 in /srv/nest/.cache/pypoetry/virtualenvs} \end{sphinxVerbatim} \section{Installare le dipendenze NodeJS} \label{\detokenize{guide/installation:installare-le-dipendenze-nodejs}} \sphinxAtStartPar Le dipendenze NodeJS sono gestite da \sphinxstyleemphasis{npm}, e possono essere installate con: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{g+gp}{nest:\PYGZti{}/g2\PYGZhy{}progetto\PYGZdl{} }npm install \end{sphinxVerbatim} \sphinxAtStartPar npm creerà automaticamente una cartella \sphinxhref{https://docs.npmjs.com/cli/v7/configuring-npm/folders\#node-modules}{node\_modules} e vi installerà all\textquotesingle{}interno tutte le librerie necessarie all\textquotesingle{}esecuzione del frontend di N.E.S.T. . \section{Creare un servizio SystemD per il backend} \label{\detokenize{guide/installation:creare-un-servizio-systemd-per-il-backend}} \sphinxAtStartPar Per fare in modo che il backend rimanga attivo in background, anche dopo un riavvio, si suggerisce di installarlo come servizio di sistema di \sphinxstyleemphasis{SystemD}: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{g+gp}{root:\PYGZti{}\PYGZsh{} }systemctl edit \PYGZhy{}\PYGZhy{}force \PYGZhy{}\PYGZhy{}full nest\PYGZhy{}backend \end{sphinxVerbatim} \sphinxAtStartPar Inserire all\textquotesingle{}interno del file le seguenti direttive: \begin{sphinxVerbatim}[commandchars=\\\{\}] [Unit] Description=N.E.S.T. Backend Wants=network\PYGZhy{}online.target postgresql.service After=network\PYGZhy{}online.target nss\PYGZhy{}lookup.target postgresql.service [Service] Type=exec User=nest Group=nest WorkingDirectory=/srv/nest/g2\PYGZhy{}progetto \PYGZsh{} Si sostituisca a questo il percorso del virtualenv creato in precedenza da Poetry \PYGZsh{} ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ExecStart=/srv/nest/.cache/pypoetry/virtualenvs/nest\PYGZhy{}7C2fm2VD\PYGZhy{}py3.9/bin/python \PYGZhy{}m gunicorn \PYGZhy{}b 127.0.0.1:30040 \PYGZhy{}\PYGZhy{}env=\PYGZdq{}FLASK\PYGZus{}CONFIG=../config.py\PYGZdq{} nest\PYGZus{}backend.app:rp\PYGZus{}app [Install] WantedBy=multi\PYGZhy{}user.target \end{sphinxVerbatim} \sphinxAtStartPar Ora, si verifichi che il servizio si avvii correttamente eseguendolo manualmente con: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{g+gp}{root:\PYGZti{}\PYGZsh{} }systemctl start nest\PYGZhy{}backend \end{sphinxVerbatim} \sphinxAtStartPar In caso di successo, l\textquotesingle{}API dovrebbe essere esposto sulla porta \sphinxcode{\sphinxupquote{30040}} dell\textquotesingle{}indirizzo di loopback \sphinxcode{\sphinxupquote{127.0.0.1}}: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{g+gp}{root:\PYGZti{}\PYGZsh{} }curl \PYG{l+m}{127}.0.0.1:30040/doa \PYG{g+go}{If you see this, the server is fine.} \end{sphinxVerbatim} \sphinxAtStartPar Si abiliti il servizio, in modo che venga automaticamente avviato al riavvio del sistema: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{g+gp}{root:\PYGZti{}\PYGZsh{} }systemctl \PYG{n+nb}{enable} nest\PYGZhy{}backend \end{sphinxVerbatim} \section{Compilare il frontend} \label{\detokenize{guide/installation:compilare-il-frontend}} \sphinxAtStartPar Perchè sia possibile servire il frontend agli utenti, è necessario prima crearne una versione compilata ottimizzata. \sphinxAtStartPar È possibile farlo con il comando: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{g+gp}{nest:\PYGZti{}/g2\PYGZhy{}progetto\PYGZdl{} }npm run build \end{sphinxVerbatim} \sphinxAtStartPar Verrà creata una cartella \sphinxcode{\sphinxupquote{build}} con all\textquotesingle{}interno la versione compilata. \section{Creare un servizio SystemD per il frontend} \label{\detokenize{guide/installation:creare-un-servizio-systemd-per-il-frontend}} \sphinxAtStartPar Per rendere disponibile alla rete la copia locale del frontend, si suggerisce di avviare lo script npm \sphinxcode{\sphinxupquote{serve}} integrato con N.E.S.T. come un servizio di sistema di \sphinxstyleemphasis{SystemD}: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{g+gp}{root:\PYGZti{}\PYGZsh{} }systemctl edit \PYGZhy{}\PYGZhy{}force \PYGZhy{}\PYGZhy{}full nest\PYGZhy{}frontend \end{sphinxVerbatim} \sphinxAtStartPar Inserire all\textquotesingle{}interno del file le seguenti direttive: \begin{sphinxVerbatim}[commandchars=\\\{\}] [Unit] Description=N.E.S.T. Frontend Wants=network\PYGZhy{}online.target nest\PYGZhy{}backend.service After=network\PYGZhy{}online.target nss\PYGZhy{}lookup.target nest\PYGZhy{}backend.service [Service] Type=exec Environment=NODE\PYGZus{}ENV=production User=nest Group=nest WorkingDirectory=/srv/nest/g2\PYGZhy{}progetto ExecStart=/usr/bin/npm run serve [Install] WantedBy=multi\PYGZhy{}user.target \end{sphinxVerbatim} \begin{sphinxadmonition}{warning}{Avvertimento:} \sphinxAtStartPar Questo file non è stato testato, in quanto sul server demo è in uso una versione più complessa che usa \sphinxhref{https://github.com/nvm-sh/nvm}{nvm} per gestire più versioni di NodeJS sullo stesso sistema. \sphinxAtStartPar La versione in uso sul server demo è: \begin{sphinxVerbatim}[commandchars=\\\{\}] [Unit] Description=N.E.S.T. Frontend Wants=network\PYGZhy{}online.target nest\PYGZhy{}backend.service After=network\PYGZhy{}online.target nss\PYGZhy{}lookup.target nest\PYGZhy{}backend.service [Service] Type=exec Environment=NODE\PYGZus{}ENV=production Environment=NODE\PYGZus{}VERSION=16 User=nest Group=nest WorkingDirectory=/srv/nest/g2\PYGZhy{}progetto ExecStart=/srv/nest/.nvm/nvm\PYGZhy{}exec npm run serve [Install] WantedBy=multi\PYGZhy{}user.target \end{sphinxVerbatim} \end{sphinxadmonition} \sphinxAtStartPar Ora, si verifichi che il servizio si avvii correttamente eseguendolo manualmente con: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{g+gp}{root:\PYGZti{}\PYGZsh{} }systemctl start nest\PYGZhy{}frontend \end{sphinxVerbatim} \sphinxAtStartPar In caso di successo, il frontend dovrebbe essere esposto sulla porta \sphinxcode{\sphinxupquote{30041}} dell\textquotesingle{}indirizzo di loopback \sphinxcode{\sphinxupquote{127.0.0.1}}: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{g+gp}{root:\PYGZti{}\PYGZsh{} }curl \PYG{l+m}{127}.0.0.1:30041 \PYG{g+go}{[...]} \end{sphinxVerbatim} \sphinxAtStartPar Si abiliti il servizio, in modo che venga automaticamente avviato al riavvio del sistema: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{g+gp}{root:\PYGZti{}\PYGZsh{} }systemctl \PYG{n+nb}{enable} nest\PYGZhy{}frontend \end{sphinxVerbatim} \section{Creare un servizio SystemD per il crawler} \label{\detokenize{guide/installation:creare-un-servizio-systemd-per-il-crawler}} \sphinxAtStartPar Perchè i repository vengano popolati di Tweet, è necessario configurare il crawler come servizio di \sphinxstyleemphasis{SystemD}: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{g+gp}{root:\PYGZti{}\PYGZsh{} }systemctl edit \PYGZhy{}\PYGZhy{}force \PYGZhy{}\PYGZhy{}full nest\PYGZhy{}crawler \end{sphinxVerbatim} \sphinxAtStartPar All\textquotesingle{}interno del file, inserire le seguenti direttive: \begin{sphinxVerbatim}[commandchars=\\\{\}] [Unit] Description=N.E.S.T. Crawler Wants=network\PYGZhy{}online.target nest\PYGZhy{}backend.service After=network\PYGZhy{}online.target nss\PYGZhy{}lookup.target nest\PYGZhy{}backend.service [Service] Type=exec Environment=FLASK\PYGZus{}CONFIG=../config.py User=nest Group=nest WorkingDirectory=/srv/nest/g2\PYGZhy{}progetto \PYGZsh{} Si sostituisca a questo il percorso del virtualenv creato in precedenza da Poetry \PYGZsh{} ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ExecStart=/srv/nest/.cache/pypoetry/virtualenvs/nest\PYGZhy{}7C2fm2VD\PYGZhy{}py3.9/bin/python \PYGZhy{}m nest\PYGZus{}crawler [Install] WantedBy=multi\PYGZhy{}user.target \end{sphinxVerbatim} \section{Configurare il crawler} \label{\detokenize{guide/installation:configurare-il-crawler}} \begin{sphinxadmonition}{note}{Nota:} \sphinxAtStartPar Per utilizzare gli API di Twitter, è necessario essere approvati dal supporto tecnico di Twitter. \sphinxAtStartPar È dunque necessario \sphinxhref{https://developer.twitter.com/en/apply-for-access}{fare richiesta}, e sarà possibile procedere con l\textquotesingle{}installazione solo una volta ricevute le credenziali per l\textquotesingle{}utilizzo. \end{sphinxadmonition} \sphinxAtStartPar Per impostare le variabili di ambiente richieste dal crawler, si suggerisce di creare un \sphinxstyleemphasis{file di override} di SystemD: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{g+gp}{root:\PYGZti{}\PYGZsh{} }systemctl edit nest\PYGZhy{}crawler \end{sphinxVerbatim} \sphinxAtStartPar All\textquotesingle{}interno del file, inserire le seguenti direttive: \begin{sphinxVerbatim}[commandchars=\\\{\}] [Service] \PYGZsh{} Sostituire a questi caratteri la Consumer Key ricevuta da Twitter \PYGZsh{} ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ Environment=C\PYGZus{}K=0000000000000000000000000 \PYGZsh{} Sostituire a questi caratteri il Consumer Secret ricevuto da Twitter \PYGZsh{} ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ Environment=C\PYGZus{}S=00000000000000000000000000000000000000000000000000 \PYGZsh{} Sostituire a questi caratteri l\PYGZsq{}Access Token ricevuto da Twitter \PYGZsh{} ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ Environment=A\PYGZus{}T=00000000000000000000000000000000000000000000000000 \PYGZsh{} Sostituire a questi caratteri l\PYGZsq{}Access Token Secret ricevuto da Twitter \PYGZsh{} ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ Environment=A\PYGZus{}T\PYGZus{}S=000000000000000000000000000000000000000000000 \PYGZsh{} Sostituire con l\PYGZsq{}indirizzo del proprio SMTP mail server \PYGZsh{} ↓↓↓↓↓↓↓↓↓↓↓↓↓↓ Environment=SMTP\PYGZus{}HOST=mail.gandi.net \PYGZsh{} Sostituire con le proprie credenziali dell\PYGZsq{}SMTP mail server \PYGZsh{} ↓↓↓↓↓↓↓↓↓↓↓↓ Environment=SMTP\PYGZus{}USERNAME=bot@ryg.one \PYGZsh{} ↓↓↓↓↓↓↓↓ Environment=SMTP\PYGZus{}PASSWORD=password \PYGZsh{} Sostituire con l\PYGZsq{}email da cui si desidera che vengano inviate le allerte \PYGZsh{} ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ Environment=SMTP\PYGZus{}FROM\PYGZus{}EMAIL=nest\PYGZhy{}bot@ryg.one \end{sphinxVerbatim} \sphinxAtStartPar Ora, si verifichi che il servizio si avvii correttamente eseguendolo manualmente con: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{g+gp}{root:\PYGZti{}\PYGZsh{} }systemctl start nest\PYGZhy{}crawler \end{sphinxVerbatim} \sphinxAtStartPar Nel log di sistema non dovrebbe comparire nessun errore: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{g+gp}{root:\PYGZti{}\PYGZsh{} }journalctl nest\PYGZhy{}crawler \end{sphinxVerbatim} \section{Creare un timer SystemD per il crawler} \label{\detokenize{guide/installation:creare-un-timer-systemd-per-il-crawler}} \sphinxAtStartPar Per fare in modo che il crawler venga eseguito periodicamente, si suggerisce di configurare un timer SystemD: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{g+gp}{root:\PYGZti{}\PYGZsh{} }systemctl edit \PYGZhy{}\PYGZhy{}force \PYGZhy{}\PYGZhy{}full nest\PYGZhy{}crawler.timer \end{sphinxVerbatim} \sphinxAtStartPar Si inseriscano all\textquotesingle{}interno del file le seguenti direttive: \begin{sphinxVerbatim}[commandchars=\\\{\}] [Unit] Description=Run nest\PYGZhy{}crawler every 60 minutes [Timer] OnBootSec=60min OnUnitActiveSec=60min Unit=nest\PYGZhy{}crawler.service [Install] WantedBy=timers.target \end{sphinxVerbatim} \sphinxAtStartPar Ora, si verifichi che il timer si avvii correttamente eseguendolo manualmente con: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{g+gp}{root:\PYGZti{}\PYGZsh{} }systemctl start nest\PYGZhy{}crawler.timer \end{sphinxVerbatim} \sphinxAtStartPar Nello stato del timer non dovrebbe comparire nessun errore: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{g+gp}{root:\PYGZti{}\PYGZsh{} }systemctl status nest\PYGZhy{}crawler.timer \end{sphinxVerbatim} \sphinxAtStartPar Si abiliti il timer, in modo che venga automaticamente avviato al riavvio del sistema: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{g+gp}{root:\PYGZti{}\PYGZsh{} }systemctl \PYG{n+nb}{enable} nest\PYGZhy{}crawler.timer \end{sphinxVerbatim} \section{Configurare Apache come reverse proxy} \label{\detokenize{guide/installation:configurare-apache-come-reverse-proxy}} \sphinxAtStartPar Per rendere l\textquotesingle{}API e il frontend disponibili al pubblico, si suggerisce di configurare Apache HTTP Server come reverse proxy. \sphinxAtStartPar La configurazione di Apache varia molto da distribuzione a distribuzione Linux, e talvolta anche da server a server; pertanto, si fornisce solamente un file \sphinxhref{https://httpd.apache.org/docs/2.4/vhosts/examples.html}{VirtualHost} di esempio da adattare al proprio setup: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{n+nt}{\PYGZlt{}VirtualHost} \PYG{l+s}{*:80}\PYG{n+nt}{\PYGZgt{}} \PYG{n+nb}{ServerName} \PYG{l+s+s2}{\PYGZdq{}api.nest.steffo.eu\PYGZdq{}} \PYG{n+nb}{ServerName} \PYG{l+s+s2}{\PYGZdq{}prod.nest.steffo.eu\PYGZdq{}} \PYG{n+nb}{RewriteEngine} \PYG{k}{On} \PYG{n+nb}{RewriteRule} \PYGZca{}(.*)\PYGZdl{} https://\PYGZpc{}\PYGZob{}HTTP\PYGZus{}HOST\PYGZcb{}\PYGZdl{}1 [R=301,L] \PYG{n+nt}{\PYGZlt{}/VirtualHost}\PYG{n+nt}{\PYGZgt{}} \PYG{n+nt}{\PYGZlt{}VirtualHost} \PYG{l+s}{*:443}\PYG{n+nt}{\PYGZgt{}} \PYG{n+nb}{ServerName} \PYG{l+s+s2}{\PYGZdq{}api.nest.steffo.eu\PYGZdq{}} \PYG{n+nb}{SSLEngine} \PYG{k}{on} \PYG{n+nb}{SSLCertificateFile} \PYG{l+s+s2}{\PYGZdq{}/root/.acme.sh/*.nest.steffo.eu/fullchain.cer\PYGZdq{}} \PYG{n+nb}{SSLCertificateKeyFile} \PYG{l+s+s2}{\PYGZdq{}/root/.acme.sh/*.nest.steffo.eu/*.nest.steffo.eu.key\PYGZdq{}} \PYG{n+nb}{ProxyPass} \PYG{l+s+s2}{\PYGZdq{}/\PYGZdq{}} \PYG{l+s+s2}{\PYGZdq{}http://127.0.0.1:30040/\PYGZdq{}} \PYG{n+nb}{ProxyPassReverse} \PYG{l+s+s2}{\PYGZdq{}/\PYGZdq{}} \PYG{l+s+s2}{\PYGZdq{}http://127.0.0.1:30040/\PYGZdq{}} \PYG{n+nb}{RequestHeader} set \PYG{l+s+s2}{\PYGZdq{}X\PYGZhy{}Forwarded\PYGZhy{}Proto\PYGZdq{}} expr=\PYGZpc{}\PYGZob{}REQUEST\PYGZus{}SCHEME\PYGZcb{} \PYG{n+nb}{Protocols} h2 http/1.1 \PYG{n+nb}{Header} always set Strict\PYGZhy{}Transport\PYGZhy{}Security \PYG{l+s+s2}{\PYGZdq{}max\PYGZhy{}age=63072000\PYGZdq{}} \PYG{n+nt}{\PYGZlt{}/VirtualHost}\PYG{n+nt}{\PYGZgt{}} \PYG{n+nt}{\PYGZlt{}VirtualHost} \PYG{l+s}{*:443}\PYG{n+nt}{\PYGZgt{}} \PYG{n+nb}{ServerName} \PYG{l+s+s2}{\PYGZdq{}prod.nest.steffo.eu\PYGZdq{}} \PYG{n+nb}{SSLEngine} \PYG{k}{on} \PYG{n+nb}{SSLCertificateFile} \PYG{l+s+s2}{\PYGZdq{}/root/.acme.sh/*.nest.steffo.eu/fullchain.cer\PYGZdq{}} \PYG{n+nb}{SSLCertificateKeyFile} \PYG{l+s+s2}{\PYGZdq{}/root/.acme.sh/*.nest.steffo.eu/*.nest.steffo.eu.key\PYGZdq{}} \PYG{n+nb}{ProxyPass} \PYG{l+s+s2}{\PYGZdq{}/\PYGZdq{}} \PYG{l+s+s2}{\PYGZdq{}http://127.0.0.1:30041/\PYGZdq{}} \PYG{n+nb}{ProxyPassReverse} \PYG{l+s+s2}{\PYGZdq{}/\PYGZdq{}} \PYG{l+s+s2}{\PYGZdq{}http://127.0.0.1:30041/\PYGZdq{}} \PYG{n+nb}{RequestHeader} set \PYG{l+s+s2}{\PYGZdq{}X\PYGZhy{}Forwarded\PYGZhy{}Proto\PYGZdq{}} expr=\PYGZpc{}\PYGZob{}REQUEST\PYGZus{}SCHEME\PYGZcb{} \PYG{n+nb}{Protocols} h2 http/1.1 \PYG{n+nb}{Header} always set Strict\PYGZhy{}Transport\PYGZhy{}Security \PYG{l+s+s2}{\PYGZdq{}max\PYGZhy{}age=63072000\PYGZdq{}} \PYG{n+nt}{\PYGZlt{}/VirtualHost}\PYG{n+nt}{\PYGZgt{}} \end{sphinxVerbatim} \chapter{Aggiornamento} \label{\detokenize{guide/updating:aggiornamento}}\label{\detokenize{guide/updating::doc}} \sphinxAtStartPar Per scaricare gli aggiornamenti di N.E.S.T. si esegua il seguente comando nella directory del codice sorgente: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{g+gp}{nest:g2\PYGZhy{}progetto\PYGZdl{} }git pull \end{sphinxVerbatim} \sphinxAtStartPar Si aggiornino poi tutte le dipendenze: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{g+gp}{nest:g2\PYGZhy{}progetto\PYGZdl{} }poetry install \PYG{g+gp}{nest:g2\PYGZhy{}progetto\PYGZdl{} }npm install \end{sphinxVerbatim} \sphinxAtStartPar Si ricompili il frontend: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{g+gp}{nest:g2\PYGZhy{}progetto\PYGZdl{} }npm build \end{sphinxVerbatim} \sphinxAtStartPar In seguito, si riavviino tutti i servizi di N.E.S.T.: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{g+gp}{root:\PYGZti{}\PYGZsh{} }systemctl restart nest\PYGZhy{}frontend nest\PYGZhy{}backend nest\PYGZhy{}crawler nest\PYGZhy{}crawler.timer \end{sphinxVerbatim} \sphinxAtStartPar Si verifichi infine il corretto avvio di tutti i servizi: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{g+gp}{root:\PYGZti{}\PYGZsh{} }systemctl status nest\PYGZhy{}frontend nest\PYGZhy{}backend nest\PYGZhy{}crawler nest\PYGZhy{}crawler.timer \end{sphinxVerbatim} \chapter{Introduzione} \label{\detokenize{development/goals:introduzione}}\label{\detokenize{development/goals::doc}} \section{Obiettivo} \label{\detokenize{development/goals:obiettivo}} \sphinxAtStartPar L\textquotesingle{}obiettivo del progetto è la creazione di un software per fornire l\textquotesingle{}aggregazione e l\textquotesingle{}analisi di \sphinxhref{https://help.twitter.com/it/using-twitter\#tweets}{Tweet}, in modo da rilevare eventi \sphinxstyleemphasis{macroscopici}, \sphinxstyleemphasis{locali} o più semplicemente filtrarli in base a delle \sphinxstyleemphasis{keyword}. \sphinxAtStartPar Il prodotto sarà utilizzato dal cliente e da un piccolo gruppo di suoi dipendenti per effettuare ricerche statistiche. \sphinxAtStartPar Il software andrà ad integrarsi direttamente con \sphinxhref{https://twitter.com/}{Twitter}, da cui verranno raccolti dati e su cui verranno pubblicate allerte su di essi. \section{Campo di applicazione} \label{\detokenize{development/goals:campo-di-applicazione}} \sphinxAtStartPar Il software trova utilizzo principalmente in \sphinxstylestrong{ambito statistico}, essendo il suo scopo quello di raccogliere dati e permettere di analizzarli tramite un\textquotesingle{}interfaccia grafica. \section{Caratteristiche degli utenti} \label{\detokenize{development/goals:caratteristiche-degli-utenti}} \sphinxAtStartPar Il software potrà essere utilizzato da utenti con una discreta esperienza nell\textquotesingle{}analisi di dati ma senza particolari conoscenze informatiche. \section{Glossario} \label{\detokenize{development/goals:glossario}}\begin{description} \item[{Repository}] \leavevmode \sphinxAtStartPar Raccolta di tweet che soddisfano determinate condizioni. \item[{Condizione}] \leavevmode \sphinxAtStartPar Predicato logico che deve essere soddisfatto da un tweet per essere raccolto in fase di raccolta dati, o per essere contato in fase di allertamento utente. \item[{Filtro}] \leavevmode \sphinxAtStartPar Predicato logico che deve essere soddisfatto da un tweet per essere visualizzato in fase di analisi dati. \item[{Allarme}] \leavevmode \sphinxAtStartPar Notifica inviata all\textquotesingle{}utente attraverso un mezzo telematico, come email oppure un tweet. \item[{Utente}] \leavevmode \sphinxAtStartPar Utilizzatore del software con un proprio account creato dall\textquotesingle{}amministratore della piattaforma. \sphinxAtStartPar In particolare, la piattaforma prevederà due tipologie di utenti: \begin{description} \item[{Utente regolare}] \leavevmode \sphinxAtStartPar Potranno eseguire attività di creazione, analisi, condivisione, archiviazione ed eliminazione dei propri repository. \item[{Utente amministratore}] \leavevmode \sphinxAtStartPar Potrà effettuare tutte le attività dell\textquotesingle{}utente regolare, e in aggiunta potrà creare ed eliminare nuovi utenti regolari. \end{description} \end{description} \section{Macro\sphinxhyphen{}funzionalità} \label{\detokenize{development/goals:macro-funzionalita}} \sphinxAtStartPar Il software permetterà di selezionare \sphinxstylestrong{condizioni} con cui scegliere quali tweet raccogliere: \begin{itemize} \item {} \sphinxAtStartPar in base ai loro \sphinxhref{https://help.twitter.com/it/using-twitter/how-to-use-hashtags}{hashtag} \item {} \sphinxAtStartPar in base al loro autore \item {} \sphinxAtStartPar in base alla loro \sphinxhref{https://help.twitter.com/en/safety-and-security/tweet-location-settings}{posizione geografica} (ove presente) \item {} \sphinxAtStartPar in base alla loro data di pubblicazione \end{itemize} \sphinxAtStartPar Selezionate le condizioni, l\textquotesingle{}utente potrà creare una \sphinxstylestrong{repository}: una cartella in cui verranno raccolti i tweet soddisfacenti le condizioni richieste. \sphinxAtStartPar Una volta raccolti, i tweet di una repository potranno essere \sphinxstylestrong{analizzati} in qualsiasi momento: durante l\textquotesingle{}analisi, saranno mostrate statistiche e grafici relativi ai tweet. \sphinxAtStartPar La raccolta potrà essere interrotta in qualsiasi momento \sphinxstylestrong{archiviando} il repository. \sphinxAtStartPar Sarà possibile \sphinxstylestrong{condividere} una repository con altri utenti della piattaforma, permettendo loro di analizzarla. \sphinxAtStartPar Infine, l\textquotesingle{}utente potrà configurare una repository in modo che gli invii una \sphinxstylestrong{allerta} qualora vengano raccolti un dato numero di tweet in una certa \sphinxstyleemphasis{finestra temporale}. \section{Casi d\textquotesingle{}uso} \label{\detokenize{development/goals:casi-d-uso}} \sphinxAtStartPar N.E.S.T. prevede tre tipologie di \sphinxstyleemphasis{agenti} ("utenti" UML): \sphinxstylestrong{utente}, \sphinxstylestrong{amministratore} e \sphinxstylestrong{sistema}. \noindent\sphinxincludegraphics{{Utenti}.png} \sphinxAtStartPar I principali casi d’uso individuati durante la progettazione di N.E.S.T. sono: \begin{itemize} \item {} \sphinxAtStartPar La gestione degli utenti da parte di un Amministratore: \noindent\sphinxincludegraphics[width=400\sphinxpxdimen]{{CasiUso1}.PNG} \item {} \sphinxAtStartPar La gestione del login da parte di un Utente: \noindent\sphinxincludegraphics[width=400\sphinxpxdimen]{{CasiUso2}.PNG} \item {} \sphinxAtStartPar La gestione delle Allerte sia dal punto di vista dell’Utente che del Sistema: \noindent\sphinxincludegraphics[width=800\sphinxpxdimen]{{CasiUso3}.PNG} \item {} \sphinxAtStartPar La gestione della raccolta da parte dell\textquotesingle{}utente: \noindent\sphinxincludegraphics[width=400\sphinxpxdimen]{{CasiUso4}.PNG} \item {} \sphinxAtStartPar La gestione di un repository da parte dell\textquotesingle{}utente: \noindent\sphinxincludegraphics[width=400\sphinxpxdimen]{{CasiUso5}.PNG} \item {} \sphinxAtStartPar La visualizzazione di un repository: \noindent\sphinxincludegraphics[width=400\sphinxpxdimen]{{CasiUso6}.PNG} \end{itemize} \section{Backlog generale} \label{\detokenize{development/goals:backlog-generale}} \sphinxAtStartPar Si riporta qui di seguito il Backlog definito ad inizio progetto, prima dell’avvio dello sviluppo. Gli elementi dal bordo grigio sono le epiche: \begin{sphinxadmonition}{note}{Nota:} \sphinxAtStartPar Alcune user story sono state rimosse in seguito al feedback ricevuto durante il primo sprint! \end{sphinxadmonition} \noindent\sphinxincludegraphics{{Backlog1}.PNG} \noindent\sphinxincludegraphics{{Backlog2}.PNG} \noindent\sphinxincludegraphics{{Backlog3}.PNG} \noindent\sphinxincludegraphics{{Backlog4}.PNG} \noindent\sphinxincludegraphics{{Backlog5}.PNG} \chapter{Strumenti utilizzati} \label{\detokenize{development/tools:strumenti-utilizzati}}\label{\detokenize{development/tools::doc}} \sphinxAtStartPar Nello sviluppo di N.E.S.T. sono stati usati i seguenti strumenti software: \sphinxAtStartPar \sphinxhref{https://www.jetbrains.com/idea/}{IntelliJ IDEA Ultimate} \begin{quote} \sphinxAtStartPar IDE multilinguaggio utilizzato per lo sviluppo di tutte le parti di N.E.S.T., per la scrittura della documentazione, per l\textquotesingle{}esecuzione del testing e per la visualizzazione del coverage, per il refactoring automatico e per l\textquotesingle{}analisi statica del codice. \end{quote} \sphinxAtStartPar \sphinxhref{https://git-scm.com/}{Git} \begin{quote} \sphinxAtStartPar Software di controllo versione utilizzato per tracciare tutte le modifiche al software. \end{quote} \sphinxAtStartPar \sphinxhref{https://about.gitlab.com/}{GitLab} \begin{quote} \sphinxAtStartPar Applicazione web self\sphinxhyphen{}hosted per hosting di repository \sphinxhref{https://git-scm.com/}{Git}, utilizzato per ospitare il repository del progetto. \begin{sphinxadmonition}{hint}{Suggerimento:} \sphinxAtStartPar È accessibile al seguente indirizzo: \sphinxurl{https://gitlab.steffo.eu/} \end{sphinxadmonition} \end{quote} \sphinxAtStartPar \sphinxhref{https://www.taiga.io/}{Taiga} \begin{quote} \sphinxAtStartPar Applicazione web self\sphinxhyphen{}hosted per il Project Management, utilizzata per tracciare lo stato del progetto giorno per giorno. \begin{sphinxadmonition}{hint}{Suggerimento:} \sphinxAtStartPar È accessibile al seguente indirizzo: \sphinxurl{https://taiga.steffo.eu/} \end{sphinxadmonition} \end{quote} \sphinxAtStartPar \sphinxhref{https://www.sonarqube.org/}{SonarQube} \begin{quote} \sphinxAtStartPar Applicazione web self\sphinxhyphen{}hosted per l\textquotesingle{}analisi statica e visualizzazione del coverage del software, utilizzata per il miglioramento della qualità del codice del progetto. \begin{sphinxadmonition}{hint}{Suggerimento:} \sphinxAtStartPar È accessibile al seguente indirizzo: \sphinxurl{https://sonarqube.steffo.eu/} \end{sphinxadmonition} \end{quote} \sphinxAtStartPar \sphinxhref{https://www.figma.com/}{Figma} \begin{quote} \sphinxAtStartPar Applicazione web centralizzata per la creazione collaborativa di interfacce grafiche moderne. \end{quote} \sphinxAtStartPar \sphinxhref{https://discord.com/}{Discord} \begin{quote} \sphinxAtStartPar Piattaforma centralizzata di messaggistica istantanea e chiamate vocali utilizzata per la comunicazione sincrona tra i membri del team. \end{quote} \chapter{Processo di sviluppo} \label{\detokenize{development/process:processo-di-sviluppo}}\label{\detokenize{development/process::doc}} \section{Ruoli} \label{\detokenize{development/process:ruoli}} \sphinxAtStartPar Per lavorare più efficientemente, si è assegnato uno o più "ruoli" a ogni membro del team in base alle proprie competenze. \begin{quote}\begin{description} \item[{Stefano Goldoni}] \leavevmode \sphinxAtStartPar Product Owner, Tester \item[{Flavia Cocca}] \leavevmode \sphinxAtStartPar Scrum Master, UI Designer \item[{Chiara Calzolari}] \leavevmode \sphinxAtStartPar UI Designer, Translator \item[{Stefano Pigozzi}] \leavevmode \sphinxAtStartPar Frontend Developer, Sysadmin \item[{Giovanni Anniballi}] \leavevmode \sphinxAtStartPar Lead Tester \item[{Giorgio Minoccari}] \leavevmode \sphinxAtStartPar Analyst, Crawler Developer \item[{Lorenzo Balugani}] \leavevmode \sphinxAtStartPar Database Architect, Backend Developer \end{description}\end{quote} \sphinxAtStartPar Questi ruoli sono stati usati in maniera \sphinxstylestrong{flessibile}; è capitato infatti moltissime volte che un membro con un ruolo ne aiutasse un altro con un ruolo diverso: ad esempio, è successo che i Developer aiutassero i Tester indicando loro particolarità specifiche dei linguaggi di programmazione utilizzati, oppure che gli UI Designer aiutassero nella scrittura della documentazione. \section{Sprint} \label{\detokenize{development/process:sprint}} \sphinxAtStartPar Lo sviluppo si è svolto in \sphinxstylestrong{4 Sprint} dalla durata di \sphinxstylestrong{2 settimane ciascuno}. \subsection{Sprint 0: 04 Apr \sphinxhyphen{} 18 Apr} \label{\detokenize{development/sprint0/index:sprint-0-04-apr-18-apr}}\label{\detokenize{development/sprint0/index::doc}} \subsubsection{Consegna} \label{\detokenize{development/sprint0/index:consegna}} \sphinxAtStartPar La seguente documentazione è stata fornita dal cliente durante questo sprint: \begin{itemize} \item {} \sphinxAtStartPar \sphinxcode{\sphinxupquote{0\sphinxhyphen{}initial.pdf}} \item {} \sphinxAtStartPar \sphinxcode{\sphinxupquote{0\sphinxhyphen{}sprint\sphinxhyphen{}requirements.pdf}} \end{itemize} \subsubsection{Definition of Ready} \label{\detokenize{development/sprint0/index:definition-of-ready}} \sphinxAtStartPar Il team ha definito lo stato di Ready di una User Story in base ai seguenti criteri: \begin{itemize} \item {} \sphinxAtStartPar La User Story è stata compresa ed accettata da tutti i membri \item {} \sphinxAtStartPar I tester hanno confermato la possibilità di poterla testare \item {} \sphinxAtStartPar Il Product Owner ha la visione necessaria per definirne la priorità \item {} \sphinxAtStartPar Il Team è in grado di stimarla \item {} \sphinxAtStartPar La User Story è indipendente o dipendente da altre a priorità maggiore \end{itemize} \subsubsection{Definition of Done} \label{\detokenize{development/sprint0/index:definition-of-done}} \sphinxAtStartPar La definizione di Done è stata concordata da tutto il team con il Product Owner, ed è stata così definita: \begin{itemize} \item {} \sphinxAtStartPar Sviluppo completo della funzionalità richiesta \item {} \sphinxAtStartPar Definizione e superamento dei test \item {} \sphinxAtStartPar Bozza della documentazione della funzionalità \item {} \sphinxAtStartPar Merge dei sorgenti nel branch \sphinxcode{\sphinxupquote{main}} del repository Git \end{itemize} \subsubsection{Statistiche} \label{\detokenize{development/sprint0/index:statistiche}} \paragraph{Gitinspector} \label{\detokenize{development/sprint0/index:gitinspector}} \sphinxAtStartPar Questa statistica è stata generata dal prof. Marcello Missiroli con \sphinxhref{https://github.com/ejwa/gitinspector}{Gitinspector} al termine dello Sprint. \begin{itemize} \item {} \sphinxAtStartPar \sphinxcode{\sphinxupquote{0\sphinxhyphen{}stats.html}} \end{itemize} \subsubsection{Sprint Retrospective} \label{\detokenize{development/sprint0/index:sprint-retrospective}} \sphinxAtStartPar La Sprint Retrospective è disponibile al seguente link: \begin{itemize} \item {} \sphinxAtStartPar \sphinxcode{\sphinxupquote{0\sphinxhyphen{}retrospective.pdf}} \end{itemize} \subsubsection{Sprint Review} \label{\detokenize{development/sprint0/index:sprint-review}} \sphinxAtStartPar Il video di Sprint Review è disponibile al seguente link: \begin{itemize} \item {} \sphinxAtStartPar \sphinxurl{https://drive.google.com/file/d/12worWEcx-uf2UP4\_lnEOovHZpvR77MsG/view} \end{itemize} \subsubsection{Artefatti} \label{\detokenize{development/sprint0/index:artefatti}} \sphinxAtStartPar In questo sprint è stato realizzato un documento con i risultati dell\textquotesingle{}analisi effettuata per realizzare il software: \begin{itemize} \item {} \sphinxAtStartPar \sphinxcode{\sphinxupquote{0\sphinxhyphen{}result.pdf}} \end{itemize} \subsubsection{Registro attività} \label{\detokenize{development/sprint0/index:registro-attivita}} \paragraph{Riunioni collettive} \label{\detokenize{development/sprint0/index:riunioni-collettive}} \begin{savenotes}\sphinxattablestart \centering \begin{tabulary}{\linewidth}[t]{|T|T|T|T|} \hline \sphinxstyletheadfamily \sphinxAtStartPar Data &\sphinxstyletheadfamily \sphinxAtStartPar Ora &\sphinxstyletheadfamily \sphinxAtStartPar Durata &\sphinxstyletheadfamily \sphinxAtStartPar Attività \\ \hline\sphinxstyletheadfamily &\sphinxstyletheadfamily &\sphinxstyletheadfamily \sphinxAtStartPar 10h 6m &\sphinxstyletheadfamily \sphinxAtStartPar Totale \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}08 & \sphinxAtStartPar 20:45 & \sphinxAtStartPar 1h & \sphinxAtStartPar Analisi documento di specifiche \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}09 & \sphinxAtStartPar 14:15 & \sphinxAtStartPar 35m & \sphinxAtStartPar Intervista con il cliente \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}09 & \sphinxAtStartPar 15:00 & \sphinxAtStartPar 1h & \sphinxAtStartPar Resoconto intervista \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}11 & \sphinxAtStartPar 15:03 & \sphinxAtStartPar 2h 39m & \sphinxAtStartPar Documentazione e planning poker \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}15 & \sphinxAtStartPar 18:15 & \sphinxAtStartPar 52m & \sphinxAtStartPar Documentazione \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}17 & \sphinxAtStartPar 15:05 & \sphinxAtStartPar 4h & \sphinxAtStartPar Documentazione e partita a Scrumble \\ \hline \end{tabulary} \par \sphinxattableend\end{savenotes} \paragraph{Attività individuali} \label{\detokenize{development/sprint0/index:attivita-individuali}} \begin{sphinxadmonition}{hint}{Suggerimento:} \sphinxAtStartPar Per vedere più in dettaglio il lavoro di sviluppo effettuato da ogni membro del gruppo, si suggerisce di visualizzare il log di Git: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{g+gp}{\PYGZdl{} }git log \end{sphinxVerbatim} \end{sphinxadmonition} \subparagraph{Stefano Goldoni} \label{\detokenize{development/sprint0/index:stefano-goldoni}} \begin{savenotes}\sphinxattablestart \centering \begin{tabulary}{\linewidth}[t]{|T|T|T|} \hline \sphinxstyletheadfamily \sphinxAtStartPar Data &\sphinxstyletheadfamily \sphinxAtStartPar Durata &\sphinxstyletheadfamily \sphinxAtStartPar Attività \\ \hline\sphinxstyletheadfamily &\sphinxstyletheadfamily \sphinxAtStartPar 6h 30m &\sphinxstyletheadfamily \sphinxAtStartPar Totale \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}08 & \sphinxAtStartPar 1h & \sphinxAtStartPar user stories \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}09 & \sphinxAtStartPar 1h & \sphinxAtStartPar epic \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}10 & \sphinxAtStartPar 30m & \sphinxAtStartPar use cases \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}11 & \sphinxAtStartPar 30m & \sphinxAtStartPar use cases \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}14 & \sphinxAtStartPar 30m & \sphinxAtStartPar documentazione SRS \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}15 & \sphinxAtStartPar 30m & \sphinxAtStartPar documentazione SRS \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}17 & \sphinxAtStartPar 1h 30m & \sphinxAtStartPar diagrammi di attività \\ \hline \end{tabulary} \par \sphinxattableend\end{savenotes} \subparagraph{Flavia Cocca} \label{\detokenize{development/sprint0/index:flavia-cocca}} \begin{savenotes}\sphinxattablestart \centering \begin{tabulary}{\linewidth}[t]{|T|T|T|} \hline \sphinxstyletheadfamily \sphinxAtStartPar Data &\sphinxstyletheadfamily \sphinxAtStartPar Durata &\sphinxstyletheadfamily \sphinxAtStartPar Attività \\ \hline\sphinxstyletheadfamily &\sphinxstyletheadfamily \sphinxAtStartPar 15h &\sphinxstyletheadfamily \sphinxAtStartPar Totale \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}08 & \sphinxAtStartPar 2h 30m & \sphinxAtStartPar brainstorming Ui \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}10 & \sphinxAtStartPar 2h & \sphinxAtStartPar creazione frame in figma con relativo css \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}11 & \sphinxAtStartPar 1h 30m & \sphinxAtStartPar mockup UI con relativo css (creazione componenti) \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}12 & \sphinxAtStartPar 1h 30m & \sphinxAtStartPar mockup UI con relativo css (creazione componenti) \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}14 & \sphinxAtStartPar 3h & \sphinxAtStartPar mockup UI con relativo css (creazione pagine) \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}15 & \sphinxAtStartPar 2h & \sphinxAtStartPar mockup UI con relativo css (creazioni pagine) \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}16 & \sphinxAtStartPar 2h & \sphinxAtStartPar ultimi ritocchi UI \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}17 & \sphinxAtStartPar 30m & \sphinxAtStartPar Stesura documentazione partita scrumble \\ \hline \end{tabulary} \par \sphinxattableend\end{savenotes} \subparagraph{Chiara Calzolari} \label{\detokenize{development/sprint0/index:chiara-calzolari}} \begin{savenotes}\sphinxattablestart \centering \begin{tabulary}{\linewidth}[t]{|T|T|T|} \hline \sphinxstyletheadfamily \sphinxAtStartPar Data &\sphinxstyletheadfamily \sphinxAtStartPar Durata &\sphinxstyletheadfamily \sphinxAtStartPar Attività \\ \hline\sphinxstyletheadfamily &\sphinxstyletheadfamily \sphinxAtStartPar 12h 30m &\sphinxstyletheadfamily \sphinxAtStartPar Totale \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}09 & \sphinxAtStartPar 2.5h & \sphinxAtStartPar Brainstorming UI \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}10 & \sphinxAtStartPar 1.5h & \sphinxAtStartPar mockup UI con relativo css (dashboard ed elenco repositories) \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}11 & \sphinxAtStartPar 1.0h & \sphinxAtStartPar mockup UI con relativo css (settings) \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}11 & \sphinxAtStartPar 0.5h & \sphinxAtStartPar Prima versione del logo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}12 & \sphinxAtStartPar 3.0h & \sphinxAtStartPar mockup UI con relativo css (creazione componenti, light/dark mode) \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}13 & \sphinxAtStartPar 1.0h & \sphinxAtStartPar mockup UI con relativo css (alerts) \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}15 & \sphinxAtStartPar 1.0h & \sphinxAtStartPar Versione definitiva del logo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}16 & \sphinxAtStartPar 0.5h & \sphinxAtStartPar mockup UI con relativo css (Notifications e Share) \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}17 & \sphinxAtStartPar 1.0h & \sphinxAtStartPar Documentazione Mockup \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}17 & \sphinxAtStartPar 0.5h & \sphinxAtStartPar Doppiaggio video di presentazione \\ \hline \end{tabulary} \par \sphinxattableend\end{savenotes} \subparagraph{Stefano Pigozzi} \label{\detokenize{development/sprint0/index:stefano-pigozzi}} \begin{savenotes}\sphinxattablestart \centering \begin{tabulary}{\linewidth}[t]{|T|T|T|} \hline \sphinxstyletheadfamily \sphinxAtStartPar Data &\sphinxstyletheadfamily \sphinxAtStartPar Durata &\sphinxstyletheadfamily \sphinxAtStartPar Attività \\ \hline\sphinxstyletheadfamily &\sphinxstyletheadfamily \sphinxAtStartPar 23h 30m &\sphinxstyletheadfamily \sphinxAtStartPar Totale \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}08 & \sphinxAtStartPar 4h 30m & \sphinxAtStartPar Configurazione Discord e GitLab \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}09 & \sphinxAtStartPar 3h 30m & \sphinxAtStartPar Riunione con il cliente e configurazione Taiga \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}10 & \sphinxAtStartPar 4h & \sphinxAtStartPar Configurazione Penpot, Taiga, UI Design, progettazione Database \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}11 & \sphinxAtStartPar 3h 30m & \sphinxAtStartPar Riunione, configurazione GitLab e project management \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}12 & \sphinxAtStartPar 30m & \sphinxAtStartPar Configurazione Twitter e UI Design \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}15 & \sphinxAtStartPar 2h 30m & \sphinxAtStartPar Partita a Scrumble e project management \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}16 & \sphinxAtStartPar 1h 30m & \sphinxAtStartPar Project management e configurazione SonarQube \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}17 & \sphinxAtStartPar 3h 30m & \sphinxAtStartPar Riunione e partita a scrumble \\ \hline \end{tabulary} \par \sphinxattableend\end{savenotes} \subparagraph{Giovanni Anniballi} \label{\detokenize{development/sprint0/index:giovanni-anniballi}} \begin{sphinxadmonition}{note}{Nota:} \sphinxAtStartPar Giovanni ha iniziato a raccogliere dati sul tempo impiegato a partire dallo Sprint 1. \end{sphinxadmonition} \subparagraph{Giorgio Minoccari} \label{\detokenize{development/sprint0/index:giorgio-minoccari}} \begin{sphinxadmonition}{note}{Nota:} \sphinxAtStartPar Giorgio ha iniziato a raccogliere dati sul tempo impiegato a partire dallo Sprint 1. \end{sphinxadmonition} \subparagraph{Lorenzo Balugani} \label{\detokenize{development/sprint0/index:lorenzo-balugani}} \begin{sphinxadmonition}{note}{Nota:} \sphinxAtStartPar Lorenzo ha iniziato a raccogliere dati sul tempo impiegato a partire dallo Sprint 1. \end{sphinxadmonition} \subsubsection{Risultati della partita di Scrumble} \label{\detokenize{development/sprint0/index:risultati-della-partita-di-scrumble}}\begin{enumerate} \sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}% \item {} \begin{quote}\begin{description} \item[{Goal}] \leavevmode \sphinxAtStartPar Learn \item[{Question}] \leavevmode \sphinxAtStartPar Do team members understand the Scrum roles? \item[{Metric}] \leavevmode \sphinxAtStartPar Knowledge of Scrum roles by questions \item[{Evaluation}] \leavevmode\begin{quote}\begin{description} \item[{1}] \leavevmode \sphinxAtStartPar no idea of the Scrum roles \item[{5}] \leavevmode \sphinxAtStartPar perfect knowledge of the roles and their jobs \end{description}\end{quote} \item[{Chiara}] \leavevmode \sphinxAtStartPar 4 \item[{Giorgio}] \leavevmode \sphinxAtStartPar 4 \item[{Giovanni}] \leavevmode \sphinxAtStartPar 4 \item[{Stefano P.}] \leavevmode \sphinxAtStartPar 4 \item[{Lorenzo}] \leavevmode \sphinxAtStartPar 5 \item[{Stefano G.}] \leavevmode \sphinxAtStartPar 5 \item[{Flavia}] \leavevmode \sphinxAtStartPar 4 \end{description}\end{quote} \item {} \begin{quote}\begin{description} \item[{Goal}] \leavevmode \sphinxAtStartPar Learn \item[{Question}] \leavevmode \sphinxAtStartPar Do team members feel they learned the process? \item[{Metric}] \leavevmode \sphinxAtStartPar Opinions from the participants \item[{Evaluation}] \leavevmode\begin{quote}\begin{description} \item[{1}] \leavevmode \sphinxAtStartPar couldn\textquotesingle{}t repeat the game \item[{5}] \leavevmode \sphinxAtStartPar could play the game as a Scrum Master by himself \end{description}\end{quote} \item[{Chiara}] \leavevmode \sphinxAtStartPar 3 \item[{Giorgio}] \leavevmode \sphinxAtStartPar 3 \item[{Giovanni}] \leavevmode \sphinxAtStartPar 4 \item[{Stefano P.}] \leavevmode \sphinxAtStartPar 5 \item[{Lorenzo}] \leavevmode \sphinxAtStartPar 3 \item[{Stefano G.}] \leavevmode \sphinxAtStartPar 3 \item[{Flavia}] \leavevmode \sphinxAtStartPar 3 \end{description}\end{quote} \item {} \begin{quote}\begin{description} \item[{Goal}] \leavevmode \sphinxAtStartPar Learn \item[{Question}] \leavevmode \sphinxAtStartPar Does everyone keep up with the other players? \item[{Metric}] \leavevmode \sphinxAtStartPar Check during every sprint retrospective if every one is on point \item[{Evaluation}] \leavevmode\begin{quote}\begin{description} \item[{1}] \leavevmode \sphinxAtStartPar totally lost \item[{5}] \leavevmode \sphinxAtStartPar leads the game driving the other players \end{description}\end{quote} \item[{Chiara}] \leavevmode \sphinxAtStartPar 3 \item[{Giorgio}] \leavevmode \sphinxAtStartPar 4 \item[{Giovanni}] \leavevmode \sphinxAtStartPar 4 \item[{Stefano P.}] \leavevmode \sphinxAtStartPar 4 \item[{Lorenzo}] \leavevmode \sphinxAtStartPar 5 \item[{Stefano G.}] \leavevmode \sphinxAtStartPar 5 \item[{Flavia}] \leavevmode \sphinxAtStartPar 5 \end{description}\end{quote} \item {} \begin{quote}\begin{description} \item[{Goal}] \leavevmode \sphinxAtStartPar Practice \item[{Question}] \leavevmode \sphinxAtStartPar Are the game mechanics linear and repeatable? \item[{Metric}] \leavevmode \sphinxAtStartPar Opinions from the participants \item[{Evaluation}] \leavevmode\begin{quote}\begin{description} \item[{1}] \leavevmode \sphinxAtStartPar feels the game is unrepeatable \item[{5}] \leavevmode \sphinxAtStartPar feels the game could be played in any situation \end{description}\end{quote} \item[{Chiara}] \leavevmode \sphinxAtStartPar 1 \item[{Giorgio}] \leavevmode \sphinxAtStartPar 2 \item[{Giovanni}] \leavevmode \sphinxAtStartPar 1 \item[{Stefano P.}] \leavevmode \sphinxAtStartPar 1 \item[{Lorenzo}] \leavevmode \sphinxAtStartPar 1 \item[{Stefano G.}] \leavevmode \sphinxAtStartPar 2 \item[{Flavia}] \leavevmode \sphinxAtStartPar 1 \end{description}\end{quote} \item {} \begin{quote}\begin{description} \item[{Goal}] \leavevmode \sphinxAtStartPar Practice \item[{Question}] \leavevmode \sphinxAtStartPar Do team success in completing the game? \item[{Metric}] \leavevmode \sphinxAtStartPar Number of User Stories completed \item[{Evaluation}] \leavevmode\begin{quote}\begin{description} \item[{1}] \leavevmode \sphinxAtStartPar 0 to 3 stories \item[{2}] \leavevmode \sphinxAtStartPar 4 to 6 \item[{3}] \leavevmode \sphinxAtStartPar 7 to 9 \item[{4}] \leavevmode \sphinxAtStartPar 10 to 12 \item[{5}] \leavevmode \sphinxAtStartPar 13 to 15 \end{description}\end{quote} \item[{Chiara}] \leavevmode \sphinxAtStartPar 5 \item[{Giorgio}] \leavevmode \sphinxAtStartPar 5 \item[{Giovanni}] \leavevmode \sphinxAtStartPar 5 \item[{Stefano P.}] \leavevmode \sphinxAtStartPar 5 \item[{Lorenzo}] \leavevmode \sphinxAtStartPar 5 \item[{Stefano G.}] \leavevmode \sphinxAtStartPar 5 \item[{Flavia}] \leavevmode \sphinxAtStartPar 5 \end{description}\end{quote} \item {} \begin{quote}\begin{description} \item[{Goal}] \leavevmode \sphinxAtStartPar Practice \item[{Question}] \leavevmode \sphinxAtStartPar Do team members efficiently estimate during sprint planning? \item[{Metric}] \leavevmode \sphinxAtStartPar Uniformity in evaluating the size and the priority of user stories \item[{Evaluation}] \leavevmode\begin{quote}\begin{description} \item[{1}] \leavevmode \sphinxAtStartPar abnormal difference from the other players \item[{5}] \leavevmode \sphinxAtStartPar coherent and uniform with the group most of the time \end{description}\end{quote} \item[{Chiara}] \leavevmode \sphinxAtStartPar 5 \item[{Giorgio}] \leavevmode \sphinxAtStartPar 4 \item[{Giovanni}] \leavevmode \sphinxAtStartPar 5 \item[{Stefano P.}] \leavevmode \sphinxAtStartPar 4 \item[{Lorenzo}] \leavevmode \sphinxAtStartPar 5 \end{description}\end{quote} \item {} \begin{quote}\begin{description} \item[{Goal}] \leavevmode \sphinxAtStartPar Cooperation \item[{Question}] \leavevmode \sphinxAtStartPar Do team members know each other better? \item[{Metric}] \leavevmode \sphinxAtStartPar Level of players\textquotesingle{} serenity throughout the game \item[{Evaluation}] \leavevmode\begin{quote}\begin{description} \item[{1}] \leavevmode \sphinxAtStartPar never speaks with the other players \item[{5}] \leavevmode \sphinxAtStartPar talks friendly to anyone in every situation \end{description}\end{quote} \item[{Chiara}] \leavevmode \sphinxAtStartPar 4 \item[{Giorgio}] \leavevmode \sphinxAtStartPar 5 \item[{Giovanni}] \leavevmode \sphinxAtStartPar 5 \item[{Stefano P.}] \leavevmode \sphinxAtStartPar 5 \item[{Lorenzo}] \leavevmode \sphinxAtStartPar 5 \item[{Stefano G.}] \leavevmode \sphinxAtStartPar 5 \item[{Flavia}] \leavevmode \sphinxAtStartPar 4 \end{description}\end{quote} \item {} \begin{quote}\begin{description} \item[{Goal}] \leavevmode \sphinxAtStartPar Cooperation \item[{Question}] \leavevmode \sphinxAtStartPar Does the game let all players cooperate? \item[{Metric}] \leavevmode \sphinxAtStartPar Contribution of every player during the game \item[{Evaluation}] \leavevmode\begin{quote}\begin{description} \item[{1}] \leavevmode \sphinxAtStartPar never puts effort in doing something \item[{5}] \leavevmode \sphinxAtStartPar every time is willing to understand what is going on \end{description}\end{quote} \item[{Chiara}] \leavevmode \sphinxAtStartPar 4 \item[{Giorgio}] \leavevmode \sphinxAtStartPar 3 \item[{Giovanni}] \leavevmode \sphinxAtStartPar 3 \item[{Stefano P.}] \leavevmode \sphinxAtStartPar 2 \item[{Lorenzo}] \leavevmode \sphinxAtStartPar 3 \item[{Stefano G.}] \leavevmode \sphinxAtStartPar 4 \item[{Flavia}] \leavevmode \sphinxAtStartPar 3 \end{description}\end{quote} \item {} \begin{quote}\begin{description} \item[{Goal}] \leavevmode \sphinxAtStartPar Cooperation \item[{Question}] \leavevmode \sphinxAtStartPar Do team member consult each other about a topic? \item[{Metric}] \leavevmode \sphinxAtStartPar Sharing of ideas \item[{Evaluation}] \leavevmode\begin{quote}\begin{description} \item[{1}] \leavevmode \sphinxAtStartPar never asks for an opinion \item[{5}] \leavevmode \sphinxAtStartPar wants to discuss about every topic \end{description}\end{quote} \item[{Chiara}] \leavevmode \sphinxAtStartPar 5 \item[{Giorgio}] \leavevmode \sphinxAtStartPar 5 \item[{Giovanni}] \leavevmode \sphinxAtStartPar 5 \item[{Stefano P.}] \leavevmode \sphinxAtStartPar 3 \item[{Lorenzo}] \leavevmode \sphinxAtStartPar 5 \item[{Stefano G.}] \leavevmode \sphinxAtStartPar 4 \item[{Flavia}] \leavevmode \sphinxAtStartPar 5 \end{description}\end{quote} \item {} \begin{quote}\begin{description} \item[{Goal}] \leavevmode \sphinxAtStartPar Motivation \item[{Question}] \leavevmode \sphinxAtStartPar Do team members encourage collegues in need? \item[{Metric}] \leavevmode \sphinxAtStartPar Players explain something other players don\textquotesingle{}t understand \item[{Evaluation}] \leavevmode\begin{quote}\begin{description} \item[{1}] \leavevmode \sphinxAtStartPar not involved by the game \item[{5}] \leavevmode \sphinxAtStartPar always makes sure everyone is on point \end{description}\end{quote} \item[{Chiara}] \leavevmode \sphinxAtStartPar 3 \item[{Giorgio}] \leavevmode \sphinxAtStartPar 5 \item[{Giovanni}] \leavevmode \sphinxAtStartPar 5 \item[{Stefano P.}] \leavevmode \sphinxAtStartPar 4 \item[{Lorenzo}] \leavevmode \sphinxAtStartPar 5 \item[{Stefano G.}] \leavevmode \sphinxAtStartPar 4 \item[{Flavia}] \leavevmode \sphinxAtStartPar 4 \end{description}\end{quote} \item {} \begin{quote}\begin{description} \item[{Goal}] \leavevmode \sphinxAtStartPar Motivation \item[{Question}] \leavevmode \sphinxAtStartPar Does PO help the team? \item[{Metric}] \leavevmode \sphinxAtStartPar Quality of PO\textquotesingle{}s advices to get better in the next sprints \item[{Evaluation}] \leavevmode\begin{quote}\begin{description} \item[{1}] \leavevmode \sphinxAtStartPar poor/absent advices \item[{5}] \leavevmode \sphinxAtStartPar wise and helpful suggestions when is required \end{description}\end{quote} \item[{Stefano G.}] \leavevmode \sphinxAtStartPar 4 \end{description}\end{quote} \item {} \begin{quote}\begin{description} \item[{Goal}] \leavevmode \sphinxAtStartPar Motivation \item[{Question}] \leavevmode \sphinxAtStartPar Does the team come up with good ideas? \item[{Metric}] \leavevmode \sphinxAtStartPar Effectiveness of sprint retrospective \item[{Evaluation}] \leavevmode\begin{quote}\begin{description} \item[{1}] \leavevmode \sphinxAtStartPar doesn\textquotesingle{}t express opinions during retrospective \item[{5}] \leavevmode \sphinxAtStartPar feels the retrospective fundamental to express opinions \end{description}\end{quote} \item[{Chiara}] \leavevmode \sphinxAtStartPar 4 \item[{Giorgio}] \leavevmode \sphinxAtStartPar 5 \item[{Giovanni}] \leavevmode \sphinxAtStartPar 5 \item[{Stefano P.}] \leavevmode \sphinxAtStartPar 5 \item[{Lorenzo}] \leavevmode \sphinxAtStartPar 5 \item[{Stefano G.}] \leavevmode \sphinxAtStartPar 5 \item[{Flavia}] \leavevmode \sphinxAtStartPar 5 \end{description}\end{quote} \item {} \begin{quote}\begin{description} \item[{Goal}] \leavevmode \sphinxAtStartPar Problem Solving \item[{Question}] \leavevmode \sphinxAtStartPar Do team members behave well when facing a problem? \item[{Metric}] \leavevmode \sphinxAtStartPar Level of the technical debt at the end of the game \item[{Evaluation}] \leavevmode \sphinxAtStartPar On the game board, if the debt pawn is on the lowest stage,the evaluation is 5, for every higher stage it decreases by 1 \item[{Chiara}] \leavevmode \sphinxAtStartPar 5 \item[{Giorgio}] \leavevmode \sphinxAtStartPar 5 \item[{Giovanni}] \leavevmode \sphinxAtStartPar 5 \item[{Stefano P.}] \leavevmode \sphinxAtStartPar 5 \item[{Lorenzo}] \leavevmode \sphinxAtStartPar 5 \item[{Stefano G.}] \leavevmode \sphinxAtStartPar 5 \item[{Flavia}] \leavevmode \sphinxAtStartPar 5 \end{description}\end{quote} \item {} \begin{quote}\begin{description} \item[{Goal}] \leavevmode \sphinxAtStartPar Problem Solving \item[{Question}] \leavevmode \sphinxAtStartPar Does team organize their tasks properly? \item[{Metric}] \leavevmode \sphinxAtStartPar Average of tasks left at the end of each sprint \item[{Evaluation}] \leavevmode\begin{quote}\begin{description} \item[{1}] \leavevmode \sphinxAtStartPar 21+ average tasks left \item[{2}] \leavevmode \sphinxAtStartPar 16\sphinxhyphen{}20 average tasks left \item[{3}] \leavevmode \sphinxAtStartPar 11\sphinxhyphen{}15 average tasks left \item[{4}] \leavevmode \sphinxAtStartPar 6\sphinxhyphen{}10 average tasks left \item[{5}] \leavevmode \sphinxAtStartPar 0\sphinxhyphen{}5 average tasks left \end{description}\end{quote} \item[{Chiara}] \leavevmode \sphinxAtStartPar 5 \item[{Giorgio}] \leavevmode \sphinxAtStartPar 5 \item[{Giovanni}] \leavevmode \sphinxAtStartPar 5 \item[{Stefano P.}] \leavevmode \sphinxAtStartPar 5 \item[{Lorenzo}] \leavevmode \sphinxAtStartPar 5 \end{description}\end{quote} \item {} \begin{quote}\begin{description} \item[{Goal}] \leavevmode \sphinxAtStartPar Problem Solving \item[{Question}] \leavevmode \sphinxAtStartPar Does PO plan efficiently the Sprint Backlog? \item[{Metric}] \leavevmode \sphinxAtStartPar Average of tasks left at the end of each sprint \item[{Evaluation}] \leavevmode\begin{quote}\begin{description} \item[{1}] \leavevmode \sphinxAtStartPar 21+ average tasks left \item[{2}] \leavevmode \sphinxAtStartPar 16\sphinxhyphen{}20 average tasks left \item[{3}] \leavevmode \sphinxAtStartPar 11\sphinxhyphen{}15 average tasks left \item[{4}] \leavevmode \sphinxAtStartPar 6\sphinxhyphen{}10 average tasks left \item[{5}] \leavevmode \sphinxAtStartPar 0\sphinxhyphen{}5 average tasks left \end{description}\end{quote} \item[{Stefano G.}] \leavevmode \sphinxAtStartPar 5 \end{description}\end{quote} \end{enumerate} \subsection{Sprint 1: 19 Apr \sphinxhyphen{} 02 Mag} \label{\detokenize{development/sprint1/index:sprint-1-19-apr-02-mag}}\label{\detokenize{development/sprint1/index::doc}} \subsubsection{Consegna} \label{\detokenize{development/sprint1/index:consegna}} \sphinxAtStartPar La seguente documentazione è stata fornita dal cliente durante questo Sprint: \begin{itemize} \item {} \sphinxAtStartPar \sphinxcode{\sphinxupquote{1\sphinxhyphen{}sprint\sphinxhyphen{}requirements.pdf}} \end{itemize} \subsubsection{Goal} \label{\detokenize{development/sprint1/index:goal}} \sphinxAtStartPar Il \sphinxstylestrong{goal} per questo Sprint è stato costruire una codebase facilmente mantenibile e modulare, che potesse accomodare grossi cambiamenti nei sottomoduli senza impattare gli altri: \begin{itemize} \item {} \sphinxAtStartPar Dal lato \sphinxstylestrong{backend}: l\textquotesingle{}obiettivo è stato predisporre la struttura del database e creare le API calls per il login degli utenti e la creazione dei repository \item {} \sphinxAtStartPar Dal lato \sphinxstylestrong{testing}: creare un piccolo framework per il testing automatizzato del backend \item {} \sphinxAtStartPar Dal lato \sphinxstylestrong{frontend}: creare la struttura con le componenti importate da Figma e implementare le schermate principali \end{itemize} \paragraph{Backlog} \label{\detokenize{development/sprint1/index:backlog}} \noindent\sphinxincludegraphics[width=400\sphinxpxdimen]{{1-backlog}.png} \paragraph{Task completati} \label{\detokenize{development/sprint1/index:task-completati}} \noindent\sphinxincludegraphics[width=400\sphinxpxdimen]{{1-tasks}.png} \subsubsection{Definition of Ready} \label{\detokenize{development/sprint1/index:definition-of-ready}} \sphinxAtStartPar Il team ha definito lo stato di Ready di una User Story in base ai seguenti criteri: \begin{itemize} \item {} \sphinxAtStartPar La User Story è stata compresa ed accettata da tutti i membri \item {} \sphinxAtStartPar I tester hanno confermato la possibilità di poterla testare \item {} \sphinxAtStartPar Il Product Owner ha la visione necessaria per definirne la priorità \item {} \sphinxAtStartPar Il Team è in grado di stimarla \item {} \sphinxAtStartPar La User Story è indipendente o dipendente da altre a priorità maggiore \end{itemize} \subsubsection{Definition of Done} \label{\detokenize{development/sprint1/index:definition-of-done}} \sphinxAtStartPar La definizione di Done è stata concordata da tutto il team con il Product Owner, ed è stata così definita: \begin{itemize} \item {} \sphinxAtStartPar Sviluppo completo della funzionalità richiesta \item {} \sphinxAtStartPar Definizione e superamento dei test \item {} \sphinxAtStartPar Bozza della documentazione della funzionalità \item {} \sphinxAtStartPar Merge dei sorgenti nel branch \sphinxcode{\sphinxupquote{main}} di GitLab \end{itemize} \subsubsection{Statistiche} \label{\detokenize{development/sprint1/index:statistiche}} \paragraph{Burndown chart} \label{\detokenize{development/sprint1/index:burndown-chart}} \sphinxAtStartPar Questa è la burndown chart relativa allo Sprint 1: \noindent\sphinxincludegraphics{{1-burndown}.png} \paragraph{Gitinspector} \label{\detokenize{development/sprint1/index:gitinspector}} \sphinxAtStartPar Questa statistica è stata generata dal prof. Marcello Missiroli con \sphinxhref{https://github.com/ejwa/gitinspector}{Gitinspector} al termine dello Sprint. \begin{itemize} \item {} \sphinxAtStartPar \sphinxcode{\sphinxupquote{1\sphinxhyphen{}stats.html}} \end{itemize} \subsubsection{Sprint Retrospective} \label{\detokenize{development/sprint1/index:sprint-retrospective}} \sphinxAtStartPar La Sprint Retrospective è disponibile al seguente link: \begin{itemize} \item {} \sphinxAtStartPar \sphinxcode{\sphinxupquote{1\sphinxhyphen{}retrospective.pdf}} \end{itemize} \subsubsection{Sprint Review} \label{\detokenize{development/sprint1/index:sprint-review}} \sphinxAtStartPar Il video di Sprint Review è disponibile al seguente link: \begin{itemize} \item {} \sphinxAtStartPar \sphinxurl{https://drive.google.com/drive/folders/1dsis\_cGCRnVgZAkZjEVIZKt4NndkycaF} \end{itemize} \subsubsection{Valutazione sul debito tecnico} \label{\detokenize{development/sprint1/index:valutazione-sul-debito-tecnico}} \sphinxAtStartPar Durante questo sprint è stata prodotta dallo Scrum Master la seguente valutazione sul debito tecnico: \begin{quote} \sphinxAtStartPar La valutazione del debito tecnico effettuata da SonarQube è relativa principalmente al backend, poiché l’analisi del progetto sarebbe stata troppo dispendiosa a causa dell’elevato numero di file presente nella cartella \sphinxcode{\sphinxupquote{/frontend}}. \sphinxAtStartPar Per quanto riguarda il backend invece il debito tecnico riscontrato è minore del 5\% come si può verificare dal grado A attestato da SonarQube. \sphinxAtStartPar Un punto chiave nell’implementazione ha permesso al team di diminuire il debito tecnico, questo è avvenuto grazie all’adozione del modello architetturale REST che ha migliorato esponenzialmente il tempo di risposta delle richieste e la leggibilità del codice. \begin{flushright} ---Flavia Cocca, Scrum Master \end{flushright} \end{quote} \subsubsection{Valutazione sulle User Stories} \label{\detokenize{development/sprint1/index:valutazione-sulle-user-stories}} \sphinxAtStartPar Durante questo sprint è stata prodotta dal Product Owner la seguente valutazione sulle User Stories: \begin{quote} \sphinxAtStartPar Durante questo sprint non sono state ristimate le US in quanto non sono emerse al termine dello Sprint 0 valutazioni che lo rendessero necessario, di conseguenza non sono state neanche rivalutate le priorità. \sphinxAtStartPar Come Product Owner ho individuato come criterio di accettazione l\textquotesingle{}esito positivo dei test, anche per il fatto che i test sono presenti in ogni US. \sphinxAtStartPar Durante lo sviluppo di questo primo sprint sono ovviamente emerse delle issue che sono state tracciate su Taiga. Una di queste, la \#101 "L\textquotesingle{}API non è interamente REST" ha portato ad un refactoring di una parte del codice del backend, del frontend e naturalmente anche delle procedure di test, che erano già state abbozzate. La modifica comunque si è rilevata essere necessaria per rispondere appieno alle struttura tipica dei metodi REST. \sphinxAtStartPar Altre issue sono state inserite ma possono essere sistemate nello sprint successivo in quanto non influiscono sul funzionamento atteso in questo primo sprint. \sphinxAtStartPar Un leggero ritardo sullo sviluppo del frontend non consente di chiudere alcune US, che verranno chiuse e testate nel prossimo Sprint. \begin{flushright} ---Stefano Goldoni, Product Owner \end{flushright} \end{quote} \subsubsection{Registro attività} \label{\detokenize{development/sprint1/index:registro-attivita}} \paragraph{Riunioni collettive} \label{\detokenize{development/sprint1/index:riunioni-collettive}} \begin{savenotes}\sphinxattablestart \centering \begin{tabulary}{\linewidth}[t]{|T|T|T|T|} \hline \sphinxstyletheadfamily \sphinxAtStartPar Data &\sphinxstyletheadfamily \sphinxAtStartPar Ora &\sphinxstyletheadfamily \sphinxAtStartPar Durata &\sphinxstyletheadfamily \sphinxAtStartPar Attività \\ \hline\sphinxstyletheadfamily &\sphinxstyletheadfamily &\sphinxstyletheadfamily \sphinxAtStartPar 2h &\sphinxstyletheadfamily \sphinxAtStartPar Totale \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}01 & \sphinxAtStartPar 15:30 & \sphinxAtStartPar 2h & \sphinxAtStartPar backlog grooming session \\ \hline \end{tabulary} \par \sphinxattableend\end{savenotes} \paragraph{Attività individuali} \label{\detokenize{development/sprint1/index:attivita-individuali}} \begin{sphinxadmonition}{hint}{Suggerimento:} \sphinxAtStartPar Per vedere più in dettaglio il lavoro di sviluppo effettuato da ogni membro del gruppo, si suggerisce di visualizzare il log di Git: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{g+gp}{\PYGZdl{} }git log \end{sphinxVerbatim} \end{sphinxadmonition} \subparagraph{Stefano Goldoni} \label{\detokenize{development/sprint1/index:stefano-goldoni}} \begin{savenotes}\sphinxattablestart \centering \begin{tabulary}{\linewidth}[t]{|T|T|T|} \hline \sphinxstyletheadfamily \sphinxAtStartPar Data &\sphinxstyletheadfamily \sphinxAtStartPar Durata &\sphinxstyletheadfamily \sphinxAtStartPar Attività \\ \hline\sphinxstyletheadfamily &\sphinxstyletheadfamily \sphinxAtStartPar 23h 30m &\sphinxstyletheadfamily \sphinxAtStartPar Totale \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}20 & \sphinxAtStartPar 30m & \sphinxAtStartPar analisi test \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}20 & \sphinxAtStartPar 1h 30m & \sphinxAtStartPar scrittura test cases \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}26 & \sphinxAtStartPar 30m & \sphinxAtStartPar predisposizione progetto in locale per il test \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}26 & \sphinxAtStartPar 2h & \sphinxAtStartPar metodi di test login e creazione utente \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}28 & \sphinxAtStartPar 2h & \sphinxAtStartPar metodi ti test \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}29 & \sphinxAtStartPar 2h & \sphinxAtStartPar metodi di test \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}30 & \sphinxAtStartPar 2h & \sphinxAtStartPar metodi di test backend \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}01 & \sphinxAtStartPar 1h & \sphinxAtStartPar test frontend \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}01 & \sphinxAtStartPar 1h & \sphinxAtStartPar test backend in pair programming \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}02 & \sphinxAtStartPar 1h & \sphinxAtStartPar documentazione \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}02 & \sphinxAtStartPar 2h 30m & \sphinxAtStartPar test backend \\ \hline \end{tabulary} \par \sphinxattableend\end{savenotes} \subparagraph{Flavia Cocca} \label{\detokenize{development/sprint1/index:flavia-cocca}} \begin{savenotes}\sphinxattablestart \centering \begin{tabulary}{\linewidth}[t]{|T|T|T|} \hline \sphinxstyletheadfamily \sphinxAtStartPar Data &\sphinxstyletheadfamily \sphinxAtStartPar Durata &\sphinxstyletheadfamily \sphinxAtStartPar Attività \\ \hline\sphinxstyletheadfamily &\sphinxstyletheadfamily \sphinxAtStartPar 8h &\sphinxstyletheadfamily \sphinxAtStartPar Totale \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}27 & \sphinxAtStartPar 1h & \sphinxAtStartPar modifica mockup UI \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}28 & \sphinxAtStartPar 1h & \sphinxAtStartPar Organizzazione Sprint retrospective \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}30 & \sphinxAtStartPar 1h & \sphinxAtStartPar modifica mockup UI \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}01 & \sphinxAtStartPar 2h & \sphinxAtStartPar Riunione con il team per Sprint review e Sprint retrospective \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}02 & \sphinxAtStartPar 3h & \sphinxAtStartPar Stesura documenti Sprint 1 (debito tecnico e relazione Sprint retrospective), realizzazione video Sprint1 review \\ \hline \end{tabulary} \par \sphinxattableend\end{savenotes} \subparagraph{Chiara Calzolari} \label{\detokenize{development/sprint1/index:chiara-calzolari}} \begin{savenotes}\sphinxattablestart \centering \begin{tabulary}{\linewidth}[t]{|T|T|T|} \hline \sphinxstyletheadfamily \sphinxAtStartPar Data &\sphinxstyletheadfamily \sphinxAtStartPar Durata &\sphinxstyletheadfamily \sphinxAtStartPar Attività \\ \hline\sphinxstyletheadfamily &\sphinxstyletheadfamily \sphinxAtStartPar 6h 30m &\sphinxstyletheadfamily \sphinxAtStartPar Totale \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}26 & \sphinxAtStartPar 3h & \sphinxAtStartPar Configurazione ambiente di sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}27 & \sphinxAtStartPar 1h & \sphinxAtStartPar modifica mockup UI (adeguamento al JS) \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}29 & \sphinxAtStartPar 2h & \sphinxAtStartPar modifica mockup UI (Manage users) \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}01 & \sphinxAtStartPar 30m & \sphinxAtStartPar Ultimi ritocchi al mockup UI \\ \hline \end{tabulary} \par \sphinxattableend\end{savenotes} \subparagraph{Stefano Pigozzi} \label{\detokenize{development/sprint1/index:stefano-pigozzi}} \begin{savenotes}\sphinxatlongtablestart\begin{longtable}[c]{|l|l|l|} \hline \sphinxstyletheadfamily \sphinxAtStartPar Data &\sphinxstyletheadfamily \sphinxAtStartPar Durata &\sphinxstyletheadfamily \sphinxAtStartPar Attività \\ \hline\sphinxstyletheadfamily &\sphinxstyletheadfamily \sphinxAtStartPar 29h &\sphinxstyletheadfamily \sphinxAtStartPar Totale \\ \hline \endfirsthead \multicolumn{3}{c}% {\makebox[0pt]{\sphinxtablecontinued{\tablename\ \thetable{} \textendash{} continua dalla pagina precedente}}}\\ \hline \sphinxstyletheadfamily \sphinxAtStartPar Data &\sphinxstyletheadfamily \sphinxAtStartPar Durata &\sphinxstyletheadfamily \sphinxAtStartPar Attività \\ \hline\sphinxstyletheadfamily &\sphinxstyletheadfamily \sphinxAtStartPar 29h &\sphinxstyletheadfamily \sphinxAtStartPar Totale \\ \hline \endhead \hline \multicolumn{3}{r}{\makebox[0pt][r]{\sphinxtablecontinued{continues on next page}}}\\ \endfoot \endlastfoot \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}19 & \sphinxAtStartPar 18m & \sphinxAtStartPar Configurazione IntelliJ IDEA \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}19 & \sphinxAtStartPar 10m & \sphinxAtStartPar Configurazione IntelliJ IDEA \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}20 & \sphinxAtStartPar 1h 26m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}21 & \sphinxAtStartPar 1h 3m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}21 & \sphinxAtStartPar 3m & \sphinxAtStartPar Configurazione IntelliJ IDEA \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}21 & \sphinxAtStartPar 58m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}21 & \sphinxAtStartPar 13m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}21 & \sphinxAtStartPar 7m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}21 & \sphinxAtStartPar 6m & \sphinxAtStartPar Project management \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}21 & \sphinxAtStartPar 15m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}21 & \sphinxAtStartPar 32m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}21 & \sphinxAtStartPar 10m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}22 & \sphinxAtStartPar 5m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}22 & \sphinxAtStartPar 16m & \sphinxAtStartPar Presentazione \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}22 & \sphinxAtStartPar 36m & \sphinxAtStartPar Riunione \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}22 & \sphinxAtStartPar 1h 23m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}23 & \sphinxAtStartPar 18m & \sphinxAtStartPar Studio \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}23 & \sphinxAtStartPar 42m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}23 & \sphinxAtStartPar 10m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}23 & \sphinxAtStartPar 1h 9m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}23 & \sphinxAtStartPar 3m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}24 & \sphinxAtStartPar 19m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}24 & \sphinxAtStartPar 19m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}25 & \sphinxAtStartPar 2h 59m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}25 & \sphinxAtStartPar 10m & \sphinxAtStartPar Documentazione \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}26 & \sphinxAtStartPar 13m & \sphinxAtStartPar Configurazione SonarQube \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}26 & \sphinxAtStartPar 12m & \sphinxAtStartPar Documentazione \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}26 & \sphinxAtStartPar 30m & \sphinxAtStartPar Documentazione \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}26 & \sphinxAtStartPar 4m & \sphinxAtStartPar Riunione \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}26 & \sphinxAtStartPar 2h 58m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}26 & \sphinxAtStartPar 1h 4m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}26 & \sphinxAtStartPar 56m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}26 & \sphinxAtStartPar 6m & \sphinxAtStartPar Project management \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}27 & \sphinxAtStartPar 7m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}27 & \sphinxAtStartPar 15m & \sphinxAtStartPar Configurazione Taiga \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}27 & \sphinxAtStartPar 29m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}27 & \sphinxAtStartPar 35m & \sphinxAtStartPar Collaborazione \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}28 & \sphinxAtStartPar 34m & \sphinxAtStartPar Collaborazione \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}29 & \sphinxAtStartPar 1h 42m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}29 & \sphinxAtStartPar 1h 26m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}29 & \sphinxAtStartPar 48m & \sphinxAtStartPar Project management \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}30 & \sphinxAtStartPar 56m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}30 & \sphinxAtStartPar 46m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}01 & \sphinxAtStartPar 12m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}02 & \sphinxAtStartPar 14m & \sphinxAtStartPar Documentazione \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}02 & \sphinxAtStartPar 28m & \sphinxAtStartPar Bugfixing \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}02 & \sphinxAtStartPar 15m & \sphinxAtStartPar Collaborazione \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}02 & \sphinxAtStartPar 3m & \sphinxAtStartPar Bugfixing \\ \hline \end{longtable}\sphinxatlongtableend\end{savenotes} \subparagraph{Giovanni Anniballi} \label{\detokenize{development/sprint1/index:giovanni-anniballi}} \sphinxAtStartPar Per il lavoro di testing è stata utilizzata anche la tecnica del Pair Programming, grazie ad un plugin dell\textquotesingle{}IDE utilizzato. \begin{savenotes}\sphinxattablestart \centering \begin{tabulary}{\linewidth}[t]{|T|T|T|} \hline \sphinxstyletheadfamily \sphinxAtStartPar Data &\sphinxstyletheadfamily \sphinxAtStartPar Durata &\sphinxstyletheadfamily \sphinxAtStartPar Attività \\ \hline\sphinxstyletheadfamily &\sphinxstyletheadfamily \sphinxAtStartPar 16h 30m &\sphinxstyletheadfamily \sphinxAtStartPar Totale \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}22 & \sphinxAtStartPar 30m & \sphinxAtStartPar Riunione con il team \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}23 & \sphinxAtStartPar 1h & \sphinxAtStartPar Studio struttura del backend \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}24 & \sphinxAtStartPar 1h 30m & \sphinxAtStartPar Studio del backend, volto a capire il funzionamento delle varie API \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}26 & \sphinxAtStartPar 2h & \sphinxAtStartPar Testing login e retrieval dei dati inerenti a tutti gli utenti registrati \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}27 & \sphinxAtStartPar 1h & \sphinxAtStartPar Testing creazione user \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}28 & \sphinxAtStartPar 2h & \sphinxAtStartPar Test cancellazione utente e ritorno dei dati inerenti a quell’utente \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}29 & \sphinxAtStartPar 1h 30m & \sphinxAtStartPar Test modica utenti e creazione della prima repository \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}30 & \sphinxAtStartPar 2h & \sphinxAtStartPar Testing ritorno di tutte le repository di proprietà dell’utente loggato, ritorno delle info inerenti alla repository specificata \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}01 & \sphinxAtStartPar 2h & \sphinxAtStartPar Riunione con il team per Sprint review e Sprint retrospective \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}01 & \sphinxAtStartPar 1h & \sphinxAtStartPar Testing modifica ed eliminazione di una repository (nome, stato) \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}02 & \sphinxAtStartPar 2h & \sphinxAtStartPar Testing del frontend tramite UI, controllo generale dei test già effettuati. \\ \hline \end{tabulary} \par \sphinxattableend\end{savenotes} \subparagraph{Giorgio Minoccari} \label{\detokenize{development/sprint1/index:giorgio-minoccari}} \sphinxAtStartPar Durante lo Sprint ho principalmente svolto sviluppo e test riguardo alla API di twitter, in modo da poter effettuare chiamate efficenti e non venire limitati dal sito riguardo alle richieste effettuate. \begin{savenotes}\sphinxattablestart \centering \begin{tabulary}{\linewidth}[t]{|T|T|T|} \hline \sphinxstyletheadfamily \sphinxAtStartPar Data &\sphinxstyletheadfamily \sphinxAtStartPar Durata &\sphinxstyletheadfamily \sphinxAtStartPar Attività \\ \hline\sphinxstyletheadfamily &\sphinxstyletheadfamily \sphinxAtStartPar 10h &\sphinxstyletheadfamily \sphinxAtStartPar Totale \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}21 & \sphinxAtStartPar 1h & \sphinxAtStartPar Primi test riguardo autenticazione Oauth per API twitter \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}23 & \sphinxAtStartPar 1h 30m & \sphinxAtStartPar Autenticazione funzionante \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}24 & \sphinxAtStartPar 30m & \sphinxAtStartPar Test su ricerche generali con parole chiave \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}26 & \sphinxAtStartPar 1h & \sphinxAtStartPar Test su ricerche geolocalizzate \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}27 & \sphinxAtStartPar 1h & \sphinxAtStartPar Definizione di entita\textquotesingle{} di esempio nei database per provare funzioni legate ad esse \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}28 & \sphinxAtStartPar 2h & \sphinxAtStartPar Definizione di funzioni per l\textquotesingle{}aggregazione di condizioni di diverso tipo per la ricerca di tweet tramite API \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}29 & \sphinxAtStartPar 1h & \sphinxAtStartPar Refactor codice scritto fino a quel momento, eliminazione di dati inutili \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}01 & \sphinxAtStartPar 1h & \sphinxAtStartPar Implementazioni di analisi su termini e hashtag restituiti dall\textquotesingle{}API \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}02 & \sphinxAtStartPar 1h & \sphinxAtStartPar Test di chiamata alle funzioni di ricerca a partire da repository con condizioni complesse aggregate \\ \hline \end{tabulary} \par \sphinxattableend\end{savenotes} \subparagraph{Lorenzo Balugani} \label{\detokenize{development/sprint1/index:lorenzo-balugani}} \begin{savenotes}\sphinxattablestart \centering \begin{tabulary}{\linewidth}[t]{|T|T|T|} \hline \sphinxstyletheadfamily \sphinxAtStartPar Data &\sphinxstyletheadfamily \sphinxAtStartPar Durata &\sphinxstyletheadfamily \sphinxAtStartPar Attività \\ \hline\sphinxstyletheadfamily &\sphinxstyletheadfamily \sphinxAtStartPar 13h 30m &\sphinxstyletheadfamily \sphinxAtStartPar Totale \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}21 & \sphinxAtStartPar 2h & \sphinxAtStartPar Implementazione Base di Dati \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}22 & \sphinxAtStartPar 2h & \sphinxAtStartPar Login, creazione utenti \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}25 & \sphinxAtStartPar 1h & \sphinxAtStartPar Rimozione utenti, CORS, Creazione repo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}25 & \sphinxAtStartPar 3h & \sphinxAtStartPar Altre funzioni API \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}26 & \sphinxAtStartPar 30m & \sphinxAtStartPar Standardizzazione output json \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}26 & \sphinxAtStartPar 1h & \sphinxAtStartPar Documentazione \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}27 & \sphinxAtStartPar 30m & \sphinxAtStartPar Aggiunto supporto al modulo explorer, fix \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}28 & \sphinxAtStartPar 30m & \sphinxAtStartPar Bugfixing \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}29 & \sphinxAtStartPar 1h & \sphinxAtStartPar Gestione migliorata errori \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}04\sphinxhyphen{}29 & \sphinxAtStartPar 1h & \sphinxAtStartPar Refactoring \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}02 & \sphinxAtStartPar 1h & \sphinxAtStartPar Bugfixing \\ \hline \end{tabulary} \par \sphinxattableend\end{savenotes} \subsection{Sprint 2: 03 Mag \sphinxhyphen{} 16 Mag} \label{\detokenize{development/sprint2/index:sprint-2-03-mag-16-mag}}\label{\detokenize{development/sprint2/index::doc}} \subsubsection{Consegna} \label{\detokenize{development/sprint2/index:consegna}} \sphinxAtStartPar La seguente documentazione è stata fornita dal cliente durante questo sprint: \begin{itemize} \item {} \sphinxAtStartPar \sphinxcode{\sphinxupquote{2\sphinxhyphen{}sprint\sphinxhyphen{}requirements.pdf}} \end{itemize} \subsubsection{Goal} \label{\detokenize{development/sprint2/index:goal}} \sphinxAtStartPar Il \sphinxstylestrong{goal} del secondo Sprint è stato la creazione, cancellazione e modifica dei repository, ovvero permettere agli utenti di creare repository partendo da una ricerca che rispetta determinate condizioni. \paragraph{Backlog} \label{\detokenize{development/sprint2/index:backlog}} \noindent\sphinxincludegraphics[width=400\sphinxpxdimen]{{2-backlog}.png} \paragraph{Task completati} \label{\detokenize{development/sprint2/index:task-completati}} \noindent\sphinxincludegraphics[width=400\sphinxpxdimen]{{2-tasks}.png} \subsubsection{Definition of Ready} \label{\detokenize{development/sprint2/index:definition-of-ready}} \sphinxAtStartPar Il team ha definito lo stato di Ready di una User Story in base ai seguenti criteri: \begin{itemize} \item {} \sphinxAtStartPar La User Story è stata compresa ed accettata da tutti i membri \item {} \sphinxAtStartPar I tester hanno confermato la possibilità di poterla testare \item {} \sphinxAtStartPar Il Product Owner ha la visione necessaria per definirne la priorità \item {} \sphinxAtStartPar Il Team è in grado di stimarla \item {} \sphinxAtStartPar La User Story è indipendente o dipendente da altre a priorità maggiore \end{itemize} \subsubsection{Definition of Done} \label{\detokenize{development/sprint2/index:definition-of-done}} \sphinxAtStartPar La definizione di Done è stata concordata da tutto il team con il Product Owner, ed è stata così definita: \begin{itemize} \item {} \sphinxAtStartPar Sviluppo completo della funzionalità richiesta \item {} \sphinxAtStartPar Definizione e superamento dei test \item {} \sphinxAtStartPar Bozza della documentazione della funzionalità \item {} \sphinxAtStartPar Merge dei sorgenti nel branch \sphinxcode{\sphinxupquote{main}} di GitLab \end{itemize} \subsubsection{Statistiche} \label{\detokenize{development/sprint2/index:statistiche}} \paragraph{Burndown chart} \label{\detokenize{development/sprint2/index:burndown-chart}} \sphinxAtStartPar Questa è la burndown chart relativa allo Sprint 2: \noindent\sphinxincludegraphics{{2-burndown}.png} \paragraph{Gitinspector} \label{\detokenize{development/sprint2/index:gitinspector}} \sphinxAtStartPar Questa statistica è stata generata dal prof. Marcello Missiroli con \sphinxhref{https://github.com/ejwa/gitinspector}{Gitinspector} al termine dello Sprint. \begin{itemize} \item {} \sphinxAtStartPar \sphinxcode{\sphinxupquote{2\sphinxhyphen{}stats.html}} (relativa al codice) \item {} \sphinxAtStartPar \sphinxcode{\sphinxupquote{2D\sphinxhyphen{}stats.html}} (relativa a parte della documentazione) \end{itemize} \subsubsection{Sprint Retrospective} \label{\detokenize{development/sprint2/index:sprint-retrospective}} \sphinxAtStartPar La Sprint Retrospective è disponibile al seguente link: \begin{itemize} \item {} \sphinxAtStartPar \sphinxcode{\sphinxupquote{2\sphinxhyphen{}retrospective.pdf}} \end{itemize} \subsubsection{Sprint Review} \label{\detokenize{development/sprint2/index:sprint-review}} \sphinxAtStartPar Il video di Sprint Review è disponibile al seguente link: \begin{itemize} \item {} \sphinxAtStartPar \sphinxurl{https://drive.google.com/file/d/1x1kub-bpVJrwmGrn5LLU8ecqcbxFaoKg/view} \end{itemize} \subsubsection{Registro attività} \label{\detokenize{development/sprint2/index:registro-attivita}} \paragraph{Riunioni collettive} \label{\detokenize{development/sprint2/index:riunioni-collettive}} \begin{savenotes}\sphinxattablestart \centering \begin{tabulary}{\linewidth}[t]{|T|T|T|T|} \hline \sphinxstyletheadfamily \sphinxAtStartPar Data &\sphinxstyletheadfamily \sphinxAtStartPar Ora &\sphinxstyletheadfamily \sphinxAtStartPar Durata &\sphinxstyletheadfamily \sphinxAtStartPar Attività \\ \hline\sphinxstyletheadfamily &\sphinxstyletheadfamily &\sphinxstyletheadfamily \sphinxAtStartPar 1h &\sphinxstyletheadfamily \sphinxAtStartPar Totale \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}14 & \sphinxAtStartPar 10:00 & \sphinxAtStartPar 1h & \sphinxAtStartPar Sprint Retrospective session \\ \hline \end{tabulary} \par \sphinxattableend\end{savenotes} \paragraph{Attività individuali} \label{\detokenize{development/sprint2/index:attivita-individuali}} \begin{sphinxadmonition}{hint}{Suggerimento:} \sphinxAtStartPar Per vedere più in dettaglio il lavoro di sviluppo effettuato da ogni membro del gruppo, si suggerisce di visualizzare il log di Git: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{g+gp}{\PYGZdl{} }git log \end{sphinxVerbatim} \end{sphinxadmonition} \subparagraph{Stefano Goldoni} \label{\detokenize{development/sprint2/index:stefano-goldoni}} \begin{savenotes}\sphinxattablestart \centering \begin{tabulary}{\linewidth}[t]{|T|T|T|} \hline \sphinxstyletheadfamily \sphinxAtStartPar Data &\sphinxstyletheadfamily \sphinxAtStartPar Durata &\sphinxstyletheadfamily \sphinxAtStartPar Attività \\ \hline\sphinxstyletheadfamily &\sphinxstyletheadfamily \sphinxAtStartPar 16h &\sphinxstyletheadfamily \sphinxAtStartPar Totale \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}04 & \sphinxAtStartPar 1h & \sphinxAtStartPar preparazione backlog sprint 2 \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}10 & \sphinxAtStartPar 3h & \sphinxAtStartPar test sprint 2 \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}11 & \sphinxAtStartPar 2h 30m & \sphinxAtStartPar test utenti e repository \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}12 & \sphinxAtStartPar 2h & \sphinxAtStartPar test repository \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}13 & \sphinxAtStartPar 2h 30m & \sphinxAtStartPar test repository \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}14 & \sphinxAtStartPar 3h & \sphinxAtStartPar test conditions \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}15 & \sphinxAtStartPar 2h & \sphinxAtStartPar test conditions + sonarqube scanner \\ \hline \end{tabulary} \par \sphinxattableend\end{savenotes} \subparagraph{Flavia Cocca} \label{\detokenize{development/sprint2/index:flavia-cocca}} \begin{savenotes}\sphinxattablestart \centering \begin{tabulary}{\linewidth}[t]{|T|T|T|} \hline \sphinxstyletheadfamily \sphinxAtStartPar Data &\sphinxstyletheadfamily \sphinxAtStartPar Durata &\sphinxstyletheadfamily \sphinxAtStartPar Attività \\ \hline\sphinxstyletheadfamily &\sphinxstyletheadfamily \sphinxAtStartPar 16h &\sphinxstyletheadfamily \sphinxAtStartPar Totale \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}04 & \sphinxAtStartPar 30m & \sphinxAtStartPar Riunione per con PO, nuovo backlog \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}05 & \sphinxAtStartPar 1h & \sphinxAtStartPar Riunione \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}07 & \sphinxAtStartPar 3h & \sphinxAtStartPar Refactoring test \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}08 & \sphinxAtStartPar 2h & \sphinxAtStartPar Refactoring test \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}09 & \sphinxAtStartPar 3h & \sphinxAtStartPar Nuovi test \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}11 & \sphinxAtStartPar 2h 30m & \sphinxAtStartPar Discussione test e risoluzione di alcune issue \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}13 & \sphinxAtStartPar 1h & \sphinxAtStartPar Bugfixing \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}14 & \sphinxAtStartPar 1h & \sphinxAtStartPar Sprint Retrospective \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}15 & \sphinxAtStartPar 2h & \sphinxAtStartPar Documentazione \\ \hline \end{tabulary} \par \sphinxattableend\end{savenotes} \subparagraph{Stefano Pigozzi} \label{\detokenize{development/sprint2/index:stefano-pigozzi}} \begin{savenotes}\sphinxatlongtablestart\begin{longtable}[c]{|l|l|l|} \hline \sphinxstyletheadfamily \sphinxAtStartPar Data &\sphinxstyletheadfamily \sphinxAtStartPar Durata &\sphinxstyletheadfamily \sphinxAtStartPar Attività \\ \hline\sphinxstyletheadfamily &\sphinxstyletheadfamily \sphinxAtStartPar 27h 30m &\sphinxstyletheadfamily \sphinxAtStartPar Totale \\ \hline \endfirsthead \multicolumn{3}{c}% {\makebox[0pt]{\sphinxtablecontinued{\tablename\ \thetable{} \textendash{} continua dalla pagina precedente}}}\\ \hline \sphinxstyletheadfamily \sphinxAtStartPar Data &\sphinxstyletheadfamily \sphinxAtStartPar Durata &\sphinxstyletheadfamily \sphinxAtStartPar Attività \\ \hline\sphinxstyletheadfamily &\sphinxstyletheadfamily \sphinxAtStartPar 27h 30m &\sphinxstyletheadfamily \sphinxAtStartPar Totale \\ \hline \endhead \hline \multicolumn{3}{r}{\makebox[0pt][r]{\sphinxtablecontinued{continues on next page}}}\\ \endfoot \endlastfoot \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}05 & \sphinxAtStartPar 40m & \sphinxAtStartPar Riunione \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}05 & \sphinxAtStartPar 21m & \sphinxAtStartPar Documentazione \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}06 & \sphinxAtStartPar 9m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}06 & \sphinxAtStartPar 3m & \sphinxAtStartPar Configurazione Taiga \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}06 & \sphinxAtStartPar 11m & \sphinxAtStartPar Documentazione \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}06 & \sphinxAtStartPar 9m & \sphinxAtStartPar Riunione \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}06 & \sphinxAtStartPar 20m & \sphinxAtStartPar Documentazione \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}06 & \sphinxAtStartPar 39m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}06 & \sphinxAtStartPar 15m & \sphinxAtStartPar Riunione \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}06 & \sphinxAtStartPar 1h 4m & \sphinxAtStartPar Riunione \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}07 & \sphinxAtStartPar 1h 47m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}07 & \sphinxAtStartPar 17m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}07 & \sphinxAtStartPar 34m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}07 & \sphinxAtStartPar 34m & \sphinxAtStartPar Project management \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}07 & \sphinxAtStartPar 2h 44m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}08 & \sphinxAtStartPar 13m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}08 & \sphinxAtStartPar 29m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}08 & \sphinxAtStartPar 18m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}10 & \sphinxAtStartPar 1h 00m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}10 & \sphinxAtStartPar 1h 15m & \sphinxAtStartPar Configurazione GitLab \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}10 & \sphinxAtStartPar 25m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}10 & \sphinxAtStartPar 39m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}11 & \sphinxAtStartPar 25m & \sphinxAtStartPar Bugfixing \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}11 & \sphinxAtStartPar 3h 57m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}11 & \sphinxAtStartPar 1h 45m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}12 & \sphinxAtStartPar 10m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}12 & \sphinxAtStartPar 1h 51m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}13 & \sphinxAtStartPar 1h 00m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}13 & \sphinxAtStartPar 1h 20m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}14 & \sphinxAtStartPar 20m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}14 & \sphinxAtStartPar 3h 17m & \sphinxAtStartPar Documentazione \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}15 & \sphinxAtStartPar 1h 8m & \sphinxAtStartPar Porting dipendenze \\ \hline \end{longtable}\sphinxatlongtableend\end{savenotes} \subparagraph{Chiara Calzolari} \label{\detokenize{development/sprint2/index:chiara-calzolari}} \begin{savenotes}\sphinxattablestart \centering \begin{tabulary}{\linewidth}[t]{|T|T|T|} \hline \sphinxstyletheadfamily \sphinxAtStartPar Data &\sphinxstyletheadfamily \sphinxAtStartPar Durata &\sphinxstyletheadfamily \sphinxAtStartPar Attività \\ \hline\sphinxstyletheadfamily &\sphinxstyletheadfamily \sphinxAtStartPar 11h &\sphinxstyletheadfamily \sphinxAtStartPar Totale \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}03 & \sphinxAtStartPar 1h & \sphinxAtStartPar Testing frontend e segnalazione issues \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}03 & \sphinxAtStartPar 1h & \sphinxAtStartPar Modifica mockup UI (Dashboard repository) \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}04 & \sphinxAtStartPar 1h & \sphinxAtStartPar Modifica mockup UI (adeguamento al JS) \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}10 & \sphinxAtStartPar 3h & \sphinxAtStartPar Configurazione ambiente di sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}11 & \sphinxAtStartPar 1h 30m & \sphinxAtStartPar Modifica UI (traduzione in Italiano) \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}12 & \sphinxAtStartPar 30m & \sphinxAtStartPar Modifica UI (traduzione in Italiano) \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}14 & \sphinxAtStartPar 3h & \sphinxAtStartPar Realizzazione video demo sprint 2 \\ \hline \end{tabulary} \par \sphinxattableend\end{savenotes} \subparagraph{Giovanni Anniballi} \label{\detokenize{development/sprint2/index:giovanni-anniballi}} \begin{savenotes}\sphinxattablestart \centering \begin{tabulary}{\linewidth}[t]{|T|T|T|} \hline \sphinxstyletheadfamily \sphinxAtStartPar Data &\sphinxstyletheadfamily \sphinxAtStartPar Durata &\sphinxstyletheadfamily \sphinxAtStartPar Attività \\ \hline\sphinxstyletheadfamily &\sphinxstyletheadfamily \sphinxAtStartPar 17h &\sphinxstyletheadfamily \sphinxAtStartPar Totale \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}04 & \sphinxAtStartPar 30m & \sphinxAtStartPar Incontro con SM e PO per valutare quali US andranno nello sprint2 \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}05 & \sphinxAtStartPar 1h & \sphinxAtStartPar Incontro con il team \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}07 & \sphinxAtStartPar 2h & \sphinxAtStartPar Refactoring tests sugli user e primi utilizzi delle fixtures \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}08 & \sphinxAtStartPar 2h & \sphinxAtStartPar Completamento test users \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}10 & \sphinxAtStartPar 1h & \sphinxAtStartPar Ulteriori approcci (fallimentari) al coverage di SonarQube \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}11 & \sphinxAtStartPar 2h & \sphinxAtStartPar Discussione sui test e correzioni bug \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}12 & \sphinxAtStartPar 1h & \sphinxAtStartPar Test repository \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}13 & \sphinxAtStartPar 1h & \sphinxAtStartPar Generazione coverage pytest e setting sonarqube (riuscito!) \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}14 & \sphinxAtStartPar 4h & \sphinxAtStartPar Sprint review e retrospettiva, conclusione test repository \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}15 & \sphinxAtStartPar 2h & \sphinxAtStartPar generazione nuovo coverage e fix a sonarqube \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}15 & \sphinxAtStartPar 30m & \sphinxAtStartPar fix piccoli bug segnalati da sonarqube \\ \hline \end{tabulary} \par \sphinxattableend\end{savenotes} \subparagraph{Giorgio Minoccari} \label{\detokenize{development/sprint2/index:giorgio-minoccari}} \begin{savenotes}\sphinxattablestart \centering \begin{tabulary}{\linewidth}[t]{|T|T|T|} \hline \sphinxstyletheadfamily \sphinxAtStartPar Data &\sphinxstyletheadfamily \sphinxAtStartPar Durata &\sphinxstyletheadfamily \sphinxAtStartPar Attività \\ \hline\sphinxstyletheadfamily &\sphinxstyletheadfamily \sphinxAtStartPar 10h &\sphinxstyletheadfamily \sphinxAtStartPar Totale \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}04 & \sphinxAtStartPar 30m & \sphinxAtStartPar Aggiunta della condizione sull\textquotesingle{}utente \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}10 & \sphinxAtStartPar 2h & \sphinxAtStartPar Tentativo di inserimento delle query con place\_id \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}11 & \sphinxAtStartPar 1h 30m & \sphinxAtStartPar Test per passare alla versione 2.0 delle API \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}12 & \sphinxAtStartPar 1h & \sphinxAtStartPar Ritorno alla versione 1.1 perche\textquotesingle{} lascia disponibili le query sulla geolocalizzazione gratuitamente \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}14 & \sphinxAtStartPar 5h & \sphinxAtStartPar Integrazione e inserimento dei tweet catturati nel database \\ \hline \end{tabulary} \par \sphinxattableend\end{savenotes} \subparagraph{Lorenzo Balugani} \label{\detokenize{development/sprint2/index:lorenzo-balugani}} \begin{savenotes}\sphinxattablestart \centering \begin{tabulary}{\linewidth}[t]{|T|T|T|} \hline \sphinxstyletheadfamily \sphinxAtStartPar Data &\sphinxstyletheadfamily \sphinxAtStartPar Durata &\sphinxstyletheadfamily \sphinxAtStartPar Attività \\ \hline\sphinxstyletheadfamily &\sphinxstyletheadfamily \sphinxAtStartPar 19h &\sphinxstyletheadfamily \sphinxAtStartPar Totale \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}05 & \sphinxAtStartPar 4h & \sphinxAtStartPar Setup di swagger, documentazione \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}06 & \sphinxAtStartPar 4h & \sphinxAtStartPar Documentazione, sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}07 & \sphinxAtStartPar 3h & \sphinxAtStartPar Alert, documentazione \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}10 & \sphinxAtStartPar 2h & \sphinxAtStartPar Alert Put, bugfixing \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}11 & \sphinxAtStartPar 3h & \sphinxAtStartPar Bugfixing, sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}12 & \sphinxAtStartPar 3h & \sphinxAtStartPar Risolti issue pubblicati su Taiga \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}13 & \sphinxAtStartPar 1h & \sphinxAtStartPar Bugfixing \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}14 & \sphinxAtStartPar 1h & \sphinxAtStartPar Bugfixing \\ \hline \end{tabulary} \par \sphinxattableend\end{savenotes} \subsection{Sprint 3: 17 Mag \sphinxhyphen{} 30 Mag} \label{\detokenize{development/sprint3/index:sprint-3-17-mag-30-mag}}\label{\detokenize{development/sprint3/index::doc}} \subsubsection{Consegna} \label{\detokenize{development/sprint3/index:consegna}} \sphinxAtStartPar La seguente documentazione è stata fornita dal cliente durante questo sprint: \begin{itemize} \item {} \sphinxAtStartPar \sphinxcode{\sphinxupquote{3\sphinxhyphen{}sprint\sphinxhyphen{}requirements.pdf}} \item {} \sphinxAtStartPar \sphinxcode{\sphinxupquote{3\sphinxhyphen{}report.pdf}} \end{itemize} \subsubsection{Goal} \label{\detokenize{development/sprint3/index:goal}} \sphinxAtStartPar Il \sphinxstylestrong{goal} del terzo Sprint è stato far funzionare il crawler, gli alert e completare tutte i task rimanenti. \paragraph{Backlog} \label{\detokenize{development/sprint3/index:backlog}} \noindent\sphinxincludegraphics[width=400\sphinxpxdimen]{{3-backlog}.png} \paragraph{Task completati} \label{\detokenize{development/sprint3/index:task-completati}} \noindent\sphinxincludegraphics[width=400\sphinxpxdimen]{{3-tasks}.png} \subsubsection{Grooming session} \label{\detokenize{development/sprint3/index:grooming-session}} \sphinxAtStartPar Sono state definite le nuove \sphinxstylestrong{User Stories} da inserire nel progetto sulla base delle nuove richieste pervenute dal cliente: \begin{itemize} \item {} \sphinxAtStartPar analisi statistica più dettagliata \item {} \sphinxAtStartPar postare su Twitter \item {} \sphinxAtStartPar traduzione dell\textquotesingle{}interfaccia in inglese. \end{itemize} \sphinxAtStartPar La richiesta relativa alle \sphinxstyleemphasis{ricerche basate sulla geolocalizzazione}, come già comunicato al cliente, non è stata completata interamente per motivi tecnici legati a limitazioni sulle features delle \sphinxstylestrong{API 1.1 di Twitter} che non permettono di eseguire query su campi di posizione geografica. \sphinxAtStartPar Le nuove User Stories sono state valutate tramite Scrum Poker, durante il quale ogni membro ha espresso la sua valutazione. \sphinxAtStartPar Tutte le nuove richieste sono state accettate dal Product Owner e sono pronte ad essere inserite nello sprint di sviluppo in partenza. \subsubsection{Definition of Ready} \label{\detokenize{development/sprint3/index:definition-of-ready}} \sphinxAtStartPar Il team ha definito lo stato di Ready di una User Story in base ai seguenti criteri: \begin{itemize} \item {} \sphinxAtStartPar La User Story è stata compresa ed accettata da tutti i membri \item {} \sphinxAtStartPar I tester hanno confermato la possibilità di poterla testare \item {} \sphinxAtStartPar Il Product Owner ha la visione necessaria per definirne la priorità \item {} \sphinxAtStartPar Il Team è in grado di stimarla \item {} \sphinxAtStartPar La User Story è indipendente o dipendente da altre a priorità maggiore \end{itemize} \subsubsection{Definition of Done} \label{\detokenize{development/sprint3/index:definition-of-done}} \sphinxAtStartPar La definizione di Done è stata concordata da tutto il team con il Product Owner, ed è stata così definita: \begin{itemize} \item {} \sphinxAtStartPar Sviluppo completo della funzionalità richiesta \item {} \sphinxAtStartPar Definizione e superamento dei test \item {} \sphinxAtStartPar Bozza della documentazione della funzionalità \item {} \sphinxAtStartPar Merge dei sorgenti nel branch \sphinxcode{\sphinxupquote{main}} di GitLab \end{itemize} \subsubsection{Statistiche} \label{\detokenize{development/sprint3/index:statistiche}} \paragraph{Gitinspector} \label{\detokenize{development/sprint3/index:gitinspector}} \begin{sphinxadmonition}{note}{Nota:} \sphinxAtStartPar La statistica dello sprint 3 non è ancora stata generata dal prof. Marcello Missiroli. \end{sphinxadmonition} \paragraph{Schermata finale di SonarQube} \label{\detokenize{development/sprint3/index:schermata-finale-di-sonarqube}} \sphinxAtStartPar La schermata finale di SonarQube è visibile a questo link: \begin{itemize} \item {} \sphinxAtStartPar \sphinxcode{\sphinxupquote{3\sphinxhyphen{}sonarqube.pdf}} \end{itemize} \subsubsection{Final Retrospective} \label{\detokenize{development/sprint3/index:final-retrospective}}\begin{itemize} \item {} \sphinxAtStartPar \sphinxcode{\sphinxupquote{Retrospettiva finale}} \end{itemize} \subsubsection{Demo} \label{\detokenize{development/sprint3/index:demo}} \sphinxAtStartPar Il video di Demo è disponibile al seguente link: \begin{itemize} \item {} \sphinxAtStartPar \sphinxurl{https://drive.google.com/file/d/15o70Ffe51CNj8LTKHC9dGiqRVnbv9UpZ/view} \end{itemize} \subsubsection{Registro attività} \label{\detokenize{development/sprint3/index:registro-attivita}} \paragraph{Riunioni collettive} \label{\detokenize{development/sprint3/index:riunioni-collettive}} \begin{savenotes}\sphinxattablestart \centering \begin{tabulary}{\linewidth}[t]{|T|T|T|} \hline \sphinxstyletheadfamily \sphinxAtStartPar Data &\sphinxstyletheadfamily \sphinxAtStartPar Durata &\sphinxstyletheadfamily \sphinxAtStartPar Attività \\ \hline\sphinxstyletheadfamily &\sphinxstyletheadfamily \sphinxAtStartPar 3.5h &\sphinxstyletheadfamily \sphinxAtStartPar Totale \\ \hline \sphinxAtStartPar 17/05 & \sphinxAtStartPar 2.0 h & \sphinxAtStartPar Grooming session nuove richieste cliente \\ \hline \sphinxAtStartPar 29/05 & \sphinxAtStartPar 1.5 h & \sphinxAtStartPar sprint retrospective \\ \hline \end{tabulary} \par \sphinxattableend\end{savenotes} \paragraph{Attività individuali} \label{\detokenize{development/sprint3/index:attivita-individuali}} \subparagraph{Stefano Goldoni} \label{\detokenize{development/sprint3/index:stefano-goldoni}} \begin{savenotes}\sphinxattablestart \centering \begin{tabulary}{\linewidth}[t]{|T|T|T|} \hline \sphinxstyletheadfamily \sphinxAtStartPar Data &\sphinxstyletheadfamily \sphinxAtStartPar Durata &\sphinxstyletheadfamily \sphinxAtStartPar Attività \\ \hline\sphinxstyletheadfamily &\sphinxstyletheadfamily \sphinxAtStartPar 14h &\sphinxstyletheadfamily \sphinxAtStartPar Totale \\ \hline \sphinxAtStartPar 21/05 & \sphinxAtStartPar 2.0h & \sphinxAtStartPar Analisi strumenti di test frontend \\ \hline \sphinxAtStartPar 24/05 & \sphinxAtStartPar 3.0h & \sphinxAtStartPar Inizio test alerts \\ \hline \sphinxAtStartPar 25/05 & \sphinxAtStartPar 2.5h & \sphinxAtStartPar Test alerts \\ \hline \sphinxAtStartPar 26/05 & \sphinxAtStartPar 3.0h & \sphinxAtStartPar Test \\ \hline \sphinxAtStartPar 28/05 & \sphinxAtStartPar 3.5h & \sphinxAtStartPar Test, refactory in base a Sonarqube \\ \hline \end{tabulary} \par \sphinxattableend\end{savenotes} \subparagraph{Flavia Cocca} \label{\detokenize{development/sprint3/index:flavia-cocca}} \begin{savenotes}\sphinxattablestart \centering \begin{tabulary}{\linewidth}[t]{|T|T|T|} \hline \sphinxstyletheadfamily \sphinxAtStartPar Data &\sphinxstyletheadfamily \sphinxAtStartPar Durata &\sphinxstyletheadfamily \sphinxAtStartPar Attività \\ \hline\sphinxstyletheadfamily &\sphinxstyletheadfamily \sphinxAtStartPar 14h &\sphinxstyletheadfamily \sphinxAtStartPar Totale \\ \hline \sphinxAtStartPar 20/05 & \sphinxAtStartPar 2.0h & \sphinxAtStartPar Trasferimento documenti in nuova documentazione \\ \hline \sphinxAtStartPar 21/05 & \sphinxAtStartPar 1.0h & \sphinxAtStartPar Studio Sphinx \\ \hline \sphinxAtStartPar 23/05 & \sphinxAtStartPar 1.0h & \sphinxAtStartPar Studio sintassi rST \\ \hline \sphinxAtStartPar 24/05 & \sphinxAtStartPar 1.0h & \sphinxAtStartPar Documentazione \\ \hline \sphinxAtStartPar 25/05 & \sphinxAtStartPar 1.0h & \sphinxAtStartPar Documentazione \\ \hline \sphinxAtStartPar 26/05 & \sphinxAtStartPar 1.0h & \sphinxAtStartPar Documentazione \\ \hline \sphinxAtStartPar 27/05 & \sphinxAtStartPar 1.0h & \sphinxAtStartPar Documentazione \\ \hline \sphinxAtStartPar 28/05 & \sphinxAtStartPar 3.0h & \sphinxAtStartPar Documentazione \\ \hline \sphinxAtStartPar 29/05 & \sphinxAtStartPar 3.0h & \sphinxAtStartPar Documentazione \\ \hline \end{tabulary} \par \sphinxattableend\end{savenotes} \subparagraph{Chiara Calzolari} \label{\detokenize{development/sprint3/index:chiara-calzolari}} \begin{savenotes}\sphinxattablestart \centering \begin{tabulary}{\linewidth}[t]{|T|T|T|} \hline \sphinxstyletheadfamily \sphinxAtStartPar Data &\sphinxstyletheadfamily \sphinxAtStartPar Durata &\sphinxstyletheadfamily \sphinxAtStartPar Attività \\ \hline\sphinxstyletheadfamily &\sphinxstyletheadfamily \sphinxAtStartPar 17h 30m &\sphinxstyletheadfamily \sphinxAtStartPar Totale \\ \hline \sphinxAtStartPar 17/05 & \sphinxAtStartPar 3.0h & \sphinxAtStartPar Traduzione UI \\ \hline \sphinxAtStartPar 17/05 & \sphinxAtStartPar 1.5h & \sphinxAtStartPar Traduzione UI \\ \hline \sphinxAtStartPar 18/05 & \sphinxAtStartPar 1.5h & \sphinxAtStartPar Traduzione UI \\ \hline \sphinxAtStartPar 20/05 & \sphinxAtStartPar 1.0h & \sphinxAtStartPar Traduzione UI \\ \hline \sphinxAtStartPar 22/05 & \sphinxAtStartPar 1.0h & \sphinxAtStartPar Traduzione UI \\ \hline \sphinxAtStartPar 24/05 & \sphinxAtStartPar 2.0h & \sphinxAtStartPar Traduzione UI \\ \hline \sphinxAtStartPar 24/05 & \sphinxAtStartPar 1.0h & \sphinxAtStartPar Traduzione UI \\ \hline \sphinxAtStartPar 25/05 & \sphinxAtStartPar 1.0h & \sphinxAtStartPar Traduzione UI \\ \hline \sphinxAtStartPar 27/05 & \sphinxAtStartPar 0.5h & \sphinxAtStartPar Traduzione UI \\ \hline \sphinxAtStartPar 28/05 & \sphinxAtStartPar 2.0h & \sphinxAtStartPar Configurazione ambiente di sviluppo \\ \hline \sphinxAtStartPar 28/05 & \sphinxAtStartPar 3.0h & \sphinxAtStartPar Creazione video\sphinxhyphen{}demo \\ \hline \end{tabulary} \par \sphinxattableend\end{savenotes} \subparagraph{Stefano Pigozzi} \label{\detokenize{development/sprint3/index:stefano-pigozzi}} \begin{savenotes}\sphinxatlongtablestart\begin{longtable}[c]{|l|l|l|} \hline \sphinxstyletheadfamily \sphinxAtStartPar Data &\sphinxstyletheadfamily \sphinxAtStartPar Durata &\sphinxstyletheadfamily \sphinxAtStartPar Attività \\ \hline\sphinxstyletheadfamily &\sphinxstyletheadfamily \sphinxAtStartPar 50h 41m &\sphinxstyletheadfamily \sphinxAtStartPar Totale \\ \hline \endfirsthead \multicolumn{3}{c}% {\makebox[0pt]{\sphinxtablecontinued{\tablename\ \thetable{} \textendash{} continua dalla pagina precedente}}}\\ \hline \sphinxstyletheadfamily \sphinxAtStartPar Data &\sphinxstyletheadfamily \sphinxAtStartPar Durata &\sphinxstyletheadfamily \sphinxAtStartPar Attività \\ \hline\sphinxstyletheadfamily &\sphinxstyletheadfamily \sphinxAtStartPar 50h 41m &\sphinxstyletheadfamily \sphinxAtStartPar Totale \\ \hline \endhead \hline \multicolumn{3}{r}{\makebox[0pt][r]{\sphinxtablecontinued{continues on next page}}}\\ \endfoot \endlastfoot \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}17 & \sphinxAtStartPar 25m & \sphinxAtStartPar Riunione \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}17 & \sphinxAtStartPar 19m & \sphinxAtStartPar Riunione \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}17 & \sphinxAtStartPar 2h & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}17 & \sphinxAtStartPar 1h 7m & \sphinxAtStartPar Bugfixing \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}17 & \sphinxAtStartPar 7m & \sphinxAtStartPar User Interface \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}18 & \sphinxAtStartPar 55m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}18 & \sphinxAtStartPar 14m & \sphinxAtStartPar Configurazione GitLab \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}18 & \sphinxAtStartPar 1h 52m & \sphinxAtStartPar Documentazione \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}18 & \sphinxAtStartPar 22m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}18 & \sphinxAtStartPar 21m & \sphinxAtStartPar User Interface \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}18 & \sphinxAtStartPar 34m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}18 & \sphinxAtStartPar 40m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}18 & \sphinxAtStartPar 29m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}18 & \sphinxAtStartPar 1h 8m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}19 & \sphinxAtStartPar 36m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}19 & \sphinxAtStartPar 2h 40m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}19 & \sphinxAtStartPar 44m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}19 & \sphinxAtStartPar 19m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}20 & \sphinxAtStartPar 1h 26m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}20 & \sphinxAtStartPar 2h 59m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}20 & \sphinxAtStartPar 53m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}20 & \sphinxAtStartPar 18m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}21 & \sphinxAtStartPar 4h 32m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}22 & \sphinxAtStartPar 2h 28m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}23 & \sphinxAtStartPar 1h 12m & \sphinxAtStartPar Documentazione \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}23 & \sphinxAtStartPar 1h 2m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}23 & \sphinxAtStartPar 1h 13m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}23 & \sphinxAtStartPar 16m & \sphinxAtStartPar Code review \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}24 & \sphinxAtStartPar 10m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}24 & \sphinxAtStartPar 1h 46m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}24 & \sphinxAtStartPar 5m & \sphinxAtStartPar Project Management \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}24 & \sphinxAtStartPar 3m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}24 & \sphinxAtStartPar 54m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}25 & \sphinxAtStartPar 2h 13m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}25 & \sphinxAtStartPar 2h 12m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}27 & \sphinxAtStartPar 19m & \sphinxAtStartPar Sviluppo \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}27 & \sphinxAtStartPar 34m & \sphinxAtStartPar Documentazione \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}27 & \sphinxAtStartPar 1h 46m & \sphinxAtStartPar Documentazione \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}27 & \sphinxAtStartPar 33m & \sphinxAtStartPar Documentazione \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}27 & \sphinxAtStartPar 1h 34m & \sphinxAtStartPar Documentazione \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}28 & \sphinxAtStartPar 1h & \sphinxAtStartPar Documentazione \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}28 & \sphinxAtStartPar 1h 30m & \sphinxAtStartPar Documentazione \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}28 & \sphinxAtStartPar 7m & \sphinxAtStartPar Code review \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}29 & \sphinxAtStartPar 1h 38m & \sphinxAtStartPar Documentazione \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}29 & \sphinxAtStartPar 2h 39m & \sphinxAtStartPar Documentazione \\ \hline \sphinxAtStartPar 2021\sphinxhyphen{}05\sphinxhyphen{}29 & \sphinxAtStartPar 27m & \sphinxAtStartPar Deployment \\ \hline \end{longtable}\sphinxatlongtableend\end{savenotes} \subparagraph{Giovanni Anniballi} \label{\detokenize{development/sprint3/index:giovanni-anniballi}} \begin{savenotes}\sphinxattablestart \centering \begin{tabulary}{\linewidth}[t]{|T|T|T|} \hline \sphinxstyletheadfamily \sphinxAtStartPar Data &\sphinxstyletheadfamily \sphinxAtStartPar Durata &\sphinxstyletheadfamily \sphinxAtStartPar Attività \\ \hline\sphinxstyletheadfamily &\sphinxstyletheadfamily \sphinxAtStartPar 18h &\sphinxstyletheadfamily \sphinxAtStartPar Totale \\ \hline \sphinxAtStartPar 17/05 & \sphinxAtStartPar 1h & \sphinxAtStartPar Ricontrollo generale codice, fix piccoli typo \\ \hline \sphinxAtStartPar 18/05 & \sphinxAtStartPar 1h & \sphinxAtStartPar Aggiornati files di log e refactoring documentazione \\ \hline \sphinxAtStartPar 21/05 & \sphinxAtStartPar 2h & \sphinxAtStartPar Studio Jest, valutazione di test sul frontend \\ \hline \sphinxAtStartPar 24/05 & \sphinxAtStartPar 3h & \sphinxAtStartPar Primi test sulle autorizzazioni \\ \hline \sphinxAtStartPar 26/05 & \sphinxAtStartPar 2h & \sphinxAtStartPar Fix ai test \\ \hline \sphinxAtStartPar 27/05 & \sphinxAtStartPar 2h & \sphinxAtStartPar Test autorizzazioni completati, fix \\ \hline \sphinxAtStartPar 28/05 & \sphinxAtStartPar 4h & \sphinxAtStartPar Fix test malfunzionanti, refactoring test \\ \hline \sphinxAtStartPar 29/05 & \sphinxAtStartPar 3h & \sphinxAtStartPar Aggiornamento documentazione, aggiunti ulteriori test seguendo i suggerimenti di SQ \\ \hline \end{tabulary} \par \sphinxattableend\end{savenotes} \subparagraph{Giorgio Minoccari} \label{\detokenize{development/sprint3/index:giorgio-minoccari}} \begin{savenotes}\sphinxattablestart \centering \begin{tabulary}{\linewidth}[t]{|T|T|T|} \hline \sphinxstyletheadfamily \sphinxAtStartPar Data &\sphinxstyletheadfamily \sphinxAtStartPar Durata &\sphinxstyletheadfamily \sphinxAtStartPar Attività \\ \hline\sphinxstyletheadfamily &\sphinxstyletheadfamily \sphinxAtStartPar 22h &\sphinxstyletheadfamily \sphinxAtStartPar Totale \\ \hline \sphinxAtStartPar 17/05 & \sphinxAtStartPar 4h & \sphinxAtStartPar Aggiunta associazione tra singoli tweet e condizioni che ne hanno scaturito il download \\ \hline \sphinxAtStartPar 18/05 & \sphinxAtStartPar 3h & \sphinxAtStartPar Aggiunto salvataggio delle immagini presenti nei tweet e data in cui sono stati postati \\ \hline \sphinxAtStartPar 20/05 & \sphinxAtStartPar 3h & \sphinxAtStartPar Ristrutturazione del crawler in uno script lanciabile separatamente su tutte le repository \\ \hline \sphinxAtStartPar 21/05 & \sphinxAtStartPar 2h & \sphinxAtStartPar Aggiunta degli alert e delle azioni che vengono svolte quando scatta il trigger \\ \hline \sphinxAtStartPar 24/05 & \sphinxAtStartPar 2h & \sphinxAtStartPar Bugfixing \\ \hline \sphinxAtStartPar 25/05 & \sphinxAtStartPar 4h & \sphinxAtStartPar Refactoring di sicurezza \\ \hline \sphinxAtStartPar 27/05 & \sphinxAtStartPar 3h & \sphinxAtStartPar Refactor struttura per poter associare le condizioni degli allarmi ai singoli tweet \\ \hline \sphinxAtStartPar 28/05 & \sphinxAtStartPar 6h & \sphinxAtStartPar Completamento generale e bugfixing \\ \hline \end{tabulary} \par \sphinxattableend\end{savenotes} \subparagraph{Lorenzo Balugani} \label{\detokenize{development/sprint3/index:lorenzo-balugani}} \begin{savenotes}\sphinxattablestart \centering \begin{tabulary}{\linewidth}[t]{|T|T|T|} \hline \sphinxstyletheadfamily \sphinxAtStartPar Data &\sphinxstyletheadfamily \sphinxAtStartPar Durata &\sphinxstyletheadfamily \sphinxAtStartPar Attività \\ \hline\sphinxstyletheadfamily &\sphinxstyletheadfamily \sphinxAtStartPar 22h &\sphinxstyletheadfamily \sphinxAtStartPar Totale \\ \hline \sphinxAtStartPar 17/05 & \sphinxAtStartPar 4h & \sphinxAtStartPar Bugfixing, supporto alla localizzazione degli errori \\ \hline \sphinxAtStartPar 18/05 & \sphinxAtStartPar 3h & \sphinxAtStartPar Bugfixing \\ \hline \sphinxAtStartPar 20/05 & \sphinxAtStartPar 3h & \sphinxAtStartPar API autorizzazioni, refactoring \\ \hline \sphinxAtStartPar 21/05 & \sphinxAtStartPar 2h & \sphinxAtStartPar Gestione tweet, rappresentazione tweet \\ \hline \sphinxAtStartPar 24/05 & \sphinxAtStartPar 2h & \sphinxAtStartPar Bugfixing \\ \hline \sphinxAtStartPar 25/05 & \sphinxAtStartPar 4h & \sphinxAtStartPar Docs, refactoring \\ \hline \sphinxAtStartPar 27/05 & \sphinxAtStartPar 3h & \sphinxAtStartPar Bugfixing \\ \hline \sphinxAtStartPar 28/05 & \sphinxAtStartPar 6h & \sphinxAtStartPar Bugfixing \\ \hline \end{tabulary} \par \sphinxattableend\end{savenotes} \section{Burndown chart complessiva} \label{\detokenize{development/process:burndown-chart-complessiva}} \noindent\sphinxincludegraphics{{Burndown4}.png} \chapter{Artefatti} \label{\detokenize{development/artifacts:artefatti}}\label{\detokenize{development/artifacts::doc}} \sphinxAtStartPar Gran parte degli artefatti sono stati elencati nei singoli sprint. \sphinxAtStartPar Vengono di seguito elencati alcuni artefatti che non sono stati precedentemente elencati: \section{Diagrammi UML} \label{\detokenize{development/artifacts:diagrammi-uml}} \sphinxAtStartPar Per la realizzazione dei diagrammi UML, utili nelle fasi iniziali di progettazione di N.E.S.T., è stato utilizzato DrawIO (oggi diagrams.net). Si allega il file con il progetto UML. \begin{itemize} \item {} \sphinxAtStartPar \sphinxcode{\sphinxupquote{Diagrammi UML}} \end{itemize} \sphinxAtStartPar Dopo aver scaricato il file, recarsi su \sphinxurl{https://app.diagrams.net/} e tramite il menù \sphinxcode{\sphinxupquote{File \(\rightarrow\) Open from \(\rightarrow\) Device...}} caricare il file appena scaricato. \section{Demo} \label{\detokenize{development/artifacts:demo}} \subsection{Video} \label{\detokenize{development/artifacts:video}} \sphinxAtStartPar Il video di demo è disponibile al seguente URL: \begin{itemize} \item {} \sphinxAtStartPar \sphinxurl{https://drive.google.com/file/d/15o70Ffe51CNj8LTKHC9dGiqRVnbv9UpZ/view} \end{itemize} \subsection{Interattiva} \label{\detokenize{development/artifacts:interattiva}} \sphinxAtStartPar Una demo interattiva è disponibile ai seguenti URL: \begin{itemize} \item {} \sphinxAtStartPar \sphinxurl{https://api.nest.steffo.eu/} (backend) \item {} \sphinxAtStartPar \sphinxurl{https://prod.nest.steffo.eu/} (frontend pre\sphinxhyphen{}popolato) \item {} \sphinxAtStartPar \sphinxurl{https://docs.nest.steffo.eu/} (documentazione e relazione) \end{itemize} \chapter{Conclusioni} \label{\detokenize{development/conclusions:conclusioni}}\label{\detokenize{development/conclusions::doc}}\begin{itemize} \item {} \sphinxAtStartPar Il team dimostra di aver \sphinxstylestrong{imparato numerose nuove nozioni}, acquisendo dimestichezza con vari linguaggi e software, come: \begin{itemize} \item {} \sphinxAtStartPar Python \item {} \sphinxAtStartPar NodeJS \item {} \sphinxAtStartPar reStructuredText \item {} \sphinxAtStartPar IntelliJ IDEA \item {} \sphinxAtStartPar Taiga \item {} \sphinxAtStartPar Git \item {} \sphinxAtStartPar GitLab \item {} \sphinxAtStartPar SystemD \item {} \sphinxAtStartPar \sphinxstyleemphasis{Twitter} \end{itemize} \item {} \sphinxAtStartPar Il team ritiene che l\textquotesingle{}\sphinxstylestrong{organizzazione e collaborazione} tra tutti i membri del gruppo è stata eccellente: \begin{itemize} \item {} \sphinxAtStartPar Ciascuno aveva un suo compito e non sono sorti conflitti. \item {} \sphinxAtStartPar L\textquotesingle{}organizzazione strutturata ci ha permesso di procedere a ritmo sostenuto dall\textquotesingle{}inizio alla fine, realizzando un prodotto efficace e modulare. \end{itemize} \item {} \sphinxAtStartPar Parte del team ritiene che \sphinxstylestrong{alcune attività}, come le varie riunioni, \sphinxstylestrong{sarebbero state più edificanti e veloci} se fossero state effettuate in presenza, purtroppo la pandemia e la distanza non lo hanno reso possibile. \item {} \sphinxAtStartPar Parte del team ritiene invece che il \sphinxstylestrong{lavoro a distanza} ci ha permesso di adottare metodi migliori di \sphinxstylestrong{comunicazione asincrona}, permettendo ai membri di lavorare indipendentemente uno dall\textquotesingle{}altro in base alle proprie disponibilità di tempo. \end{itemize} \chapter{Suggerimenti relativi al corso} \label{\detokenize{development/suggestions:suggerimenti-relativi-al-corso}}\label{\detokenize{development/suggestions::doc}}\begin{itemize} \item {} \sphinxAtStartPar Il team concorda sull\textquotesingle{}\sphinxstylestrong{utilità del progetto} poiché permette di utilizzare le nozioni viste a lezione nella pratica, facendo quindi esperienza sulle varie metodologie da adottare e le varie problematiche in cui si può incorrere. \item {} \sphinxAtStartPar Il team concorda nel dire che \sphinxstylestrong{il progetto è eccessivamente corposo}: \begin{itemize} \item {} \sphinxAtStartPar Tecnicamente a 6 CFU dovrebbero corrispondere circa 125 ore di lavoro, mentre questo progetto ne ha richieste molte di più. \item {} \sphinxAtStartPar Suggeriamo quindi di \sphinxstylestrong{alleggerire significativamente il carico di lavoro}, e renderlo più proporzionato ai crediti previsti. \end{itemize} \item {} \sphinxAtStartPar Il team suggerisce di lasciare agli studenti \sphinxstylestrong{scelta completamente libera sugli strumenti da adottare}, in quanto si sono verificati svariati problemi con quelli previsti dal corso: \begin{itemize} \item {} \sphinxAtStartPar Le istanze di Taiga, GitLab e SonarQube ospitate dall\textquotesingle{}Università si sono dimostrate inaffidabili, portando il team a dover ospitare le proprie e quindi a perderci una fetta significativa del proprio tempo. \begin{itemize} \item {} \sphinxAtStartPar CAS è supportato solo su Debian, e lo script di installazione esegue operazioni con effetti collaterali sul Docker del sistema host. \item {} \sphinxAtStartPar L\textquotesingle{}installazione di Taiga tramite Docker Compose ha richiesto 5 ore, in quanto una race condition presente nel file \sphinxcode{\sphinxupquote{docker\sphinxhyphen{}compose.yml}} impediva al software di raggiungere il database. \item {} \sphinxAtStartPar L\textquotesingle{}installazione e manutenzione di GitLab ha richiesto 5 ore, e richiede competenze di amministrazione di sistema avanzate che sono oltre il livello dello studente medio del terzo anno di Informatica. \end{itemize} \item {} \sphinxAtStartPar Taiga, per quanto funzionale, è un po\textquotesingle{} acerbo a livello di User Experience, il che ha portato a svariati grattacapi durante il suo utilizzo da parte del team. \begin{itemize} \item {} \sphinxAtStartPar Inoltre, è in parte superfluo: quasi tutte le funzionalità che fornisce sono già implementate sui sistemi di issues di GitHub e GitLab. \end{itemize} \item {} \sphinxAtStartPar Utilizzare GitLab invece che il più popolare GitHub impedisce di sfruttare la licenza gratuita o \sphinxhref{https://education.github.com/pack}{universitaria} di numerosi strumenti di Continuous Integration e Deployment, quali \sphinxhref{https://github.com/features/actions}{GitHub Actions}, \sphinxhref{https://readthedocs.org/}{Read the Docs} e \sphinxhref{https://render.com/}{Render}. \item {} \sphinxAtStartPar SonarQube, per quanto semplice da installare, è molto complesso da utilizzare: il team ha necessitato di parecchie ore per capirne il funzionamento. \begin{itemize} \item {} \sphinxAtStartPar È forse anche superfluo: tutte le issues che ha segnalato erano già state segnalate in precedenza dal sistema di linting di IntelliJ IDEA Ultimate. \end{itemize} \end{itemize} \item {} \sphinxAtStartPar Il team concorda nel dire che sarebbe molto utile la \sphinxstylestrong{partecipazione diretta del prof} durante le prime fasi di progetto, all\textquotesingle{}inizio del lavoro, per instradare il gruppo nella giusta direzione ed evitare l\textquotesingle{}effetto "salto nel buio": \begin{itemize} \item {} \sphinxAtStartPar Sarebbe stato piacevole avere una spiegazione più dettagliata delle regole dello Scrumble, e soprattutto sul come giocarlo a distanza. \item {} \sphinxAtStartPar Sarebbero state utili lezioni più specifica sui tool da utilizzare, come SonarQube. \end{itemize} \end{itemize} \chapter{Meta\sphinxhyphen{}documentazione} \label{\detokenize{code/meta/index:meta-documentazione}}\label{\detokenize{code/meta/index::doc}} \sphinxAtStartPar La documentazione è scritta in \sphinxhref{https://docutils.sourceforge.io/rst.html}{reStructuredText}, ed è generata con \sphinxhref{https://www.sphinx-doc.org/en/master/}{Sphinx}. \sphinxAtStartPar I dati relativi alla documentazione si trovano nella directory standard \sphinxcode{\sphinxupquote{/docs}}; in particolare, le sorgenti reStructuredText si trovano in \sphinxcode{\sphinxupquote{/docs/source}}, mentre l\textquotesingle{}ultima versione compilata si trova in \sphinxcode{\sphinxupquote{/docs/build}}. \sphinxAtStartPar Questa struttura permetterebbe l\textquotesingle{}integrazione con lo strumento di "Continuous Documentation" \sphinxhref{https://readthedocs.com/}{ReadTheDocs}, qualora il progetto fosse ospitato su GitHub o disponessimo di una licenza almeno \sphinxhref{https://readthedocs.com/pricing/}{Basic}. \section{Compilazione con IntelliJ IDEA} \label{\detokenize{code/meta/index:compilazione-con-intellij-idea}} \sphinxAtStartPar È possibile compilare manualmente la documentazione con IntelliJ IDEA. \sphinxAtStartPar Su sistemi Linux, è disponibile la Run Configuration \sphinxcode{\sphinxupquote{Docs}}, che compilerà la versione HTML della documentazione se eseguita. \noindent\sphinxincludegraphics{{docsRunConfig}.png} \section{Compilazione con GNU Make} \label{\detokenize{code/meta/index:compilazione-con-gnu-make}} \sphinxAtStartPar È possibile compilare manualmente la documentazione con GNU Make. \sphinxAtStartPar Come prima cosa, è necessario {\hyperref[\detokenize{guide/installation:installare-le-dipendenze-python}]{\sphinxcrossref{\DUrole{std,std-ref}{Installare le dipendenze Python}}}} del progetto: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{g+gp}{user:g2\PYGZhy{}progetto\PYGZdl{} }poetry install \end{sphinxVerbatim} \sphinxAtStartPar Poi, si entri all\textquotesingle{}interno del virtual environment: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{g+gp}{user:g2\PYGZhy{}progetto\PYGZdl{} }poetry shell \end{sphinxVerbatim} \sphinxAtStartPar Una volta all\textquotesingle{}interno del venv, si entri nella cartella della documentazione: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{g+gp}{user:g2\PYGZhy{}progetto\PYGZdl{} }\PYG{n+nb}{cd} docs \end{sphinxVerbatim} \sphinxAtStartPar Infine, si esegua il target \sphinxcode{\sphinxupquote{html}} del Makefile: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{g+gp}{user:g2\PYGZhy{}progetto/docs\PYGZdl{} }make html \end{sphinxVerbatim} \section{Compilazione con Windows Powershell} \label{\detokenize{code/meta/index:compilazione-con-windows-powershell}} \sphinxAtStartPar È possibile compilare manualmente la documentazione con Windows Powershell. \sphinxAtStartPar Come prima cosa, è necessario {\hyperref[\detokenize{guide/installation:installare-le-dipendenze-python}]{\sphinxcrossref{\DUrole{std,std-ref}{Installare le dipendenze Python}}}} del progetto: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{g+gp}{g2\PYGZhy{}progetto\PYGZgt{}} poetry install \end{sphinxVerbatim} \sphinxAtStartPar Poi, si entri all\textquotesingle{}interno del virtual environment: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{g+gp}{g2\PYGZhy{}progetto\PYGZgt{}} poetry shell \end{sphinxVerbatim} \sphinxAtStartPar Una volta all\textquotesingle{}interno del venv, si entri nella cartella della documentazione: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{g+gp}{g2\PYGZhy{}progetto\PYGZgt{}} \PYG{k}{cd} docs \end{sphinxVerbatim} \sphinxAtStartPar Infine, si esegua lo script \sphinxcode{\sphinxupquote{make.bat}} con il parametro \sphinxcode{\sphinxupquote{html}}: \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{g+gp}{g2\PYGZhy{}progetto/docs\PYGZgt{}} make html \end{sphinxVerbatim} \chapter{Struttura del database} \label{\detokenize{code/database/index:struttura-del-database}}\label{\detokenize{code/database/index::doc}}\index{Alert (classe built\sphinxhyphen{}in)@\spxentry{Alert}\spxextra{classe built\sphinxhyphen{}in}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/database/index:Alert}}\pysigline{\sphinxbfcode{\sphinxupquote{class }}\sphinxbfcode{\sphinxupquote{Alert}}} \sphinxAtStartPar Un alert è un allarme impostato da un utente che si "attiva" quando un numero di tweet che rispetta certe condizioni (poste in and oppure or) supera una certa soglia, indicata dall\textquotesingle{}utente. \sphinxAtStartPar Ogni volta che l\textquotesingle{}alert si attiva, viene creata una "notifica", ovvero una entry nella tabella Notifications. Questo permette di tenere conto del numero di volte in cui l\textquotesingle{}alert viene triggerato. \sphinxAtStartPar Gli alert sono legati al repository di appartenenza, e quando uno di essi viene allertato viene inviata una mail all\textquotesingle{}admin e pubblicato un tweet sull\textquotesingle{}account Twitter usato per le analisi. \sphinxAtStartPar La tabella alert contiene le seguenti colonne: \begin{savenotes}\sphinxattablestart \raggedright \begin{tabulary}{\linewidth}[t]{|T|T|} \hline \sphinxstyletheadfamily &\sphinxstyletheadfamily \sphinxAtStartPar Definizioni \\ \hline\sphinxstyletheadfamily \sphinxAtStartPar id (INTEGER, PK) & \sphinxAtStartPar l\textquotesingle{}identificativo dell\textquotesingle{}alert \\ \hline\sphinxstyletheadfamily \sphinxAtStartPar name (VARCHAR, NOT NULL) & \sphinxAtStartPar il nome dell\textquotesingle{}alert \\ \hline\sphinxstyletheadfamily \sphinxAtStartPar limit (INTEGER, NOT NULL) & \sphinxAtStartPar il numero di tweet che innescano l\textquotesingle{}alert \\ \hline\sphinxstyletheadfamily \sphinxAtStartPar window\_size (INTEGER, NOT NULL) & \sphinxAtStartPar numero di ore in cui il limit può venire superato \\ \hline\sphinxstyletheadfamily \sphinxAtStartPar evaluation\_mode (ENUM/SMALLINT, NOT NULL) & \sphinxAtStartPar può essere posto a all\_or oppure all\_not \\ \hline\sphinxstyletheadfamily \sphinxAtStartPar repository\_id (INTEGER, FK, NOT NULL) &\\ \hline \end{tabulary} \par \sphinxattableend\end{savenotes} \end{fulllineitems} \index{Authorization (classe built\sphinxhyphen{}in)@\spxentry{Authorization}\spxextra{classe built\sphinxhyphen{}in}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/database/index:Authorization}}\pysigline{\sphinxbfcode{\sphinxupquote{class }}\sphinxbfcode{\sphinxupquote{Authorization}}} \sphinxAtStartPar Una autorizzazione è un\textquotesingle{}entità che rappresenta il permesso, concesso dal creatore del repository ad un altro utente, di ispezionare il contenuto di un repo e di eseguire analisi su di esso. \sphinxAtStartPar La tabella authorization contiene le seguenti colonne: \begin{savenotes}\sphinxattablestart \raggedright \begin{tabulary}{\linewidth}[t]{|T|T|} \hline \sphinxstyletheadfamily &\sphinxstyletheadfamily \sphinxAtStartPar Definizioni \\ \hline\sphinxstyletheadfamily \sphinxAtStartPar rid (INTEGER, PK, FK) & \sphinxAtStartPar id del repository \\ \hline\sphinxstyletheadfamily \sphinxAtStartPar email (VARCHAR, PK, FK) & \sphinxAtStartPar email dell\textquotesingle{}utente \\ \hline \end{tabulary} \par \sphinxattableend\end{savenotes} \end{fulllineitems} \index{Composed (classe built\sphinxhyphen{}in)@\spxentry{Composed}\spxextra{classe built\sphinxhyphen{}in}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/database/index:Composed}}\pysigline{\sphinxbfcode{\sphinxupquote{class }}\sphinxbfcode{\sphinxupquote{Composed}}} \sphinxAtStartPar Composed è una tabella le cui righe indicano l\textquotesingle{}appartenenza di un Tweet ad un certo repository. \sphinxAtStartPar La tabella Composed contiene le seguenti colonne: \begin{savenotes}\sphinxattablestart \raggedright \begin{tabulary}{\linewidth}[t]{|T|T|} \hline \sphinxstyletheadfamily &\sphinxstyletheadfamily \sphinxAtStartPar Definizioni \\ \hline\sphinxstyletheadfamily \sphinxAtStartPar rid (INTEGER, PK, FK) & \sphinxAtStartPar id del repository \\ \hline\sphinxstyletheadfamily \sphinxAtStartPar snowflake (VARCHAR, PK, FK) & \sphinxAtStartPar id del tweet \\ \hline \end{tabulary} \par \sphinxattableend\end{savenotes} \end{fulllineitems} \index{Condition (classe built\sphinxhyphen{}in)@\spxentry{Condition}\spxextra{classe built\sphinxhyphen{}in}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/database/index:Condition}}\pysigline{\sphinxbfcode{\sphinxupquote{class }}\sphinxbfcode{\sphinxupquote{Condition}}} \sphinxAtStartPar Una condizione è un elemento che viene usato da repository e alert per cercare e classificare i tweet. \sphinxAtStartPar Le condizioni possono essere di diversi tipi: \begin{itemize} \item {} \sphinxAtStartPar \sphinxstylestrong{hashtag}: valore \sphinxcode{\sphinxupquote{0}}, richiede che il tweet contenga un dato hashtag \item {} \sphinxAtStartPar \sphinxstylestrong{time}: valore \sphinxcode{\sphinxupquote{2}}, richiede che il tweet sia stato pubblicato prima o dopo una certa data \item {} \sphinxAtStartPar \sphinxstylestrong{coordinates}: valore \sphinxcode{\sphinxupquote{3}}, richiede che il tweet sia stato pubblicato entro un certo raggio da delle coordinate \item {} \sphinxAtStartPar \sphinxstylestrong{user}: valore \sphinxcode{\sphinxupquote{5}}, richiede che il tweet sia stato pubblicato da un dato utente \end{itemize} \sphinxAtStartPar La tabella condition contiene le seguenti colonne: \begin{savenotes}\sphinxattablestart \raggedright \begin{tabulary}{\linewidth}[t]{|T|T|} \hline \sphinxstyletheadfamily &\sphinxstyletheadfamily \sphinxAtStartPar Definizioni \\ \hline\sphinxstyletheadfamily \sphinxAtStartPar id (INTEGER, PK) & \sphinxAtStartPar id della condition \\ \hline\sphinxstyletheadfamily \sphinxAtStartPar type (ENUM/SMALLINT, NOT NULL) & \sphinxAtStartPar tipo del contenuto \\ \hline\sphinxstyletheadfamily \sphinxAtStartPar content (VARCHAR, NOT NULL) & \sphinxAtStartPar contenuto della condition \\ \hline\sphinxstyletheadfamily \sphinxAtStartPar repository\_id (INTEGER, FK, NOT NULL) &\\ \hline \end{tabulary} \par \sphinxattableend\end{savenotes} \end{fulllineitems} \index{Contains (classe built\sphinxhyphen{}in)@\spxentry{Contains}\spxextra{classe built\sphinxhyphen{}in}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/database/index:Contains}}\pysigline{\sphinxbfcode{\sphinxupquote{class }}\sphinxbfcode{\sphinxupquote{Contains}}} \sphinxAtStartPar Contains è una tabella le cui righe indicano la presenza di una certa condition rispetto ad un certo tweet. \sphinxAtStartPar La tabella contains contiene le seguenti colonne: \begin{savenotes}\sphinxattablestart \raggedright \begin{tabulary}{\linewidth}[t]{|T|T|} \hline \sphinxstyletheadfamily &\sphinxstyletheadfamily \sphinxAtStartPar Definizioni \\ \hline\sphinxstyletheadfamily \sphinxAtStartPar cid (INTEGER, PK, FK) & \sphinxAtStartPar id della condition \\ \hline\sphinxstyletheadfamily \sphinxAtStartPar snowflake (VARCHAR, PK, FK) & \sphinxAtStartPar id del tweet \\ \hline \end{tabulary} \par \sphinxattableend\end{savenotes} \end{fulllineitems} \index{MadeOf (classe built\sphinxhyphen{}in)@\spxentry{MadeOf}\spxextra{classe built\sphinxhyphen{}in}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/database/index:MadeOf}}\pysigline{\sphinxbfcode{\sphinxupquote{class }}\sphinxbfcode{\sphinxupquote{MadeOf}}} \sphinxAtStartPar MadeOf è una tabella le cui righe indicano il legame tra un alert e una certa condition. \sphinxAtStartPar La tabella madeof contiene le seguenti colonne: \begin{savenotes}\sphinxattablestart \raggedright \begin{tabulary}{\linewidth}[t]{|T|T|} \hline \sphinxstyletheadfamily &\sphinxstyletheadfamily \sphinxAtStartPar Definizioni \\ \hline\sphinxstyletheadfamily \sphinxAtStartPar aid (INTEGER, PK, FK) & \sphinxAtStartPar id dell\textquotesingle{}alert \\ \hline\sphinxstyletheadfamily \sphinxAtStartPar cid (INTEGER, PK, FK) & \sphinxAtStartPar id della condition \\ \hline \end{tabulary} \par \sphinxattableend\end{savenotes} \end{fulllineitems} \index{Notification (classe built\sphinxhyphen{}in)@\spxentry{Notification}\spxextra{classe built\sphinxhyphen{}in}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/database/index:Notification}}\pysigline{\sphinxbfcode{\sphinxupquote{class }}\sphinxbfcode{\sphinxupquote{Notification}}} \sphinxAtStartPar Una notification è un\textquotesingle{}entità che consente di tenere traccia del momento in cui un certo alert si è attivato per l\textquotesingle{}ultima volta. \sphinxAtStartPar La tabella notification contiene le seguenti colonne: \begin{savenotes}\sphinxattablestart \raggedright \begin{tabulary}{\linewidth}[t]{|T|T|} \hline \sphinxstyletheadfamily &\sphinxstyletheadfamily \sphinxAtStartPar Definizioni \\ \hline\sphinxstyletheadfamily \sphinxAtStartPar id (INTEGER, PK) & \sphinxAtStartPar id della notifica \\ \hline\sphinxstyletheadfamily \sphinxAtStartPar ora (TIMESTAMP, NOT NULL) & \sphinxAtStartPar timestamp di attivazione \\ \hline\sphinxstyletheadfamily \sphinxAtStartPar alert\_id (INTEGER, FK, NOT NULL) &\\ \hline \end{tabulary} \par \sphinxattableend\end{savenotes} \end{fulllineitems} \index{Repository (classe built\sphinxhyphen{}in)@\spxentry{Repository}\spxextra{classe built\sphinxhyphen{}in}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/database/index:Repository}}\pysigline{\sphinxbfcode{\sphinxupquote{class }}\sphinxbfcode{\sphinxupquote{Repository}}} \sphinxAtStartPar Un repository è un "contenitore" di tweet, a cui sono legati alert, autorizzazioni di lettura e condizioni. \sphinxAtStartPar Le condizioni possono essere messe in and oppure or, inoltre un repository può venire archiviato prima divenire eliminato. Quando un repository non è archiviato, questo viene riempito di tweet su base oraria, cosa che non accade se viene archiviato. \sphinxAtStartPar La tabella repository contiene le seguenti colonne: \begin{savenotes}\sphinxattablestart \raggedright \begin{tabulary}{\linewidth}[t]{|T|T|} \hline \sphinxstyletheadfamily &\sphinxstyletheadfamily \sphinxAtStartPar Definizioni \\ \hline\sphinxstyletheadfamily \sphinxAtStartPar id (INTEGER, PK) & \sphinxAtStartPar id del repository \\ \hline\sphinxstyletheadfamily \sphinxAtStartPar name (VARCHAR, NOT NULL) & \sphinxAtStartPar nome del repository \\ \hline\sphinxstyletheadfamily \sphinxAtStartPar start (TIMESTAMP) & \sphinxAtStartPar timestamp di partenza del repository \\ \hline\sphinxstyletheadfamily \sphinxAtStartPar end (TIMESTAMP) & \sphinxAtStartPar timestamp di chiusura del repository \\ \hline\sphinxstyletheadfamily \sphinxAtStartPar is\_active (BOOLEAN, NOT NULL) & \sphinxAtStartPar flag per segnalare se il repo è aperto o meno \\ \hline\sphinxstyletheadfamily \sphinxAtStartPar evaluation\_mode (ENUM/SMALLINT, NOT NULL) & \sphinxAtStartPar può essere posto a all\_or oppure all\_not \\ \hline\sphinxstyletheadfamily \sphinxAtStartPar owner\_id (VARCHAR, FK, NOT NULL) & \sphinxAtStartPar email del proprietario \\ \hline\sphinxstyletheadfamily \sphinxAtStartPar is\_deleted (BOOLEAN, NOT NULL) & \sphinxAtStartPar flag per segnalare se l\textquotesingle{}oggetto è eliminato o meno \\ \hline \end{tabulary} \par \sphinxattableend\end{savenotes} \end{fulllineitems} \index{Tweet (classe built\sphinxhyphen{}in)@\spxentry{Tweet}\spxextra{classe built\sphinxhyphen{}in}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/database/index:Tweet}}\pysigline{\sphinxbfcode{\sphinxupquote{class }}\sphinxbfcode{\sphinxupquote{Tweet}}} \sphinxAtStartPar Un tweet è un\textquotesingle{}entità che viene raccolta dal componente crawler, e quando viene inserita nella base di dati viene legata ad un repository e alle condition che contiene. Un tweet contiene informazioni relativamente a chi l\textquotesingle{}ha creato, eventuali immagini, il tempo di creazione, il tempo di inserimento nel db e l\textquotesingle{}opzionale posizione legata al tweet. \sphinxAtStartPar La tabella tweet contiene le seguenti colonne: \begin{savenotes}\sphinxattablestart \raggedright \begin{tabulary}{\linewidth}[t]{|T|T|} \hline \sphinxstyletheadfamily &\sphinxstyletheadfamily \sphinxAtStartPar Definizioni \\ \hline\sphinxstyletheadfamily \sphinxAtStartPar snowflake (VARCHAR, PK) & \sphinxAtStartPar id univoco del tweet \\ \hline\sphinxstyletheadfamily \sphinxAtStartPar content (VARCHAR) & \sphinxAtStartPar contenuto del tweet \\ \hline\sphinxstyletheadfamily \sphinxAtStartPar location (VARCHAR) & \sphinxAtStartPar stringa contenente informazioni sulla posizione \\ \hline\sphinxstyletheadfamily \sphinxAtStartPar place (VARCHAR) & \sphinxAtStartPar riservato per sviluppi futuri \\ \hline\sphinxstyletheadfamily \sphinxAtStartPar poster (VARCHAR) & \sphinxAtStartPar informazioni sull\textquotesingle{}utente che ha creato il tweet \\ \hline\sphinxstyletheadfamily \sphinxAtStartPar insert\_time (TIMESTAMP, NOT NULL) & \sphinxAtStartPar timestamp dell\textquotesingle{}inserimento del tweet \\ \hline\sphinxstyletheadfamily \sphinxAtStartPar image\_url (VARCHAR) & \sphinxAtStartPar link alle immagini, se presenti \\ \hline\sphinxstyletheadfamily \sphinxAtStartPar post\_time (TIMESTAMP) & \sphinxAtStartPar timestamp relativo all\textquotesingle{}invio del tweet \\ \hline \end{tabulary} \par \sphinxattableend\end{savenotes} \end{fulllineitems} \index{User (classe built\sphinxhyphen{}in)@\spxentry{User}\spxextra{classe built\sphinxhyphen{}in}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/database/index:User}}\pysigline{\sphinxbfcode{\sphinxupquote{class }}\sphinxbfcode{\sphinxupquote{User}}} \sphinxAtStartPar Uno user è l\textquotesingle{}utilizzatore della piattaforma. \sphinxAtStartPar E\textquotesingle{} presente di default un utente admin, il quale può creare nuovi utenti. \sphinxAtStartPar La tabella user contiene le seguenti colonne: \begin{savenotes}\sphinxattablestart \raggedright \begin{tabulary}{\linewidth}[t]{|T|T|} \hline \sphinxstyletheadfamily &\sphinxstyletheadfamily \sphinxAtStartPar Definizioni \\ \hline\sphinxstyletheadfamily \sphinxAtStartPar email (VARCHAR, PK) & \sphinxAtStartPar email dell\textquotesingle{}utente \\ \hline\sphinxstyletheadfamily \sphinxAtStartPar username (VARCHAR, NOT NULL) & \sphinxAtStartPar username dell\textquotesingle{}utente \\ \hline\sphinxstyletheadfamily \sphinxAtStartPar password (BYTEARRAY, NOT NULL) & \sphinxAtStartPar sale della password, codificata usando l\textquotesingle{}algoritmo bcrypt \\ \hline\sphinxstyletheadfamily \sphinxAtStartPar isAdmin (BOOLEAN, NOT NULL) & \sphinxAtStartPar true se l\textquotesingle{}utente è admin \\ \hline \end{tabulary} \par \sphinxattableend\end{savenotes} \end{fulllineitems} \chapter{\sphinxstyleliteralintitle{\sphinxupquote{nest\_backend}} \sphinxhyphen{} Web API in Python} \label{\detokenize{code/backend/index:module-nest_backend}}\label{\detokenize{code/backend/index:nest-backend-web-api-in-python}}\label{\detokenize{code/backend/index::doc}}\index{modulo@\spxentry{modulo}!nest\_backend@\spxentry{nest\_backend}}\index{nest\_backend@\spxentry{nest\_backend}!modulo@\spxentry{modulo}} \section{\sphinxstyleliteralintitle{\sphinxupquote{.gestione}} \sphinxhyphen{} Metodi di utility} \label{\detokenize{code/backend/index:module-nest_backend.gestione}}\label{\detokenize{code/backend/index:gestione-metodi-di-utility}}\index{modulo@\spxentry{modulo}!nest\_backend.gestione@\spxentry{nest\_backend.gestione}}\index{nest\_backend.gestione@\spxentry{nest\_backend.gestione}!modulo@\spxentry{modulo}} \sphinxAtStartPar Gestione adds many fancy thingamajigs to the flask application, such as a login system and such. \index{authenticate() (nel modulo nest\_backend.gestione)@\spxentry{authenticate()}\spxextra{nel modulo nest\_backend.gestione}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.gestione.authenticate}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{nest\_backend.gestione.}}\sphinxbfcode{\sphinxupquote{authenticate}}}{\emph{\DUrole{n}{username}}, \emph{\DUrole{n}{password}}}{} \sphinxAtStartPar Authentication method. It checks if the combination of username+password is a valid match. If not, it returns None. :param username: the user\textquotesingle{}s email :param password: the user\textquotesingle{}s password :return: if the credentials are correct, it returns the user. Else, it returns None. \end{fulllineitems} \index{identity() (nel modulo nest\_backend.gestione)@\spxentry{identity()}\spxextra{nel modulo nest\_backend.gestione}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.gestione.identity}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{nest\_backend.gestione.}}\sphinxbfcode{\sphinxupquote{identity}}}{\emph{\DUrole{n}{payload}}}{} \sphinxAtStartPar Authentication verification method. It checks if the user is in fact registered on the server. It is required by Flask\sphinxhyphen{}JWT, and shouldnt be used alone. :param payload: the reqest payload. :return: an User or None. It depends whether the user is actually registered on the platform. \end{fulllineitems} \index{gen\_password() (nel modulo nest\_backend.gestione)@\spxentry{gen\_password()}\spxextra{nel modulo nest\_backend.gestione}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.gestione.gen_password}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{nest\_backend.gestione.}}\sphinxbfcode{\sphinxupquote{gen\_password}}}{\emph{\DUrole{n}{password}}}{} \sphinxAtStartPar It generates an hashed password. :param password: the password that needs to be hashed. :return: the password\textquotesingle{}s hash. \end{fulllineitems} \index{find\_user() (nel modulo nest\_backend.gestione)@\spxentry{find\_user()}\spxextra{nel modulo nest\_backend.gestione}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.gestione.find_user}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{nest\_backend.gestione.}}\sphinxbfcode{\sphinxupquote{find\_user}}}{\emph{\DUrole{n}{email}}}{} \end{fulllineitems} \index{admin\_or\_403() (nel modulo nest\_backend.gestione)@\spxentry{admin\_or\_403()}\spxextra{nel modulo nest\_backend.gestione}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.gestione.admin_or_403}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{nest\_backend.gestione.}}\sphinxbfcode{\sphinxupquote{admin\_or\_403}}}{\emph{\DUrole{n}{f}}}{} \end{fulllineitems} \index{repository\_auth() (nel modulo nest\_backend.gestione)@\spxentry{repository\_auth()}\spxextra{nel modulo nest\_backend.gestione}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.gestione.repository_auth}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{nest\_backend.gestione.}}\sphinxbfcode{\sphinxupquote{repository\_auth}}}{\emph{\DUrole{n}{f}}}{} \end{fulllineitems} \index{json\_request\_authorizer() (nel modulo nest\_backend.gestione)@\spxentry{json\_request\_authorizer()}\spxextra{nel modulo nest\_backend.gestione}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.gestione.json_request_authorizer}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{nest\_backend.gestione.}}\sphinxbfcode{\sphinxupquote{json\_request\_authorizer}}}{\emph{\DUrole{n}{json}}, \emph{\DUrole{n}{serializable}}}{} \end{fulllineitems} \index{json\_error() (nel modulo nest\_backend.gestione)@\spxentry{json\_error()}\spxextra{nel modulo nest\_backend.gestione}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.gestione.json_error}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{nest\_backend.gestione.}}\sphinxbfcode{\sphinxupquote{json\_error}}}{\emph{\DUrole{n}{msg}}, \emph{\DUrole{n}{code}\DUrole{o}{=}\DUrole{default_value}{\textquotesingle{}errorUnknownError\textquotesingle{}}}}{} \sphinxAtStartPar Returns an error in json format :param code: the code of the error according to the spec. :param msg: the error message. :return: a json formatted string. \end{fulllineitems} \index{json\_success() (nel modulo nest\_backend.gestione)@\spxentry{json\_success()}\spxextra{nel modulo nest\_backend.gestione}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.gestione.json_success}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{nest\_backend.gestione.}}\sphinxbfcode{\sphinxupquote{json\_success}}}{\emph{\DUrole{n}{data}}}{} \sphinxAtStartPar An happy little function. Its happy because the operation was successful. :param data: the thing you want to be returned :return: a json formatted string \end{fulllineitems} \index{error\_handler() (nel modulo nest\_backend.gestione)@\spxentry{error\_handler()}\spxextra{nel modulo nest\_backend.gestione}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.gestione.error_handler}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{nest\_backend.gestione.}}\sphinxbfcode{\sphinxupquote{error\_handler}}}{\emph{\DUrole{n}{e}}}{} \end{fulllineitems} \index{hashtag\_validator() (nel modulo nest\_backend.gestione)@\spxentry{hashtag\_validator()}\spxextra{nel modulo nest\_backend.gestione}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.gestione.hashtag_validator}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{nest\_backend.gestione.}}\sphinxbfcode{\sphinxupquote{hashtag\_validator}}}{\emph{\DUrole{n}{hashtag}}}{} \end{fulllineitems} \section{\sphinxstyleliteralintitle{\sphinxupquote{.database}} \sphinxhyphen{} Database} \label{\detokenize{code/backend/index:module-nest_backend.database}}\label{\detokenize{code/backend/index:database-database}}\index{modulo@\spxentry{modulo}!nest\_backend.database@\spxentry{nest\_backend.database}}\index{nest\_backend.database@\spxentry{nest\_backend.database}!modulo@\spxentry{modulo}} \sphinxAtStartPar This module imports all the tables and the declarative base \subsection{\sphinxstyleliteralintitle{\sphinxupquote{.base}} \sphinxhyphen{} Estensione flask} \label{\detokenize{code/backend/index:module-nest_backend.database.base}}\label{\detokenize{code/backend/index:base-estensione-flask}}\index{modulo@\spxentry{modulo}!nest\_backend.database.base@\spxentry{nest\_backend.database.base}}\index{nest\_backend.database.base@\spxentry{nest\_backend.database.base}!modulo@\spxentry{modulo}} \subsection{\sphinxstyleliteralintitle{\sphinxupquote{.tables}} \sphinxhyphen{} Tabelle} \label{\detokenize{code/backend/index:module-nest_backend.database.tables}}\label{\detokenize{code/backend/index:tables-tabelle}}\index{modulo@\spxentry{modulo}!nest\_backend.database.tables@\spxentry{nest\_backend.database.tables}}\index{nest\_backend.database.tables@\spxentry{nest\_backend.database.tables}!modulo@\spxentry{modulo}} \sphinxAtStartPar This module contains all database classes. \index{Alert (classe in nest\_backend.database.tables)@\spxentry{Alert}\spxextra{classe in nest\_backend.database.tables}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Alert}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxcode{\sphinxupquote{nest\_backend.database.tables.}}\sphinxbfcode{\sphinxupquote{Alert}}}{\emph{\DUrole{o}{**}\DUrole{n}{kwargs}}}{}~\begin{quote} \sphinxAtStartPar Basi: \sphinxcode{\sphinxupquote{sqlalchemy.orm.decl\_api.Model}} \end{quote} \index{id (nest\_backend.database.tables.Alert attributo)@\spxentry{id}\spxextra{nest\_backend.database.tables.Alert attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Alert.id}}\pysigline{\sphinxbfcode{\sphinxupquote{id}}} \end{fulllineitems} \index{name (nest\_backend.database.tables.Alert attributo)@\spxentry{name}\spxextra{nest\_backend.database.tables.Alert attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Alert.name}}\pysigline{\sphinxbfcode{\sphinxupquote{name}}} \end{fulllineitems} \index{limit (nest\_backend.database.tables.Alert attributo)@\spxentry{limit}\spxextra{nest\_backend.database.tables.Alert attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Alert.limit}}\pysigline{\sphinxbfcode{\sphinxupquote{limit}}} \end{fulllineitems} \index{window\_size (nest\_backend.database.tables.Alert attributo)@\spxentry{window\_size}\spxextra{nest\_backend.database.tables.Alert attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Alert.window_size}}\pysigline{\sphinxbfcode{\sphinxupquote{window\_size}}} \end{fulllineitems} \index{evaluation\_mode (nest\_backend.database.tables.Alert attributo)@\spxentry{evaluation\_mode}\spxextra{nest\_backend.database.tables.Alert attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Alert.evaluation_mode}}\pysigline{\sphinxbfcode{\sphinxupquote{evaluation\_mode}}} \end{fulllineitems} \index{repository\_id (nest\_backend.database.tables.Alert attributo)@\spxentry{repository\_id}\spxextra{nest\_backend.database.tables.Alert attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Alert.repository_id}}\pysigline{\sphinxbfcode{\sphinxupquote{repository\_id}}} \end{fulllineitems} \index{repository (nest\_backend.database.tables.Alert attributo)@\spxentry{repository}\spxextra{nest\_backend.database.tables.Alert attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Alert.repository}}\pysigline{\sphinxbfcode{\sphinxupquote{repository}}} \end{fulllineitems} \index{notifications (nest\_backend.database.tables.Alert attributo)@\spxentry{notifications}\spxextra{nest\_backend.database.tables.Alert attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Alert.notifications}}\pysigline{\sphinxbfcode{\sphinxupquote{notifications}}} \end{fulllineitems} \index{conditions (nest\_backend.database.tables.Alert attributo)@\spxentry{conditions}\spxextra{nest\_backend.database.tables.Alert attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Alert.conditions}}\pysigline{\sphinxbfcode{\sphinxupquote{conditions}}} \end{fulllineitems} \index{to\_json() (nest\_backend.database.tables.Alert metodo)@\spxentry{to\_json()}\spxextra{nest\_backend.database.tables.Alert metodo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Alert.to_json}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{to\_json}}}{}{} \end{fulllineitems} \index{\_\_init\_\_() (nest\_backend.database.tables.Alert metodo)@\spxentry{\_\_init\_\_()}\spxextra{nest\_backend.database.tables.Alert metodo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Alert.__init__}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{\_\_init\_\_}}}{\emph{\DUrole{o}{**}\DUrole{n}{kwargs}}}{} \sphinxAtStartPar A simple constructor that allows initialization from kwargs. \sphinxAtStartPar Sets attributes on the constructed instance using the names and values in \sphinxcode{\sphinxupquote{kwargs}}. \sphinxAtStartPar Only keys that are present as attributes of the instance\textquotesingle{}s class are allowed. These could be, for example, any mapped columns or relationships. \end{fulllineitems} \end{fulllineitems} \index{Authorization (classe in nest\_backend.database.tables)@\spxentry{Authorization}\spxextra{classe in nest\_backend.database.tables}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Authorization}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxcode{\sphinxupquote{nest\_backend.database.tables.}}\sphinxbfcode{\sphinxupquote{Authorization}}}{\emph{\DUrole{o}{**}\DUrole{n}{kwargs}}}{}~\begin{quote} \sphinxAtStartPar Basi: \sphinxcode{\sphinxupquote{sqlalchemy.orm.decl\_api.Model}} \end{quote} \index{rid (nest\_backend.database.tables.Authorization attributo)@\spxentry{rid}\spxextra{nest\_backend.database.tables.Authorization attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Authorization.rid}}\pysigline{\sphinxbfcode{\sphinxupquote{rid}}} \end{fulllineitems} \index{email (nest\_backend.database.tables.Authorization attributo)@\spxentry{email}\spxextra{nest\_backend.database.tables.Authorization attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Authorization.email}}\pysigline{\sphinxbfcode{\sphinxupquote{email}}} \end{fulllineitems} \index{repository (nest\_backend.database.tables.Authorization attributo)@\spxentry{repository}\spxextra{nest\_backend.database.tables.Authorization attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Authorization.repository}}\pysigline{\sphinxbfcode{\sphinxupquote{repository}}} \end{fulllineitems} \index{user (nest\_backend.database.tables.Authorization attributo)@\spxentry{user}\spxextra{nest\_backend.database.tables.Authorization attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Authorization.user}}\pysigline{\sphinxbfcode{\sphinxupquote{user}}} \end{fulllineitems} \index{to\_json() (nest\_backend.database.tables.Authorization metodo)@\spxentry{to\_json()}\spxextra{nest\_backend.database.tables.Authorization metodo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Authorization.to_json}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{to\_json}}}{}{} \end{fulllineitems} \index{\_\_init\_\_() (nest\_backend.database.tables.Authorization metodo)@\spxentry{\_\_init\_\_()}\spxextra{nest\_backend.database.tables.Authorization metodo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Authorization.__init__}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{\_\_init\_\_}}}{\emph{\DUrole{o}{**}\DUrole{n}{kwargs}}}{} \sphinxAtStartPar A simple constructor that allows initialization from kwargs. \sphinxAtStartPar Sets attributes on the constructed instance using the names and values in \sphinxcode{\sphinxupquote{kwargs}}. \sphinxAtStartPar Only keys that are present as attributes of the instance\textquotesingle{}s class are allowed. These could be, for example, any mapped columns or relationships. \end{fulllineitems} \end{fulllineitems} \index{Composed (classe in nest\_backend.database.tables)@\spxentry{Composed}\spxextra{classe in nest\_backend.database.tables}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Composed}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxcode{\sphinxupquote{nest\_backend.database.tables.}}\sphinxbfcode{\sphinxupquote{Composed}}}{\emph{\DUrole{o}{**}\DUrole{n}{kwargs}}}{}~\begin{quote} \sphinxAtStartPar Basi: \sphinxcode{\sphinxupquote{sqlalchemy.orm.decl\_api.Model}} \end{quote} \index{rid (nest\_backend.database.tables.Composed attributo)@\spxentry{rid}\spxextra{nest\_backend.database.tables.Composed attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Composed.rid}}\pysigline{\sphinxbfcode{\sphinxupquote{rid}}} \end{fulllineitems} \index{snowflake (nest\_backend.database.tables.Composed attributo)@\spxentry{snowflake}\spxextra{nest\_backend.database.tables.Composed attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Composed.snowflake}}\pysigline{\sphinxbfcode{\sphinxupquote{snowflake}}} \end{fulllineitems} \index{repository (nest\_backend.database.tables.Composed attributo)@\spxentry{repository}\spxextra{nest\_backend.database.tables.Composed attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Composed.repository}}\pysigline{\sphinxbfcode{\sphinxupquote{repository}}} \end{fulllineitems} \index{tweet (nest\_backend.database.tables.Composed attributo)@\spxentry{tweet}\spxextra{nest\_backend.database.tables.Composed attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Composed.tweet}}\pysigline{\sphinxbfcode{\sphinxupquote{tweet}}} \end{fulllineitems} \index{\_\_init\_\_() (nest\_backend.database.tables.Composed metodo)@\spxentry{\_\_init\_\_()}\spxextra{nest\_backend.database.tables.Composed metodo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Composed.__init__}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{\_\_init\_\_}}}{\emph{\DUrole{o}{**}\DUrole{n}{kwargs}}}{} \sphinxAtStartPar A simple constructor that allows initialization from kwargs. \sphinxAtStartPar Sets attributes on the constructed instance using the names and values in \sphinxcode{\sphinxupquote{kwargs}}. \sphinxAtStartPar Only keys that are present as attributes of the instance\textquotesingle{}s class are allowed. These could be, for example, any mapped columns or relationships. \end{fulllineitems} \end{fulllineitems} \index{Condition (classe in nest\_backend.database.tables)@\spxentry{Condition}\spxextra{classe in nest\_backend.database.tables}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Condition}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxcode{\sphinxupquote{nest\_backend.database.tables.}}\sphinxbfcode{\sphinxupquote{Condition}}}{\emph{\DUrole{o}{**}\DUrole{n}{kwargs}}}{}~\begin{quote} \sphinxAtStartPar Basi: \sphinxcode{\sphinxupquote{sqlalchemy.orm.decl\_api.Model}} \end{quote} \index{id (nest\_backend.database.tables.Condition attributo)@\spxentry{id}\spxextra{nest\_backend.database.tables.Condition attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Condition.id}}\pysigline{\sphinxbfcode{\sphinxupquote{id}}} \end{fulllineitems} \index{type (nest\_backend.database.tables.Condition attributo)@\spxentry{type}\spxextra{nest\_backend.database.tables.Condition attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Condition.type}}\pysigline{\sphinxbfcode{\sphinxupquote{type}}} \end{fulllineitems} \index{content (nest\_backend.database.tables.Condition attributo)@\spxentry{content}\spxextra{nest\_backend.database.tables.Condition attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Condition.content}}\pysigline{\sphinxbfcode{\sphinxupquote{content}}} \end{fulllineitems} \index{repository\_id (nest\_backend.database.tables.Condition attributo)@\spxentry{repository\_id}\spxextra{nest\_backend.database.tables.Condition attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Condition.repository_id}}\pysigline{\sphinxbfcode{\sphinxupquote{repository\_id}}} \end{fulllineitems} \index{repository (nest\_backend.database.tables.Condition attributo)@\spxentry{repository}\spxextra{nest\_backend.database.tables.Condition attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Condition.repository}}\pysigline{\sphinxbfcode{\sphinxupquote{repository}}} \end{fulllineitems} \index{tweets (nest\_backend.database.tables.Condition attributo)@\spxentry{tweets}\spxextra{nest\_backend.database.tables.Condition attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Condition.tweets}}\pysigline{\sphinxbfcode{\sphinxupquote{tweets}}} \end{fulllineitems} \index{alerts (nest\_backend.database.tables.Condition attributo)@\spxentry{alerts}\spxextra{nest\_backend.database.tables.Condition attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Condition.alerts}}\pysigline{\sphinxbfcode{\sphinxupquote{alerts}}} \end{fulllineitems} \index{to\_json() (nest\_backend.database.tables.Condition metodo)@\spxentry{to\_json()}\spxextra{nest\_backend.database.tables.Condition metodo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Condition.to_json}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{to\_json}}}{}{} \end{fulllineitems} \index{\_\_init\_\_() (nest\_backend.database.tables.Condition metodo)@\spxentry{\_\_init\_\_()}\spxextra{nest\_backend.database.tables.Condition metodo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Condition.__init__}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{\_\_init\_\_}}}{\emph{\DUrole{o}{**}\DUrole{n}{kwargs}}}{} \sphinxAtStartPar A simple constructor that allows initialization from kwargs. \sphinxAtStartPar Sets attributes on the constructed instance using the names and values in \sphinxcode{\sphinxupquote{kwargs}}. \sphinxAtStartPar Only keys that are present as attributes of the instance\textquotesingle{}s class are allowed. These could be, for example, any mapped columns or relationships. \end{fulllineitems} \end{fulllineitems} \index{Contains (classe in nest\_backend.database.tables)@\spxentry{Contains}\spxextra{classe in nest\_backend.database.tables}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Contains}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxcode{\sphinxupquote{nest\_backend.database.tables.}}\sphinxbfcode{\sphinxupquote{Contains}}}{\emph{\DUrole{o}{**}\DUrole{n}{kwargs}}}{}~\begin{quote} \sphinxAtStartPar Basi: \sphinxcode{\sphinxupquote{sqlalchemy.orm.decl\_api.Model}} \end{quote} \index{cid (nest\_backend.database.tables.Contains attributo)@\spxentry{cid}\spxextra{nest\_backend.database.tables.Contains attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Contains.cid}}\pysigline{\sphinxbfcode{\sphinxupquote{cid}}} \end{fulllineitems} \index{snowflake (nest\_backend.database.tables.Contains attributo)@\spxentry{snowflake}\spxextra{nest\_backend.database.tables.Contains attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Contains.snowflake}}\pysigline{\sphinxbfcode{\sphinxupquote{snowflake}}} \end{fulllineitems} \index{condition (nest\_backend.database.tables.Contains attributo)@\spxentry{condition}\spxextra{nest\_backend.database.tables.Contains attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Contains.condition}}\pysigline{\sphinxbfcode{\sphinxupquote{condition}}} \end{fulllineitems} \index{tweet (nest\_backend.database.tables.Contains attributo)@\spxentry{tweet}\spxextra{nest\_backend.database.tables.Contains attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Contains.tweet}}\pysigline{\sphinxbfcode{\sphinxupquote{tweet}}} \end{fulllineitems} \index{\_\_init\_\_() (nest\_backend.database.tables.Contains metodo)@\spxentry{\_\_init\_\_()}\spxextra{nest\_backend.database.tables.Contains metodo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Contains.__init__}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{\_\_init\_\_}}}{\emph{\DUrole{o}{**}\DUrole{n}{kwargs}}}{} \sphinxAtStartPar A simple constructor that allows initialization from kwargs. \sphinxAtStartPar Sets attributes on the constructed instance using the names and values in \sphinxcode{\sphinxupquote{kwargs}}. \sphinxAtStartPar Only keys that are present as attributes of the instance\textquotesingle{}s class are allowed. These could be, for example, any mapped columns or relationships. \end{fulllineitems} \end{fulllineitems} \index{Notification (classe in nest\_backend.database.tables)@\spxentry{Notification}\spxextra{classe in nest\_backend.database.tables}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Notification}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxcode{\sphinxupquote{nest\_backend.database.tables.}}\sphinxbfcode{\sphinxupquote{Notification}}}{\emph{\DUrole{o}{**}\DUrole{n}{kwargs}}}{}~\begin{quote} \sphinxAtStartPar Basi: \sphinxcode{\sphinxupquote{sqlalchemy.orm.decl\_api.Model}} \end{quote} \index{id (nest\_backend.database.tables.Notification attributo)@\spxentry{id}\spxextra{nest\_backend.database.tables.Notification attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Notification.id}}\pysigline{\sphinxbfcode{\sphinxupquote{id}}} \end{fulllineitems} \index{ora (nest\_backend.database.tables.Notification attributo)@\spxentry{ora}\spxextra{nest\_backend.database.tables.Notification attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Notification.ora}}\pysigline{\sphinxbfcode{\sphinxupquote{ora}}} \end{fulllineitems} \index{alert\_id (nest\_backend.database.tables.Notification attributo)@\spxentry{alert\_id}\spxextra{nest\_backend.database.tables.Notification attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Notification.alert_id}}\pysigline{\sphinxbfcode{\sphinxupquote{alert\_id}}} \end{fulllineitems} \index{alert (nest\_backend.database.tables.Notification attributo)@\spxentry{alert}\spxextra{nest\_backend.database.tables.Notification attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Notification.alert}}\pysigline{\sphinxbfcode{\sphinxupquote{alert}}} \end{fulllineitems} \index{to\_json() (nest\_backend.database.tables.Notification metodo)@\spxentry{to\_json()}\spxextra{nest\_backend.database.tables.Notification metodo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Notification.to_json}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{to\_json}}}{}{} \end{fulllineitems} \index{\_\_init\_\_() (nest\_backend.database.tables.Notification metodo)@\spxentry{\_\_init\_\_()}\spxextra{nest\_backend.database.tables.Notification metodo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Notification.__init__}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{\_\_init\_\_}}}{\emph{\DUrole{o}{**}\DUrole{n}{kwargs}}}{} \sphinxAtStartPar A simple constructor that allows initialization from kwargs. \sphinxAtStartPar Sets attributes on the constructed instance using the names and values in \sphinxcode{\sphinxupquote{kwargs}}. \sphinxAtStartPar Only keys that are present as attributes of the instance\textquotesingle{}s class are allowed. These could be, for example, any mapped columns or relationships. \end{fulllineitems} \end{fulllineitems} \index{Repository (classe in nest\_backend.database.tables)@\spxentry{Repository}\spxextra{classe in nest\_backend.database.tables}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Repository}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxcode{\sphinxupquote{nest\_backend.database.tables.}}\sphinxbfcode{\sphinxupquote{Repository}}}{\emph{\DUrole{o}{**}\DUrole{n}{kwargs}}}{}~\begin{quote} \sphinxAtStartPar Basi: \sphinxcode{\sphinxupquote{sqlalchemy.orm.decl\_api.Model}} \end{quote} \index{id (nest\_backend.database.tables.Repository attributo)@\spxentry{id}\spxextra{nest\_backend.database.tables.Repository attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Repository.id}}\pysigline{\sphinxbfcode{\sphinxupquote{id}}} \end{fulllineitems} \index{name (nest\_backend.database.tables.Repository attributo)@\spxentry{name}\spxextra{nest\_backend.database.tables.Repository attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Repository.name}}\pysigline{\sphinxbfcode{\sphinxupquote{name}}} \end{fulllineitems} \index{start (nest\_backend.database.tables.Repository attributo)@\spxentry{start}\spxextra{nest\_backend.database.tables.Repository attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Repository.start}}\pysigline{\sphinxbfcode{\sphinxupquote{start}}} \end{fulllineitems} \index{end (nest\_backend.database.tables.Repository attributo)@\spxentry{end}\spxextra{nest\_backend.database.tables.Repository attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Repository.end}}\pysigline{\sphinxbfcode{\sphinxupquote{end}}} \end{fulllineitems} \index{is\_active (nest\_backend.database.tables.Repository attributo)@\spxentry{is\_active}\spxextra{nest\_backend.database.tables.Repository attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Repository.is_active}}\pysigline{\sphinxbfcode{\sphinxupquote{is\_active}}} \end{fulllineitems} \index{is\_deleted (nest\_backend.database.tables.Repository attributo)@\spxentry{is\_deleted}\spxextra{nest\_backend.database.tables.Repository attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Repository.is_deleted}}\pysigline{\sphinxbfcode{\sphinxupquote{is\_deleted}}} \end{fulllineitems} \index{evaluation\_mode (nest\_backend.database.tables.Repository attributo)@\spxentry{evaluation\_mode}\spxextra{nest\_backend.database.tables.Repository attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Repository.evaluation_mode}}\pysigline{\sphinxbfcode{\sphinxupquote{evaluation\_mode}}} \end{fulllineitems} \index{owner\_id (nest\_backend.database.tables.Repository attributo)@\spxentry{owner\_id}\spxextra{nest\_backend.database.tables.Repository attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Repository.owner_id}}\pysigline{\sphinxbfcode{\sphinxupquote{owner\_id}}} \end{fulllineitems} \index{owner (nest\_backend.database.tables.Repository attributo)@\spxentry{owner}\spxextra{nest\_backend.database.tables.Repository attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Repository.owner}}\pysigline{\sphinxbfcode{\sphinxupquote{owner}}} \end{fulllineitems} \index{authorizations (nest\_backend.database.tables.Repository attributo)@\spxentry{authorizations}\spxextra{nest\_backend.database.tables.Repository attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Repository.authorizations}}\pysigline{\sphinxbfcode{\sphinxupquote{authorizations}}} \end{fulllineitems} \index{tweets (nest\_backend.database.tables.Repository attributo)@\spxentry{tweets}\spxextra{nest\_backend.database.tables.Repository attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Repository.tweets}}\pysigline{\sphinxbfcode{\sphinxupquote{tweets}}} \end{fulllineitems} \index{alerts (nest\_backend.database.tables.Repository attributo)@\spxentry{alerts}\spxextra{nest\_backend.database.tables.Repository attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Repository.alerts}}\pysigline{\sphinxbfcode{\sphinxupquote{alerts}}} \end{fulllineitems} \index{conditions (nest\_backend.database.tables.Repository attributo)@\spxentry{conditions}\spxextra{nest\_backend.database.tables.Repository attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Repository.conditions}}\pysigline{\sphinxbfcode{\sphinxupquote{conditions}}} \end{fulllineitems} \index{to\_json() (nest\_backend.database.tables.Repository metodo)@\spxentry{to\_json()}\spxextra{nest\_backend.database.tables.Repository metodo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Repository.to_json}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{to\_json}}}{}{} \end{fulllineitems} \index{\_\_init\_\_() (nest\_backend.database.tables.Repository metodo)@\spxentry{\_\_init\_\_()}\spxextra{nest\_backend.database.tables.Repository metodo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Repository.__init__}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{\_\_init\_\_}}}{\emph{\DUrole{o}{**}\DUrole{n}{kwargs}}}{} \sphinxAtStartPar A simple constructor that allows initialization from kwargs. \sphinxAtStartPar Sets attributes on the constructed instance using the names and values in \sphinxcode{\sphinxupquote{kwargs}}. \sphinxAtStartPar Only keys that are present as attributes of the instance\textquotesingle{}s class are allowed. These could be, for example, any mapped columns or relationships. \end{fulllineitems} \end{fulllineitems} \index{Tweet (classe in nest\_backend.database.tables)@\spxentry{Tweet}\spxextra{classe in nest\_backend.database.tables}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Tweet}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxcode{\sphinxupquote{nest\_backend.database.tables.}}\sphinxbfcode{\sphinxupquote{Tweet}}}{\emph{\DUrole{o}{**}\DUrole{n}{kwargs}}}{}~\begin{quote} \sphinxAtStartPar Basi: \sphinxcode{\sphinxupquote{sqlalchemy.orm.decl\_api.Model}} \end{quote} \index{snowflake (nest\_backend.database.tables.Tweet attributo)@\spxentry{snowflake}\spxextra{nest\_backend.database.tables.Tweet attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Tweet.snowflake}}\pysigline{\sphinxbfcode{\sphinxupquote{snowflake}}} \end{fulllineitems} \index{content (nest\_backend.database.tables.Tweet attributo)@\spxentry{content}\spxextra{nest\_backend.database.tables.Tweet attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Tweet.content}}\pysigline{\sphinxbfcode{\sphinxupquote{content}}} \end{fulllineitems} \index{location (nest\_backend.database.tables.Tweet attributo)@\spxentry{location}\spxextra{nest\_backend.database.tables.Tweet attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Tweet.location}}\pysigline{\sphinxbfcode{\sphinxupquote{location}}} \end{fulllineitems} \index{place (nest\_backend.database.tables.Tweet attributo)@\spxentry{place}\spxextra{nest\_backend.database.tables.Tweet attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Tweet.place}}\pysigline{\sphinxbfcode{\sphinxupquote{place}}} \end{fulllineitems} \index{poster (nest\_backend.database.tables.Tweet attributo)@\spxentry{poster}\spxextra{nest\_backend.database.tables.Tweet attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Tweet.poster}}\pysigline{\sphinxbfcode{\sphinxupquote{poster}}} \end{fulllineitems} \index{insert\_time (nest\_backend.database.tables.Tweet attributo)@\spxentry{insert\_time}\spxextra{nest\_backend.database.tables.Tweet attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Tweet.insert_time}}\pysigline{\sphinxbfcode{\sphinxupquote{insert\_time}}} \end{fulllineitems} \index{post\_time (nest\_backend.database.tables.Tweet attributo)@\spxentry{post\_time}\spxextra{nest\_backend.database.tables.Tweet attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Tweet.post_time}}\pysigline{\sphinxbfcode{\sphinxupquote{post\_time}}} \end{fulllineitems} \index{image\_url (nest\_backend.database.tables.Tweet attributo)@\spxentry{image\_url}\spxextra{nest\_backend.database.tables.Tweet attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Tweet.image_url}}\pysigline{\sphinxbfcode{\sphinxupquote{image\_url}}} \end{fulllineitems} \index{repositories (nest\_backend.database.tables.Tweet attributo)@\spxentry{repositories}\spxextra{nest\_backend.database.tables.Tweet attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Tweet.repositories}}\pysigline{\sphinxbfcode{\sphinxupquote{repositories}}} \end{fulllineitems} \index{conditions (nest\_backend.database.tables.Tweet attributo)@\spxentry{conditions}\spxextra{nest\_backend.database.tables.Tweet attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Tweet.conditions}}\pysigline{\sphinxbfcode{\sphinxupquote{conditions}}} \end{fulllineitems} \index{to\_json() (nest\_backend.database.tables.Tweet metodo)@\spxentry{to\_json()}\spxextra{nest\_backend.database.tables.Tweet metodo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Tweet.to_json}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{to\_json}}}{}{} \end{fulllineitems} \index{\_\_init\_\_() (nest\_backend.database.tables.Tweet metodo)@\spxentry{\_\_init\_\_()}\spxextra{nest\_backend.database.tables.Tweet metodo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.Tweet.__init__}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{\_\_init\_\_}}}{\emph{\DUrole{o}{**}\DUrole{n}{kwargs}}}{} \sphinxAtStartPar A simple constructor that allows initialization from kwargs. \sphinxAtStartPar Sets attributes on the constructed instance using the names and values in \sphinxcode{\sphinxupquote{kwargs}}. \sphinxAtStartPar Only keys that are present as attributes of the instance\textquotesingle{}s class are allowed. These could be, for example, any mapped columns or relationships. \end{fulllineitems} \end{fulllineitems} \index{User (classe in nest\_backend.database.tables)@\spxentry{User}\spxextra{classe in nest\_backend.database.tables}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.User}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxcode{\sphinxupquote{nest\_backend.database.tables.}}\sphinxbfcode{\sphinxupquote{User}}}{\emph{\DUrole{o}{**}\DUrole{n}{kwargs}}}{}~\begin{quote} \sphinxAtStartPar Basi: \sphinxcode{\sphinxupquote{sqlalchemy.orm.decl\_api.Model}} \end{quote} \index{email (nest\_backend.database.tables.User attributo)@\spxentry{email}\spxextra{nest\_backend.database.tables.User attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.User.email}}\pysigline{\sphinxbfcode{\sphinxupquote{email}}} \end{fulllineitems} \index{username (nest\_backend.database.tables.User attributo)@\spxentry{username}\spxextra{nest\_backend.database.tables.User attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.User.username}}\pysigline{\sphinxbfcode{\sphinxupquote{username}}} \end{fulllineitems} \index{password (nest\_backend.database.tables.User attributo)@\spxentry{password}\spxextra{nest\_backend.database.tables.User attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.User.password}}\pysigline{\sphinxbfcode{\sphinxupquote{password}}} \end{fulllineitems} \index{isAdmin (nest\_backend.database.tables.User attributo)@\spxentry{isAdmin}\spxextra{nest\_backend.database.tables.User attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.User.isAdmin}}\pysigline{\sphinxbfcode{\sphinxupquote{isAdmin}}} \end{fulllineitems} \index{owner\_of (nest\_backend.database.tables.User attributo)@\spxentry{owner\_of}\spxextra{nest\_backend.database.tables.User attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.User.owner_of}}\pysigline{\sphinxbfcode{\sphinxupquote{owner\_of}}} \end{fulllineitems} \index{authorizations (nest\_backend.database.tables.User attributo)@\spxentry{authorizations}\spxextra{nest\_backend.database.tables.User attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.User.authorizations}}\pysigline{\sphinxbfcode{\sphinxupquote{authorizations}}} \end{fulllineitems} \index{to\_json() (nest\_backend.database.tables.User metodo)@\spxentry{to\_json()}\spxextra{nest\_backend.database.tables.User metodo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.User.to_json}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{to\_json}}}{}{} \end{fulllineitems} \index{\_\_init\_\_() (nest\_backend.database.tables.User metodo)@\spxentry{\_\_init\_\_()}\spxextra{nest\_backend.database.tables.User metodo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.User.__init__}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{\_\_init\_\_}}}{\emph{\DUrole{o}{**}\DUrole{n}{kwargs}}}{} \sphinxAtStartPar A simple constructor that allows initialization from kwargs. \sphinxAtStartPar Sets attributes on the constructed instance using the names and values in \sphinxcode{\sphinxupquote{kwargs}}. \sphinxAtStartPar Only keys that are present as attributes of the instance\textquotesingle{}s class are allowed. These could be, for example, any mapped columns or relationships. \end{fulllineitems} \end{fulllineitems} \index{MadeOf (classe in nest\_backend.database.tables)@\spxentry{MadeOf}\spxextra{classe in nest\_backend.database.tables}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.MadeOf}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxcode{\sphinxupquote{nest\_backend.database.tables.}}\sphinxbfcode{\sphinxupquote{MadeOf}}}{\emph{\DUrole{o}{**}\DUrole{n}{kwargs}}}{}~\begin{quote} \sphinxAtStartPar Basi: \sphinxcode{\sphinxupquote{sqlalchemy.orm.decl\_api.Model}} \end{quote} \index{aid (nest\_backend.database.tables.MadeOf attributo)@\spxentry{aid}\spxextra{nest\_backend.database.tables.MadeOf attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.MadeOf.aid}}\pysigline{\sphinxbfcode{\sphinxupquote{aid}}} \end{fulllineitems} \index{cid (nest\_backend.database.tables.MadeOf attributo)@\spxentry{cid}\spxextra{nest\_backend.database.tables.MadeOf attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.MadeOf.cid}}\pysigline{\sphinxbfcode{\sphinxupquote{cid}}} \end{fulllineitems} \index{alert (nest\_backend.database.tables.MadeOf attributo)@\spxentry{alert}\spxextra{nest\_backend.database.tables.MadeOf attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.MadeOf.alert}}\pysigline{\sphinxbfcode{\sphinxupquote{alert}}} \end{fulllineitems} \index{condition (nest\_backend.database.tables.MadeOf attributo)@\spxentry{condition}\spxextra{nest\_backend.database.tables.MadeOf attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.MadeOf.condition}}\pysigline{\sphinxbfcode{\sphinxupquote{condition}}} \end{fulllineitems} \index{\_\_init\_\_() (nest\_backend.database.tables.MadeOf metodo)@\spxentry{\_\_init\_\_()}\spxextra{nest\_backend.database.tables.MadeOf metodo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.MadeOf.__init__}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{\_\_init\_\_}}}{\emph{\DUrole{o}{**}\DUrole{n}{kwargs}}}{} \sphinxAtStartPar A simple constructor that allows initialization from kwargs. \sphinxAtStartPar Sets attributes on the constructed instance using the names and values in \sphinxcode{\sphinxupquote{kwargs}}. \sphinxAtStartPar Only keys that are present as attributes of the instance\textquotesingle{}s class are allowed. These could be, for example, any mapped columns or relationships. \end{fulllineitems} \end{fulllineitems} \index{ConditionType (classe in nest\_backend.database.tables)@\spxentry{ConditionType}\spxextra{classe in nest\_backend.database.tables}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.ConditionType}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxcode{\sphinxupquote{nest\_backend.database.tables.}}\sphinxbfcode{\sphinxupquote{ConditionType}}}{\emph{\DUrole{n}{value}}}{}~\begin{quote} \sphinxAtStartPar Basi: \sphinxhref{https://docs.python.org/3.8/library/enum.html\#enum.Enum}{\sphinxcode{\sphinxupquote{enum.Enum}}} \end{quote} \sphinxAtStartPar Vedi \sphinxhref{https://gitlab.steffo.eu/nest/g2-progetto/-/wikis/Specifica-delle-Conditions}{Specifica delle Conditions su GitLab} . \index{hashtag (nest\_backend.database.tables.ConditionType attributo)@\spxentry{hashtag}\spxextra{nest\_backend.database.tables.ConditionType attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.ConditionType.hashtag}}\pysigline{\sphinxbfcode{\sphinxupquote{hashtag}}\sphinxbfcode{\sphinxupquote{ = 0}}} \end{fulllineitems} \index{location (nest\_backend.database.tables.ConditionType attributo)@\spxentry{location}\spxextra{nest\_backend.database.tables.ConditionType attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.ConditionType.location}}\pysigline{\sphinxbfcode{\sphinxupquote{location}}\sphinxbfcode{\sphinxupquote{ = 1}}} \end{fulllineitems} \index{time (nest\_backend.database.tables.ConditionType attributo)@\spxentry{time}\spxextra{nest\_backend.database.tables.ConditionType attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.ConditionType.time}}\pysigline{\sphinxbfcode{\sphinxupquote{time}}\sphinxbfcode{\sphinxupquote{ = 2}}} \end{fulllineitems} \index{coordinates (nest\_backend.database.tables.ConditionType attributo)@\spxentry{coordinates}\spxextra{nest\_backend.database.tables.ConditionType attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.ConditionType.coordinates}}\pysigline{\sphinxbfcode{\sphinxupquote{coordinates}}\sphinxbfcode{\sphinxupquote{ = 3}}} \end{fulllineitems} \index{place (nest\_backend.database.tables.ConditionType attributo)@\spxentry{place}\spxextra{nest\_backend.database.tables.ConditionType attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.ConditionType.place}}\pysigline{\sphinxbfcode{\sphinxupquote{place}}\sphinxbfcode{\sphinxupquote{ = 4}}} \end{fulllineitems} \index{user (nest\_backend.database.tables.ConditionType attributo)@\spxentry{user}\spxextra{nest\_backend.database.tables.ConditionType attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.ConditionType.user}}\pysigline{\sphinxbfcode{\sphinxupquote{user}}\sphinxbfcode{\sphinxupquote{ = 5}}} \end{fulllineitems} \end{fulllineitems} \index{OperationType (classe in nest\_backend.database.tables)@\spxentry{OperationType}\spxextra{classe in nest\_backend.database.tables}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.OperationType}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxcode{\sphinxupquote{nest\_backend.database.tables.}}\sphinxbfcode{\sphinxupquote{OperationType}}}{\emph{\DUrole{n}{value}}}{}~\begin{quote} \sphinxAtStartPar Basi: \sphinxhref{https://docs.python.org/3.8/library/enum.html\#enum.Enum}{\sphinxcode{\sphinxupquote{enum.Enum}}} \end{quote} \sphinxAtStartPar An enumeration. \index{assign (nest\_backend.database.tables.OperationType attributo)@\spxentry{assign}\spxextra{nest\_backend.database.tables.OperationType attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.OperationType.assign}}\pysigline{\sphinxbfcode{\sphinxupquote{assign}}\sphinxbfcode{\sphinxupquote{ = 3}}} \end{fulllineitems} \end{fulllineitems} \index{ConditionMode (classe in nest\_backend.database.tables)@\spxentry{ConditionMode}\spxextra{classe in nest\_backend.database.tables}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.ConditionMode}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxcode{\sphinxupquote{nest\_backend.database.tables.}}\sphinxbfcode{\sphinxupquote{ConditionMode}}}{\emph{\DUrole{n}{value}}}{}~\begin{quote} \sphinxAtStartPar Basi: \sphinxhref{https://docs.python.org/3.8/library/enum.html\#enum.Enum}{\sphinxcode{\sphinxupquote{enum.Enum}}} \end{quote} \sphinxAtStartPar An enumeration. \index{all\_or (nest\_backend.database.tables.ConditionMode attributo)@\spxentry{all\_or}\spxextra{nest\_backend.database.tables.ConditionMode attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.ConditionMode.all_or}}\pysigline{\sphinxbfcode{\sphinxupquote{all\_or}}\sphinxbfcode{\sphinxupquote{ = 0}}} \end{fulllineitems} \index{all\_and (nest\_backend.database.tables.ConditionMode attributo)@\spxentry{all\_and}\spxextra{nest\_backend.database.tables.ConditionMode attributo}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/backend/index:nest_backend.database.tables.ConditionMode.all_and}}\pysigline{\sphinxbfcode{\sphinxupquote{all\_and}}\sphinxbfcode{\sphinxupquote{ = 1}}} \end{fulllineitems} \end{fulllineitems} \section{\sphinxstyleliteralintitle{\sphinxupquote{.routes}} \sphinxhyphen{} Percorsi API} \label{\detokenize{code/backend/index:routes-percorsi-api}} \begin{sphinxadmonition}{note}{Nota:} \sphinxAtStartPar La documentazione dei percorsi API è gestita da Swagger UI, disponibile a \sphinxcode{\sphinxupquote{/docs}} una volta che il webserver del backend è avviato. \end{sphinxadmonition} \sphinxAtStartPar Si allega una stampa dell\textquotesingle{}interfaccia swagger: \begin{itemize} \item {} \sphinxAtStartPar \sphinxcode{\sphinxupquote{Schermata di swagger}} \end{itemize} \chapter{\sphinxstyleliteralintitle{\sphinxupquote{nest\_crawler}} \sphinxhyphen{} Crawler in Python} \label{\detokenize{code/crawler/index:module-nest_crawler}}\label{\detokenize{code/crawler/index:nest-crawler-crawler-in-python}}\label{\detokenize{code/crawler/index::doc}}\index{modulo@\spxentry{modulo}!nest\_crawler@\spxentry{nest\_crawler}}\index{nest\_crawler@\spxentry{nest\_crawler}!modulo@\spxentry{modulo}}\index{associate\_condition\_tweet() (nel modulo nest\_crawler)@\spxentry{associate\_condition\_tweet()}\spxextra{nel modulo nest\_crawler}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/crawler/index:nest_crawler.associate_condition_tweet}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{nest\_crawler.}}\sphinxbfcode{\sphinxupquote{associate\_condition\_tweet}}}{\emph{\DUrole{n}{conditions\_type}}, \emph{\DUrole{n}{tweet}}}{} \end{fulllineitems} \index{authenticate() (nel modulo nest\_crawler)@\spxentry{authenticate()}\spxextra{nel modulo nest\_crawler}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/crawler/index:nest_crawler.authenticate}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{nest\_crawler.}}\sphinxbfcode{\sphinxupquote{authenticate}}}{}{} \end{fulllineitems} \index{is\_coordinate\_inside\_bounding\_box() (nel modulo nest\_crawler)@\spxentry{is\_coordinate\_inside\_bounding\_box()}\spxextra{nel modulo nest\_crawler}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/crawler/index:nest_crawler.is_coordinate_inside_bounding_box}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{nest\_crawler.}}\sphinxbfcode{\sphinxupquote{is\_coordinate\_inside\_bounding\_box}}}{\emph{\DUrole{n}{latitude}}, \emph{\DUrole{n}{longitude}}, \emph{\DUrole{n}{radius}}, \emph{\DUrole{n}{tweet\_latitude}}, \emph{\DUrole{n}{tweet\_longitude}}}{} \end{fulllineitems} \index{is\_repo\_alert\_triggered() (nel modulo nest\_crawler)@\spxentry{is\_repo\_alert\_triggered()}\spxextra{nel modulo nest\_crawler}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/crawler/index:nest_crawler.is_repo_alert_triggered}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{nest\_crawler.}}\sphinxbfcode{\sphinxupquote{is\_repo\_alert\_triggered}}}{\emph{\DUrole{n}{repository\_id}}}{} \end{fulllineitems} \index{search\_repo\_conditions() (nel modulo nest\_crawler)@\spxentry{search\_repo\_conditions()}\spxextra{nel modulo nest\_crawler}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/crawler/index:nest_crawler.search_repo_conditions}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{nest\_crawler.}}\sphinxbfcode{\sphinxupquote{search\_repo\_conditions}}}{\emph{\DUrole{n}{repository\_id}}}{} \end{fulllineitems} \index{send\_notification\_email() (nel modulo nest\_crawler)@\spxentry{send\_notification\_email()}\spxextra{nel modulo nest\_crawler}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/crawler/index:nest_crawler.send_notification_email}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{nest\_crawler.}}\sphinxbfcode{\sphinxupquote{send\_notification\_email}}}{\emph{\DUrole{n}{alert}}}{} \end{fulllineitems} \index{send\_notification\_tweet() (nel modulo nest\_crawler)@\spxentry{send\_notification\_tweet()}\spxextra{nel modulo nest\_crawler}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/crawler/index:nest_crawler.send_notification_tweet}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{nest\_crawler.}}\sphinxbfcode{\sphinxupquote{send\_notification\_tweet}}}{\emph{\DUrole{n}{alert}}}{} \end{fulllineitems} \chapter{\sphinxstyleliteralintitle{\sphinxupquote{nest\_frontend}} \sphinxhyphen{} Interfaccia utente in React} \label{\detokenize{code/frontend/index:nest-frontend-interfaccia-utente-in-react}}\label{\detokenize{code/frontend/index::doc}} \begin{sphinxadmonition}{warning}{Avvertimento:} \sphinxAtStartPar \sphinxhref{https://jsdoc.app/}{JSDoc} non sembra essere in grado di gestire correttamente il lato frontend del progetto. \sphinxAtStartPar Per maggiori dettagli sul funzionamento dei vari componenti, si suggerisce di guardare le \sphinxstylestrong{docstring presenti nel codice sorgente}. \sphinxAtStartPar Seguono sotto le uniche classi che JSDoc è stato in grado di gestire (anche se vengono mostrate solo parzialmente). \end{sphinxadmonition} \section{\sphinxstyleliteralintitle{\sphinxupquote{.objects}} \sphinxhyphen{} Oggetti vari di utility} \label{\detokenize{code/frontend/index:objects-oggetti-vari-di-utility}}\index{Condition() (classe)@\spxentry{Condition()}\spxextra{classe}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/frontend/index:Condition}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxbfcode{\sphinxupquote{Condition}}}{}{} \sphinxAtStartPar Condition class for an undefined/unknown condition. \sphinxAtStartPar See {[}the Condition spec{]}(\sphinxurl{https://gitlab.steffo.eu/nest/g2-progetto/-/wikis/sprint-2/Specifica-delle-Conditions}). \end{fulllineitems} \index{ConditionHashtag() (classe)@\spxentry{ConditionHashtag()}\spxextra{classe}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/frontend/index:ConditionHashtag}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxbfcode{\sphinxupquote{ConditionHashtag}}}{}{} \sphinxAtStartPar Require a tweet to contain a specific hashtag to be gathered. \end{fulllineitems} \index{ConditionUser() (classe)@\spxentry{ConditionUser()}\spxextra{classe}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/frontend/index:ConditionUser}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxbfcode{\sphinxupquote{ConditionUser}}}{}{} \sphinxAtStartPar Require a tweet to be posted by a certain user to be gathered. \end{fulllineitems} \index{ConditionTime() (classe)@\spxentry{ConditionTime()}\spxextra{classe}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/frontend/index:ConditionTime}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxbfcode{\sphinxupquote{ConditionTime}}}{}{} \sphinxAtStartPar Require a tweet to be posted before or after a certain time to be gathered. \end{fulllineitems} \index{ConditionLocation() (classe)@\spxentry{ConditionLocation()}\spxextra{classe}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/frontend/index:ConditionLocation}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxbfcode{\sphinxupquote{ConditionLocation}}}{}{} \sphinxAtStartPar Require a tweet to have coordinates associated and to be posted within the \sphinxhref{mailto:\{@link}{\{@link} MapArea\}. \end{fulllineitems} \index{NotImplementedError() (classe)@\spxentry{NotImplementedError()}\spxextra{classe}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/frontend/index:NotImplementedError}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxbfcode{\sphinxupquote{NotImplementedError}}}{}{} \sphinxAtStartPar Error thrown when a function is not implemented in the current class/instance. \end{fulllineitems} \index{BackendCommunicationError() (classe)@\spxentry{BackendCommunicationError()}\spxextra{classe}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/frontend/index:BackendCommunicationError}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxbfcode{\sphinxupquote{BackendCommunicationError}}}{}{} \sphinxAtStartPar An error in the N.E.S.T. frontend\sphinxhyphen{}backend communication. \end{fulllineitems} \index{ViewNotAllowedError() (classe)@\spxentry{ViewNotAllowedError()}\spxextra{classe}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/frontend/index:ViewNotAllowedError}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxbfcode{\sphinxupquote{ViewNotAllowedError}}}{}{} \sphinxAtStartPar Error thrown when trying to access a backend view which doesn\textquotesingle{}t exist or isn\textquotesingle{}t allowed in the used hook. \end{fulllineitems} \index{ServerNotConfiguredError() (classe)@\spxentry{ServerNotConfiguredError()}\spxextra{classe}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/frontend/index:ServerNotConfiguredError}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxbfcode{\sphinxupquote{ServerNotConfiguredError}}}{}{} \sphinxAtStartPar Error thrown when trying to access a backend view when outside a \sphinxhref{mailto:\{@link}{\{@link} ContextServer\}. \end{fulllineitems} \index{FetchAlreadyRunningError() (classe)@\spxentry{FetchAlreadyRunningError()}\spxextra{classe}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/frontend/index:FetchAlreadyRunningError}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxbfcode{\sphinxupquote{FetchAlreadyRunningError}}}{}{} \sphinxAtStartPar Error thrown when trying to access a backend view while another access is ongoing. \sphinxAtStartPar This is not allowed due to potential race conditions. \end{fulllineitems} \index{FetchError() (classe)@\spxentry{FetchError()}\spxextra{classe}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/frontend/index:FetchError}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxbfcode{\sphinxupquote{FetchError}}}{}{} \sphinxAtStartPar Abstract class for \sphinxhref{mailto:\{@link}{\{@link} DecodeError\} and \sphinxhref{mailto:\{@link}{\{@link} ResultError\}. \end{fulllineitems} \index{DecodeError() (classe)@\spxentry{DecodeError()}\spxextra{classe}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/frontend/index:DecodeError}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxbfcode{\sphinxupquote{DecodeError}}}{}{} \sphinxAtStartPar Error thrown when the frontend can\textquotesingle{}t parse the data received from the backend. \end{fulllineitems} \index{ResultError() (classe)@\spxentry{ResultError()}\spxextra{classe}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/frontend/index:ResultError}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxbfcode{\sphinxupquote{ResultError}}}{}{} \sphinxAtStartPar Error thrown when the backend returns a falsy \sphinxtitleref{"result"} value. \end{fulllineitems} \index{SerializationError() (classe)@\spxentry{SerializationError()}\spxextra{classe}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/frontend/index:SerializationError}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxbfcode{\sphinxupquote{SerializationError}}}{}{} \sphinxAtStartPar Error thrown when a string couldn\textquotesingle{}t be serialized into an object. \end{fulllineitems} \index{Filter() (classe)@\spxentry{Filter()}\spxextra{classe}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/frontend/index:Filter}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxbfcode{\sphinxupquote{Filter}}}{\emph{negate=false}}{} \sphinxAtStartPar A filter applicable in the Analysis mode. \begin{quote}\begin{description} \item[{Parametri}] \leavevmode\begin{itemize} \item {} \sphinxAtStartPar \sphinxstyleliteralstrong{\sphinxupquote{negate}} \sphinxhyphen{}\sphinxhyphen{} If the filter output should be reversed. \end{itemize} \end{description}\end{quote} \end{fulllineitems} \index{FilterContains() (classe)@\spxentry{FilterContains()}\spxextra{classe}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/frontend/index:FilterContains}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxbfcode{\sphinxupquote{FilterContains}}}{}{} \sphinxAtStartPar Checks if a tweet contains a string. \end{fulllineitems} \index{FilterHashtag() (classe)@\spxentry{FilterHashtag()}\spxextra{classe}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/frontend/index:FilterHashtag}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxbfcode{\sphinxupquote{FilterHashtag}}}{}{} \sphinxAtStartPar Check if a tweet contains an hashtag. \end{fulllineitems} \index{FilterPoster() (classe)@\spxentry{FilterPoster()}\spxextra{classe}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/frontend/index:FilterPoster}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxbfcode{\sphinxupquote{FilterPoster}}}{}{} \sphinxAtStartPar Check if a tweet was posted by a certain user. \end{fulllineitems} \index{FilterWithLocation() (classe)@\spxentry{FilterWithLocation()}\spxextra{classe}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/frontend/index:FilterWithLocation}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxbfcode{\sphinxupquote{FilterWithLocation}}}{}{} \sphinxAtStartPar Check if a tweet contains \sphinxtitleref{location} metadata. \end{fulllineitems} \index{FilterWithPlace() (classe)@\spxentry{FilterWithPlace()}\spxextra{classe}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/frontend/index:FilterWithPlace}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxbfcode{\sphinxupquote{FilterWithPlace}}}{}{} \sphinxAtStartPar Check if a tweet contains \sphinxtitleref{place} metadata. \end{fulllineitems} \index{FilterInsideMapArea() (classe)@\spxentry{FilterInsideMapArea()}\spxextra{classe}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/frontend/index:FilterInsideMapArea}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxbfcode{\sphinxupquote{FilterInsideMapArea}}}{}{} \sphinxAtStartPar Check if a tweet\textquotesingle{}s \sphinxtitleref{location} is inside a \sphinxhref{mailto:\{@link}{\{@link} MapArea\}. \end{fulllineitems} \index{FilterInsideTimeRay() (classe)@\spxentry{FilterInsideTimeRay()}\spxextra{classe}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/frontend/index:FilterInsideTimeRay}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxbfcode{\sphinxupquote{FilterInsideTimeRay}}}{}{} \sphinxAtStartPar Check if a tweet\textquotesingle{}s \sphinxtitleref{post\_time} is inside a \sphinxhref{mailto:\{@link}{\{@link} TimeRay\}. \end{fulllineitems} \index{FilterWithImage() (classe)@\spxentry{FilterWithImage()}\spxextra{classe}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/frontend/index:FilterWithImage}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxbfcode{\sphinxupquote{FilterWithImage}}}{}{} \sphinxAtStartPar Check if a tweet has an associated \sphinxtitleref{image\_url}. \end{fulllineitems} \index{FilterIsRetweet() (classe)@\spxentry{FilterIsRetweet()}\spxextra{classe}} \begin{fulllineitems} \phantomsection\label{\detokenize{code/frontend/index:FilterIsRetweet}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxbfcode{\sphinxupquote{FilterIsRetweet}}}{}{} \sphinxAtStartPar Check if a tweet is a retweet. \end{fulllineitems} \chapter{Altri collegamenti} \label{\detokenize{index:altri-collegamenti}}\begin{itemize} \item {} \sphinxAtStartPar \DUrole{xref,std,std-ref}{genindex} \item {} \sphinxAtStartPar \DUrole{xref,std,std-ref}{modindex} \end{itemize} \renewcommand{\indexname}{Indice del modulo Python} \begin{sphinxtheindex} \let\bigletter\sphinxstyleindexlettergroup \bigletter{n} \item\relax\sphinxstyleindexentry{nest\_backend}\sphinxstyleindexpageref{code/backend/index:\detokenize{module-nest_backend}} \item\relax\sphinxstyleindexentry{nest\_backend.database}\sphinxstyleindexpageref{code/backend/index:\detokenize{module-nest_backend.database}} \item\relax\sphinxstyleindexentry{nest\_backend.database.base}\sphinxstyleindexpageref{code/backend/index:\detokenize{module-nest_backend.database.base}} \item\relax\sphinxstyleindexentry{nest\_backend.database.tables}\sphinxstyleindexpageref{code/backend/index:\detokenize{module-nest_backend.database.tables}} \item\relax\sphinxstyleindexentry{nest\_backend.gestione}\sphinxstyleindexpageref{code/backend/index:\detokenize{module-nest_backend.gestione}} \item\relax\sphinxstyleindexentry{nest\_crawler}\sphinxstyleindexpageref{code/crawler/index:\detokenize{module-nest_crawler}} \end{sphinxtheindex} \renewcommand{\indexname}{Indice} \printindex \end{document}