Weather Vortex
Zandoli
Silvia
0000950299
silvia.zandoli2@studio.unibo.it
Tentoni
Daniele
0000925471
daniele.tentoni2@studio.unibo.it
Lirussi
Igor
0000949711
igor.lirussi@studio.unibo.it
Weather Vortex è un progetto che nasce con l’intento di fornire all’utente un servizio per consultare e paragonare diverse previsioni meteo senza dover necessariamente navigare in diversi portali o siti dedicati. L’obbiettivo verrà raggiunto mediante la creazione di una piattaforma web che possa, da un lato, facilitare le decisioni dell’utente, dall’altro fornire un’esperienza personalizzata.
Normalmente un utente consulta in media 3 / 4 siti meteo ogni volta che vuole farsi un’idea precisa delle previsioni del tempo. Questo comporta un dispendio di tempo e risorse nel consultare più fonti, quando un aggregatore potrebbe fare tutto in automatico.
Talvolta un utente appassionato potrebbe progettare una propria centralina meteo da collocare in un punto preciso dove gli interessa maggiormente essere informato delle condizioni meteo della zona.
I principali problemi che vengono attualmente riscontrati sono i seguenti:
Diverse Fonti: l’utente deve consultare più fonti, non fidandosi di un singolo parere, dato che generalmente non tutti i siti dedicati concordano sui risultati.
Affidabilità: l’utente deve tenere a mente l’affidabilità dei singoli siti e/o valutarli approssimativamente sulla base delle proprie esperienze pregresse con gli stessi.
Personalizzazione: l’utente non ha possibilità nei siti più famosi di impostare una propria centralina meteo a cui chiedere informazioni sul meteo della zona da accompagnare alle previsioni tradizionali.
L’obiettivo consiste nel fornire all’utente un servizio per la consultazione delle previsioni meteo che risolva o quanto meno attenui i disagi o lo stress causato dai problemi sopra descritti.
Nello specifico si vogliono incontrare le esigenze di chi ne fruisce, agevolando le operazioni di:
Osservazione delle condizioni meteo, sia attuali che fino a 3 giorni, per una determinata località.
Registrazione di un account, permettendo il salvataggio di preferenze su una determinata località di cui ricevere le previsioni tutti i giorni sui canali di comunicazione preferiti
Assegnazione di feedbacks ai vari provider meteo lasciando un voto sulla precisione e correttezza delle previsioni emanate.
Registrazione di una centralina che permetta di avere dati personalizzati per tutti i fruitori del sito, per affinare le previsioni emanate dagli altri servizi meteo o per ricevere previsioni accurate su una specifica zona.
Il topic scelto in letteratura ha ricevuto molte attenzioni per via della stessa natura delle previsioni meteo, fortemente legate al machine learning. Tuttavia per quanto riguarda l’aggregazione di esse non risultano presenti particolari ricerche.
Dalle informazioni che abbiamo raccolto su studi e applicazioni di idee similari alla nostra è emerso quanto segue:
Aggregazione: sono presenti alcuni siti similari ma offrono funzionalità molto limitate, è possibile vedere solo le previsioni odierne e non permettono di scegliere quanta fiducia dare ai diversi servizi.
Il servizio Metaweather fornisce un’aggregazione di dati molto simile a quella che vogliamo ottenere con il nostro progetto, ma la visualizzazione delle recensioni dei servizi meteo non è pubblica e non viene data la possibilità di aggiungere centraline meteo.
Google sta progettando con successo una Deep Neural Network per predire più efficacemente le condizioni meteo combinando esclusivamente i dati delle previsioni meteo negli anni passati. Applicando poi questi algoritmi alle previsioni delle ultime ore o giorni, senza alcuna conoscenza dei modelli fisici adottati fino adesso per la previsione delle condizioni meteo, è in grado di determinare talvolta con estrema accuratezza le condizioni future fino a 8 ore: Google’s Deep Neural Network.
Personalizzazione: non sono presenti siti, se non prototipali, che permettano di registrare una centralina personale da aggiungere alle fonti per le previsioni.
In genere gli appassionati adottano delle soluzioni pensate appositamente per le proprie centraline, che non comunicano con altri dispositivi di altri appassionati oppure con servizi meteo esistenti. Talvolta potrebbero esserci progetti che raccolgono dati da diverse centraline, ma ciò è mirato a produrre un’unica previsione meteo incrociando i dati dalle fonti. Viene perso il riferimento ad ogni centralina e i suoi dati, producendo una previsione meteo unica per tutta la zona.
Prima di iniziare a lavorare è stato fondamentale accordarsi su come affrontare in gruppo un progetto intrinsecamente complesso come questo. Si è pensato subito di utilizzare una metodologia agile, per evitare confusioni e lavorare efficientemente in team. Si è optato quindi per la metodologia Scrum.
Scrum è una metodologia agile, incrementale e iterativa per lo sviluppo di
prodotti, applicazioni e servizi. E’ una modalità strutturata e
pianificata.
Scrum si basa sull’empirismo, ovvero sul concetto che la conoscenza derivi
dall’esperienza e che le decisioni vadano prese alla luce di ciò che si
conosce. I tre pilastri che sostengono l’empirismo sono: trasparenza,
ispezione e adattamento.
Ovvero, tutti gli aspetti del lavoro devono essere visibili ai responsabili
del risultato finale (trasparenza). Per rendere trasparenti questi elementi,
il Team Scrum ispeziona di frequente il prodotto mentre lo sta sviluppando
(ispezione). Così il processo e il prodotto possono essere adattati
immediatamente nel caso di nuove esigenze o di condizioni mutate del mercato
(adattamento).
Perchè questo è il senso di Scrum, far lavorare tutto il team insieme, in modo
coordinato e organizzato.
Come tutte le metodologie Agile, si basa sulla divisione del progetto in più
fasi, chiamate Sprint.
Ad ogni Sprint il gruppo di lavoro presenta nuove funzionalità, operative e
implementabili. Si configura così un sistema iterativo che consente di
incrementare poco alla volta, ma molto di frequente, le funzionalità del
progetto, verificando costantemente allo stesso tempo l’andamento
complessivo.
Siamo sempre stati fedeli nell’utilizzare tale metodologia, ma durante il progetto spesso è stata cambiata la durata degli Sprint, per il semplice fatto che per vari motivi non si riusciva a portare a termine i compiti assegnati entro la settimana. Ognuno dei vari Sprint ha quindi avuto una durata di svolgimento variabile. Il risultato è stato sicuramente l’allungamento dei tempi nella realizzazione del progetto, ma non abbiamo mai smesso di seguire tale metodo di lavoro e di confrontarci.
In questa sezione viene dettagliatamente spiegato come il progetto è stato organizzato.
A inizio progetto sono stati stilati insieme i primi requisiti di business
e funzionali, sono state delineate le prime user stories, ragionando sui
problemi che avrebbe dovuto affrontare tale tipologia di lavoro. Si è deciso
di suddividere il lavoro in Sprint, ognuno con durata teorica di una
settimana. Ad ogni Sprint corrispondevano diverse attività, anche chiamate
issue. Tale tempistica, come accennato sopra, poi non è sempre stata
rispettata. Spesso si sono riscontrati problemi durante lo svolgimento di un
task e i tempi si sono allungati.
All’interno del team Daniele Tentoni è stato sicuramente colui che ha svolto
il ruolo dello Scrum Master oltre a far parte del gruppo di sviluppo: egli ha
guidato il team per facilitare lo sviluppo di software funzionante,
assicurando anche la corretta applicazione dei processi scrum.
Lo Sprint con le varie attività da svolgere veniva stilato solitamente durante
gli incontri, e le decisioni su cosa fare venivano prese collegialmente. Il
Product Backlog è stato quindi fatto insieme.
Si è proceduto in questo modo: si è iniziato a produrre la parte Server e, una
volta sviluppate le principali funzionalità di quest’ultimo con i relativi
test, si è poi passati a curare la parte client e la parte grafica. Nel
frattempo si è anche iniziata a collegare la parte backend con quella
frontend.
Ognuno era delegato al testing e agli User Acceptance Test sulla propria parte
di codice prodotta,i test sono interni al progetto.
A partire da inizio progetto si è stilato un diagramma di Gantt, uno strumento utile per la pianificazione dei progetti. Il diagramma ha aiutato a mantenere la costanza e un ritmo nel progetto molto più serrato. Nel capitolo relativo agli sprint, in [Fig. 10.1] si riporta il diagramma di Gantt risultante.
Per quanto riguarda la gestione delle licenze, è stato scelta, tra le varie disponibili, la licenza GNU General Public Service. E’ una licenza copyleft, ovvero un tipo di licenza che viene applicata ai software open source. Il programma può essere quindi distribuito liberamente, modificato e migliorato, con la clausola di non cambiare licenza. Questo tuttavia impone a tutti i software derivati di mantenere il codice opensource, anche in caso di commercializzazione a pagamento. Nonostante alcune aziende non possano usare il codice qualora volessero incorporarlo in prodotti in cui il codice non è pubblico, consciamente è stata fatta questa scelta per supportare l’opensource. Per referenze è possibile consultare un riassunto dello spettro delle licenze a questo link.
Per il versioning ci si è avvalsi di Git e come piattaforma web di GitHub che incorpora le funzionalità di controllo di versione di Git.
Per organizzare il lavoro, elencare i problemi riscontrati ed assegnare i tasks sono state utilizzate le Github Issues dove è possibile pianificare e tenere traccia del proprio operato aggiungendo varie issue al progetto, ognuna corrispondente a un task. Ad ogni issue è possibile aggiungere vari elementi, labels e l’assegnatario. In minor misura sono state usate le GitHub Projects boards. Esse aiutano a organizzare e prioritarizzare il lavoro. Si tratta di schede che contengono issues e note che vengono categorizzate in cards su colonne, ogni colonna indica lo stadio di avanzamento del compito.
E’ stato creato un gruppo Telegram per aggiornarsi giornalmente sullo sviluppo del progetto, esprimere eventuali dubbi e avere ulteriori chiarimenti.
Si è deciso di sentirsi una volta a settimana, per risolvere insieme alcuni task rimasti,aiutarsi nelle problematiche riscontrate durante lo sviluppo, fare il chiarimento della situazione. Eventualmente si stilava anche lo Sprint per la settimana successiva, se quello precedente era stato completato. Sono state alternate sedute sia in presenza che online, dove ci si è avvalsi della piattaforma Microsoft Teams.
In questo capitolo si analizza la parte di integrazione e automatizzazione
sia del progetto software che della relazione.
Si è pensato di organizzare l’automazione dei compiti più ripetitivi
attraverso l’approccio CI/CD, sia per il progetto che per la stesura della
relazione.
La relazione è stata scritta su Overleaf, uno strumento di scrittura e pubblicazione collaborativo online. Inoltre il progetto Overleaf è stato sincronizzato su un apposito repository in Github, dove poter inserire le modifiche ogni volta. Il branch main ospita la release finale della relazione. Ad ogni modifica di tale branch vengono rilasciate le versioni pdf e web aggiornate della relazione.
L’approccio GitFlow, che abbiamo seguito fedelmente, utilizza due rami
principali per gestire il controllo di versione del progetto. Il primo, main
che conserva tutte le release, è il centro del nostro progetto, perché
rispecchia la versione pubblica attualmente in produzione, la versione cioè
accessibile ai nostri utenti. Il secondo è il ramo dev, che è fondamentale per
lo sviluppo delle prossime versioni e serve come base per le future
integrazioni. Il dev è il punto di partenza e di arrivo di tutti gli altri
branch.
Per lo sviluppo di ogni issue veniva creato un branch apposito. Al
completamento il codice veniva compilato e testato, infine veniva fatta una
pull request, dove veniva richiesta la review di almeno un componente del team
per poter includere le proprie modifiche al progetto.
Periodicamente quindi veniva fatta una release sul branch main. Il codice sul
branch dev veniva ritestato e anche i membri del team eseguivano gli opportuni
User Acceptance test per verificare le varie funzionalità implementate. Il
deploy finale del progetto per la produzione è stato fatto sull’ambiente
Github Pages.
In questa fase sono stati individuati i requisiti del sistema, partendo dalle descrizioni di alto livello, ottenute dal committente durante il knowledge crunching e i focus group. Successivamente si è proceduto con un raffinamento che ha portato alla definizione di requisiti più specifici, chiari e strutturati.
Si definiscono di seguito le aspettative del cliente e i requisiti che il prodotto dovrà soddisfare, espressi con una terminologia ad elevato livello astrattivo.
Il prodotto dovrà costituire un unico servizio per consultare e paragonare diverse previsioni meteo provenienti da vari provider internazionali.
L’applicativo dovrà permettere di visualizzare all’utente le previsioni aggregate.
Il prodotto dovrà facilitare le decisioni dell’utente e permettere di arrivare facilmente ad una previsione affidabile.
Opzionalmente il prodotto dovrà fornire un sistema di notifiche giornaliere.
Di seguito vengono riportate le richieste mosse dal cliente in maniera informale evitando termini tecnici, successivamente tali richieste saranno formalizzate per quanto possibile. Il prodotto dovrà fornire:
L’accesso al sistema da qualunque dispositivo munito di connessione alla rete, anche mobile o tablet.
Tutte le operazioni necessarie per consultare previsioni meteo.
Prestazioni adeguate per il caricamento.
Un’ interfaccia intuitiva e usabile.
Possibilità di creare un account in cui gestire le proprie informazioni.
Possibilità di registrare una centralina.
Possibilità di valutare l’affidabilità dei provider.
Un’esperienza personalizzata e user-friendly.
Di seguito sono riportate tutte le user stories formulate assieme agli utilizzatori
Come utente voglio:
poter visualizzare le previsioni odierne per una località specifica o per la propria posizione attuale.
poter visualizzare le previsioni relative ai prossimi giorni per una località specifica o per la propria posizione attuale.
poter impostare la fiducia per ogni servizio usato e fornire un feedback, con la possibilità anche di eliminarlo.
specificare la località preferita di cui vedere le previsioni non appena viene visualizzata l’area riservata, oppure modificare o rimuovere quest’ultima.
aggiungere un device, registrandolo come centralina meteo a cui richiedere le previsioni con la possibilità di modificarlo o rimuoverlo.
ricevere notifiche ad una certa ora con le previsioni giornaliere sulla località preferita.
visualizzare le statistiche e indici di affidabilità di un provider in base ai feedback degli altri utenti.
Di seguito si riportano i requisiti funzionali, descrivendo in modo più dettagliato possibile le funzionalità che deve avere l’applicazione:
fornire la possibilità di aggiungere una previsione inserendo una località specifica o tramite coordinate geografiche.
ridurre il tempo necessario per consultare più previsioni.
fornire i seguenti dettagli delle previsioni: condizione meteo, temperatura, pressione, quantità di pioggia e umidità.
produrre le previsioni aggregate come media di tutte le previsioni dei vari provider.
offrire previsioni correnti e fino a tre giorni.
fornire per ogni provider meteo un indice di affidabilità, dato dalla media dei ratings dei suoi feedbacks.
fornire maggiori funzionalità per un utente registrato quali poter aggiungere, aggiornare oppure rimuovere le centraline, la località preferita e eventuali feedbacks sui provider.
fornire un meccanismo di notifiche che invii ad una certa ora le previsioni giornaliere sulla località preferita dell’utente via email.
salvare in memoria le ultime previsioni in modo da risparmiare tempo su richieste successive della stessa zona.
L’applicativo web deve consentire ad ogni utente di accedere con una serie di credenziali, e dividere le operazioni consentite in base ai permessi concessi. Il sito è suddiviso in pagine:
Autenticazione: Pagina di login per effettuare l’accesso e pagina di registrazione per i nuovi utenti.
Home: dove è possibile registrarsi, accedere, visualizzare le previsioni. E’ visibile da chiunque. Mostra brevemente, con l’aiuto di immagini, le funzionalità del sito.
Profilo Privato: dove visualizzare e modificare le proprie informazioni o gestire i propri feedbacks e centraline. Solo il proprietario del profilo può accedere a questa pagina.
Profilo Pubblico: serve per visualizzare le informazioni di un altro utente. E’ visibile da chiunque.
Forecast dove vengono visualizzate le condizioni meteo correnti e le previsioni dei prossimi tre giorni. Queste possono essere sia aggregate che non. E’ visibile da chiunque.
Feedbacks visualizza i feedbacks dei vari provider e i loro indici di affidabilità. E’ visibile da chiunque, ma si possono aggiungere feedbacks solo se registrati.
About mostra informazioni sugli sviluppatori del progetto e sullo scopo dell’applicativo, con un modulo di contatto per chiedere informazioni o segnalare problemi agli admin.
Il sistema dovrà rispettare i seguenti requisiti non funzionali per un’alta qualità:
Reattività: L’applicazione dovrà essere reattiva e fornire un basso tempo di risposta, tutte le azioni dovranno essere processate istantaneamente e le informazioni dovranno essere aggiornate subito.
Modularità: L’applicazione dovrà essere modulabile, con lo scopo di aggiungere senza problemi eventuali nuove funzionalità.
Scalabilità: L’applicativo dovrà necessariamente consentire di aumentare o diminuire il numero di utenti gestiti senza particolari problemi.
Disponibilità: L’applicazione dovrà essere disponibile 24/7. L’utilizzo di più api per il meteo , oltre allo scopo di fornire l’aggregazione delle previsioni, ha anche quello di mantenere le previsioni disponibili anche se qualche provider è momentaneamente down.
L’applicazione dovrà lavorare senza errori e fornire una buona "user experience" tramite un’interfaccia responsive e usabile. Mostrerà:
alert in caso di errori (ad esempio: qualora le previsioni non siano state caricate correttamente oppure ci sia stato un errore durante la registrazione o il login, etc...).
alert in caso le operazioni siano avvenute con successo per facilitare l’esperienza utente (ad esempio: la registrazione o il login sono avvenuti con successo, la centralina o il feedback sono stati aggiunti correttamente, etc...).
Si definiscono i vincoli a livello tecnologico e di implementazione che sarà necessario rispettare nella realizzazione dell’applicativo.
In quanto progetto sviluppato per l’esame di Applicazioni e Servizi Web è necessario che le tecnologie usate rispettino gli standard di insegnamento. Per tale motivo è stato richiesto di utilizzare un elenco di tecnologie viste a lezione. Esse sono Node.JS, MongoDB, Express.JS e un framework per lo sviluppo di applicazioni frontend tra Vue.JS, Angular o React.
Abbiamo deciso di dividere il nostro sistema in due macro componenti: un applicativo server, che si occupi di gestire le richieste degli utenti, e un applicativo client, che si occupi di interrogare il server per richiedere informazioni. Le specifiche imposte dalla prova di esame in corso imponevano di usare determinate tecnologie per lo sviluppo di tali componenti, ma non imponevano altri vincoli. Abbiamo scelto noi di sviluppare i due componenti come progetti separati per aumentare l’indipendenza di un componente rispetto l’altro.
Le funzioni da qui demandate all’applicativo Server sono:
Richiesta di previsioni meteo da providers esterni: ci siamo registrati ai seguenti provider di previsioni meteo internazionali:
Open Weather Map
Troposphere
Quando il server viene interrogato per una previsione, la richiede a sua volta alle sorgenti di dati disponibili, che possono essere:
Servizi esterni (sopra citati)
Centraline degli utenti registrati
Non appena i risultati saranno ricevuti, sono immediatamente processati e forniti in output. Le unità di misura devono essere tutte uniformi e convertite all’occorrenza.
Richiesta di autenticazione da parte dei client: date le credenziali degli utenti, il server si deve occupare di verificarne la presenza nella base dati degli utenti registrati nel sito. Dopo averne verificato l’autenticità e la validità, deve rilasciare un token di autenticazione da utilizzare nel caso in cui bisognasse richiedere delle risorse protette.
Richiesta di feedbacks dei providers meteo: fornire un sistema di recensioni, le quali possono essere lasciate per ogni provider in base alla correttezza delle sue previsioni meteo. Successivamente calcolare la valutazione media di ogni servizio consultabile.
Notifica di previsioni meteo a caselle di posta elettronica: configurando un account di posta elettronica per il proprio utente, il server deve poter inviare delle emails a chi ne fa richiesta per poter conoscere, all’inizio della propria giornata o nel momento che si ritiene più opportuno, le previsioni per la località preferita.
Le funzioni da qui demandate all’applicativo Client sono:
Presentazione del progetto, degli autori e delle funzionalità messe a disposizione.
Fornitura di un’interfaccia utente semplificata per la richiesta delle previsioni meteo all’applicativo Server:
che renda comodo ed intuitivo la consultazione e la fruizione delle previsioni meteo dei vari providers
che calcoli in automatico le statistiche relative alla distribuzione, alle differenze e similitudini dei risultati ottenuti dalle api
Gestione delle impostazioni e dei dati personali degli utenti: registrandosi al sito, ogni utente fornisce un insieme di dati e informazioni che devono essere mantenute, consultabili e modificabili agilmente. Le informazioni gestite comprendono anche la località preferita dell’utente, le centraline registrate e i feedbacks rilasciati.
Gestione dei feedbacks rilasciati dagli utenti: deve rendere possibile creare delle recensioni per i providers e renderle consultabili da tutti gli utenti, assieme alla valutazione media del servizio stesso.
Oltre a questi componenti deve essere sviluppato anche il componente per simulare una centralina meteo amatoriale che possa ricevere le richieste del server per ottenere le previsioni meteo della zona in cui è situata. Per fare questo, abbiamo creato un nuovo progetto indipendente che assolva a questi compiti.
Nel seguente schema vengono anche mostrati altri due componenti, chiamati Providers, che rappresentano i servizi esterni a cui ci affidiamo per ottenere dei dati meteo veritieri.
Avendo l’esigenza di fornire all’utente i risultati delle previsioni meteo da lui richieste non appena essi fossero stati pronti, una scelta cruciale per il progetto è stata scegliere riuscire una tecnologia per mantenere un canale dati aperto tra il Client e il Server. Il protocollo HTTP non fornisce di per se un meccanismo tale per cui sia il Server ad inviare una richiesta di connessione al Client. Per questo motivo si è optato ad un approccio basato sulle Sockets. In particolare, abbiamo scelto la libreria Sockets.IO, già vista a lezione.
Nella figura 5.2 è illustrato come avviene un flusso di richieste di previsioni meteo dal Client al Server.
Procedendo in ordine numerico, al punto 1., il Client invia una richiesta al Server contenente il nome della località di cui vuole sapere le coordinate. Il Server nei punti 2. e 3. prepara la richiesta da inviare ai vari provider di previsioni meteo. Nello specifico vengono preparate solamente altre due richieste per altrettanti providers, ma in un caso reale potrebbero essercene molte di più. Da notare come in questo punto avvenga una divisione del flusso computazionale principale in due flussi separati ed indipendenti. Nei punti 4. e 5. tali flussi eseguono autonomamente le richieste delle previsioni al provider meteo esterno a loro assegnato. Ricevuta la risposta nei punti 6. e 7., la inoltrano al Client nei punti 7. e 8..
In questo capitolo verrà spiegato come si è giunti a realizzare l’applicativo, confrontando poi i mockup con le effettive interfacce utente, descrivendone i componenti e infine mostrando lo schema della base di dati implementata.
Come tutti i programmi, il progetto è costituito da frontend e backend. Questi denotano rispettivamente la parte visibile all’utente di un programma e con cui egli può interagire —tipicamente un’interfaccia utente— e la parte che permette l’effettivo funzionamento di queste interazioni. Il frontend, nella sua accezione più generale, è responsabile dell’acquisizione dei dati di ingresso e della loro elaborazione con modalità conformi a specifiche predefinite e invarianti, tali da renderli utilizzabili dal backend. Il collegamento del frontend al backend è un caso particolare di interfaccia.
Fin dall’analisi del progetto è stato chiaro che il target dell’applicazione fosse ampio, infatti l’insieme degli utenti interessati comprende chiunque abbia la necessità di consultare delle previsioni meteo. Per questo motivo, le interfacce e il funzionamento dell’applicazione sono stati progettati per essere adoperati anche dagli utenti meno esperti.
In seguito ad un’analisi preliminare del problema sono stati prodotti dei mockup della grafica per dare l’idea delle funzioni e dei requisiti dell’applicativo. Le pagine effettive si sono evolute durante lo sviluppo ma mantengono le linee guida dei mockup. Vengono descritte le interfacce utente più importanti. Si consulti anche il capitolo 7.4 per visualizzare il risultato finale delle pagine.
La homepage è la pagina principale di presentazione. In bella vista presenta una card con una barra di testo dove inserire il nome della località con l’icona di una mappa per le coordinate geografiche, con due bottoni in basso per richiedere le previsioni. Attraverso i bottoni Login e Register inoltre si può accedere alle pagine di autenticazione.
Viene pensata una pagina di login classica con la possibilità di recuperare la password e una pagina di registrazione. Effettuata la registrazione viene chiesto agli utenti di completare la propria iscrizione cliccando sul link dell’email di conferma.
Il fulcro dell’applicazione è sicuramente la pagina delle previsioni. Inizialmente la pagina visualizza un’immagine esplicativa con in alto una barra di testo dove inserire la località oppure richiedere le coordinate geografiche attuali attraverso l’icona della mappa. Cliccando sui due pulsanti a lato si può richiedere il meteo attuale o quello dei prossimi tre giorni. Comparirà così in posizione centrale la card della previsione aggregata e in basso un insieme di schede che rappresentano le previsioni di ogni provider, con informazioni utili sul meteo. Nel caso siano richieste le previsioni dei prossimi tre giorni, la pagina si aggiornerà mettendo a disposizione un tooltip di bottoni per scegliere il giorno specifico e uno slider per scegliere l’ora della previsione.
Nella pagina delle recensioni è possibile visualizzare uno slider che contiene le schede con le recensioni relative ai vari provider. Tramite la barra di ricerca in alto è possibile trovare quello desiderato digitandone parte del nome. Ogni scheda contiene una lista di recensioni lasciate dagli utenti. Per ogni recensione viene mostrato l’avatar dell’utente che l’ha rilasciata, con a lato la sua valutazione. Questa è stata espressa graficamente da una a cinque stelle. Cliccando sul campo è possibile visualizzare il profilo pubblico dell’utente associato.
All’estremità di ogni scheda, se si è autenticati, sarà presente il pulsante per aggiungere una nuova recensione. Se si clicca su di esso si visualizzerà una finestra con il rating da inserire. Questa è espandibile: si possono anche specificare il campo della previsione che si vuole recensire (ad esempio temperatura minima, Pressione, etc), la data della previsione alla quale ci si riferisce, e eventuali note. In cima ad ogni card si è deciso di far visualizzare una statistica, calcolata come media dei rating di quel provider. Si tratta di un indice di affidabilità che calcola l’accuratezza della previsione, basandosi sull’opinione delle altre persone.
La pagina del profilo privato dà la possibilità ad ogni utente di visualizzare e gestire le proprie informazioni personali. Cliccando su "edit" si aprirà un dialog che consentirà di poter modificare la propria password o la propria posizione preferita. L’utente ha la possibilità di visualizzare le proprie centraline, di aggiungerle tramite il pulsante "+" in alto della tabella, modificarle e eventualmente cancellarle (ne verrà richiesta la conferma). L’utente ha la possibilità di visualizzare le proprie recensioni e eventualmente cancellarle (ne verrà richiesta la conferma). Navigando in questa pagina c’è anche la possibilità di cancellare il proprio account tramite un bottone apposito in fondo alla pagina.
La pagina del Profilo pubblico ha la stessa struttura del Profilo privato, ma qui nessuna operazione di modifica è concessa.
Infine una pagina per i contatti che consente l’inserimento di un messaggio/ticket per il supporto tecnico e alcune informazioni sul team di sviluppo.
Si descrivono in breve i componenti principali usati per ogni pagina. Prima di tutto si elencano i componenti presenti in tutte le pagine:
Appbar: E’ una barra colorata situata nella zona alta della pagina. Contiene tre componenti:
Icona Utente: Situata nell’estremità destra, permette di autenticarsi o registrarsi al sito se l’utente non ha eseguito l’accesso, altrimenti esso può visualizzare la propria pagina del profilo privato o effettuare il logout. Il suo aspetto cambia: se è autenticato mostra le iniziali del proprio nome e cognome, altrimenti mostra un’icona generica.
Titolo Weather Vortex: Situata nella parte centrale, permette di navigare alla home cliccando su di esso.
Icona Menù: Situata nell’estremità sinistra, consente di mostrare o nascondere la barra di navigazione (Navbar).
Navbar: Si tratta della barra di navigazione attraverso cui l’utente può muoversi nelle principali finestre del sito.
Footer: Il footer a fine pagina contenente dei link utili.
La pagina Home è composta dai principali componenti:
QuickForecastCard: Card che viene usata come scorciatoia per visualizzare le previsioni.
AccountButtons: Contiene i bottoni per accedere alle pagine di autenticazione.
InfoMain: Insieme di cards di descrizione
checkStatus: Card che mostra lo stato del server.
La pagina Feedbacks è composta dai seguenti componenti:
SlidesOrizontalGroup: Si tratta dello slider che contiene le schede dei vari provider con le recensioni. E’ composto da due sottocomponenti:
ServiceRatingList: Rappresenta la lista delle recensioni del provider. Ogni campo recensione è composto dall’avatar dell’utente, dalle sue iniziali e dalla sua recensione.
FeedbackDialog: Rappresenta il dialog per l’aggiunta della recensione.
La pagina Forecast è composta dai seguenti componenti:
EmptyForecast: Mostra la pagina iniziale delle previsioni.
CurrentForecast: Mostra la pagina del meteo attuale. E’ composta dal seguente sottocomponente:
ForecastGroup. Esso rappresenta l’insieme delle previsioni meteo. Richiama il componente WeatherForecastCard che rappresenta una singola previsione per uno specifico provider o il meteo aggregato. Esso contiene la descrizione del meteo, la data, la temperatura minima e massima, la pressione, l’umidità, la quantità di nuvole, di pioggia e di neve.
ThreeDaysForecast: Mostra la pagina delle previsioni dei prossimi tre giorni. Richiama gli stessi componenti di "CurrentForecast".
La pagina Profilo Privato è composta dai seguenti componenti:
PrivateUserCard: Si tratta della card che visualizza le informazioni private dell’utente: avatar, nome, cognome, data di creazione, email, posizione preferita e bottone di modifica.
PrivateUserReviews: Tabella che visualizza le recensioni rilasciate. Contiene i relativi campi: provider, valutazione, commento e un pulsante per la cancellazione.
PrivateUserControlUnits: Tabella che visualizza tutte le centraline inserite. E’ costituita dai seguenti campi: nome, posizione, url e due pulsanti per la modifica e la cancellazione.
La pagina Profilo Pubblico ha i seguenti sottocomponenti:
PublicUserCard: Si tratta della card che visualizza le informazioni pubbliche dell’utente: avatar, nome, cognome, eventuale posizione preferita.
PublicUserReviews: Tabella che mostra le recensioni lasciate dall’utente. Contiene i seguenti campi: provider, recensione, commento.
PublicUserControlUnits: Tabella che visualizza tutte le centraline inserite dell’utente. E’ costituita dai seguenti campi: nome, posizione, url.
La pagina About è composta dai seguenti componenti:
Timeline: Componente che visualizza cronologicamente gli vari stadi del progetto.
MeetTeam: Un insieme di cards per descrivere gli autori del progetto.
ContactUs: Componente che funge da modulo di contatto.
Oltre ai componenti descritti sopra all’interno di ogni pagina un componente di Vue.js che è stato utilizzato è il vue-router, per il routing e la navigazione delle pagine. Esso consente, tramite una router-view, di visualizzare i componenti desiderati (che insieme compongono le varie interfacce utente).
Viene ora mostrato lo schema di database utilizzato dall’applicazione:
Ci sono cinque modelli che sono il fulcro dell’applicazione, essi si trovano nella cartella models. Essi costituiscono un modello di dati da salvare in MongoDB, che vengono usati per istanziare oggetti che saranno automaticamente dotati di metodi per svolgere le classiche operazioni CRUD.
user - Rappresenta il modello dell’utente. I suoi campi sono:
firstName: nome dell’iscritto.
lastName: cognome dell’iscritto.
password: password dell’iscritto.
email: email dell’iscritto.
token: stringa generata durante il login per verificare l’autenticazione dell’utente.
creationDate: data di creazione dell’account.
emailToken: token per verificare l’iscrizione.
resetLink: token per il cambio della password.
isVerified: booleano che indica se l’utente è stato verificato.
preferred: una eventuale località preferita.
stations: elenco delle centraline dell’utente.
feedbacks: elenco delle recensioni dell’utente.
feedback - Rappresenta il modello della recensione. I suoi campi sono:
rating: valutazione della recensione.
provider: il provider a cui la recensione si riferisce.
user: utente che ha rilasciato la recensione.
creationData: data di creazione della recensione.
forecastData: data della previsione su cui si è basata la valutazione della recensione.
fields: eventuali campi della previsione da valutare.
description: eventuale descrizione.
location - Rappresenta il modello della località. I suoi campi sono:
name: nome della località.
position: posizione della località espressa in coordinate geografiche tramite latitudine e longitudine.
Serve per memorizzare le richieste di previsioni che sono state fatte.
provider - Rappresenta il modello del provider che fornisce il meteo. I suoi campi sono:
name: nome del provider.
average: la media di tutte le valutazioni date al provider.
feedbacks: lista di tutte le recensioni del provider date dagli utenti.
station - Rappresenta il modello della centralina. I suoi campi sono:
authKey: valore usato per autenticare richieste alla stazione.
name: nome della centralina.
owner: proprietario della centralina.
position: nome della località in cui si trova.
url: url della centralina.
Gli storage sono dei componenti che si occupano di manipolare i dati e i modelli dell’applicazione nascondendo il supporto di memorizzazione degli stessi.
database storage - storage che usa come supporto di memorizzazione il database.
webservice storage - storage che richiede i dati ad un web service esterno. Nella nostro caso si tratta di gestire le richieste da provider esterni e recuperarne le previsioni.
I Controllers contengono la logica applicativa e si occupano di fornire i dati estratti dagli Storage agli utenti. Tra i compiti svolti rientrano l’invio di email e le risposte alle chiamate HTTP dei clients.
Le Routes si occupano di prendere in carico le chiamate HTTP in entrata e inoltrarle ai giusti Controllers. Anche le richieste che arrivano dalle Sockets per gestire le previsioni del meteo vengono smistate da questi componenti.
Per la parte backend ci si è avvalsi della tecnologia Node.js, Express e MongoDb per il database. Per l’invio delle email è stato utilizzato un modulo di Node.js chiamato Nodemailer.
Per supportare la comunicazione bidirezionale tra client e server ci si è avvalsi della libreria Sockets.Io.
Si riportano ora alcuni aspetti implementativi del server che si ritiene opportuno evidenziare.
All’avvio del Server, viene subito richiamata la funzione di Sockets.IO per rimanere in ascolto di nuove connessioni da parte delle sockets dei clients per richiedere le previsioni meteo:
.on("connection", (socket) => {
io.on("current", (arg) => {
socketif (arg.locality) {
// Retrieve forecasts by locality.
else if (arg.latitude && arg.longitude) {
} // Retrieve forecasts by geolocation position.
;
})
.on("threedays", (arg) => {
socket// Same as before.
;
}); })
In seguito, quando i risultati delle richieste di previsioni meteo ai servizi esterni sono pronti, vengono immediatamente inoltrati ai clients tramite gli eventi delle sockets:
openWeatherStorage.currentByLocation(latitude, longitude)
.then((result) => {
.emit("result", ...);
socket
}).catch((error) => {
.emit("forecast_error", ...);
socket;
})
troposphereStorage.currentByLocation(latitude, longitude)
.then((result) => {
.emit("result", ...);
socket
}).catch((error) => {
.emit("forecast_error", ... );
socket; })
Per l’autenticazione è stato deciso di utilizzare il sistema JWT (Json Web Token), firmati dal backend. Al momento del login il server rilascia un token al client contenente dei dati utili all’autenticazione. Il client, inviando al server il token ricevuto assieme alle richieste che necessitano di autenticare il richiedente, potrà essere riconosciuto e verificato dal server. In questa maniera il server rimane stateless, dato che le informazioni dell’autenticazione devono essere necessariamente inviate ad ogni richiesta da parte del client.
// generate token when user log in
.methods.generateToken = function (cb) {
userSchemavar user = this;
var token = jwt.sign({ _id: user._id }, process.env.SECRET);
.token = token;
user.save(function (err, user) {
userif (err) return cb(err);
cb(null, user);
;
});
}
// find by token
.statics.findByToken = function (token, cb) {
userSchemavar user = this;
.verify(token, process.env.SECRET, function (err, decode) {
jwt.findOne({ _id: decode, token: token },
userfunction (err, user) {
if (err) return cb(err);
cb(null, user);
};
);
});
}
//delete token, when the user logout
.methods.deleteToken = function (token, cb) {
userSchemavar user = this;
.update({ $unset: { token: 1 } },
userfunction (err, user) {
if (err) return cb(err);
cb(null, user);
};
); }
Per facilitare l’utilizzo della validazione del token JWT è stato prodotto un middleware facilmente inseribile nel flusso di Express. Questo middleware recupera il token disponibile dai cookies. Se lo trova associato ad un utente nel database, recupera i dati su di esso e li inserisce nella richiesta per renderli disponibili nell’handler della route desiderata.
let auth = (req, res, next) => {
let token = req.cookies.auth;
if (!token) {
// Response the missing token result.
return res.status(401).json({
error: "Missing auth token in the request.",
;
})
}
.findByToken(token, (err, user) => {
Userif (err) throw err;
if (!user)
// Notify the unauthorized access.
return res.status(403).json({
error: "Didn't found any user matching the auth token provided.",
;
})
// Use the found data in next handler.
.token = token;
req.user = user;
reqnext();
;
}); }
Si è avuta la necessità anche di gestire alcuni dati sensibili dell’utente, come le password. E’ stato utilizzato bcrypt, un modulo contenente le più comuni funzioni di hashing per salvare le password in maniera sicura nel database; viene utilizzato al momento della registrazione di un utente quando si deve salvare la password (viene salvato il suo hash con il relativo valore di sale), e al login quando bisogna confrontare la password ricevuta dall’utente con quella salvata.
.pre("save", function (next) {
userSchemavar user = this;
if (user.isModified("password")) {
.genSalt(salt, function (err, salt) {
bcryptif (err) return next(err);
.hash(user.password, salt, function (err, hash) {
bcryptif (err) return next(err);
.password = hash;
usernext();
;
});
})else {
} next();
};
})
.methods.comparePassword = function (password, cb) {
userSchema// Compare the user password when user tries to login
.compare(password, this.password, function (err, isMatch) {
bcryptif (err) return cb(next);
cb(null, isMatch);
;
}); }
Per lo sviluppo del Client è stato usato Vuetify, un framework di componenti di Material Design per Vue. js che consente agli sviluppatori di creare incredibili applicazioni in modo rapido ed efficiente.
Per gestire lo stato dell’applicazione, abbiamo avuto la necessità di sfruttare il framework Vuex. Esso fornisce un’interfaccia unica per tutta l’applicazione per interrrogare lo stato e modificarlo. Questo permette di avere un’unica fonte di verità dei dati e ne preserva maggiormente l’integrità.
Graficamente potremo delinearne così la struttura:
Il nostro stato è rappresentato dal listato sottostante, in particolare abbiamo memorizzato la visibilità della barra di navigazione e lo stato di autenticazione dell’utente.
const state = {
drawer: null,
user: null,
; }
Lo stato viene quindi letto quando bisogna mostrare o no la barra di navigazione oppure capire quando un utente è autenticato oppure no.
L’applicativo per la centralina è stato sviluppato anch’esso con le tecnologie Node.JS ed Express. Essendo un progetto di simulazione di una centralina reale, dispone di solamente due funzioni: una per ottenere info sullo stato del dispositivo e una per ottenere le condizioni meteo correnti (generate staticamente, data la natura del progetto).
const express = require("express");
const weather = require("./storage/weather.storage");
const app = express();
.get("/current", weather.readAll);
app
.get("/info", (req, res, next) =>
app.status(200).json({
res...
;
}); )
Il prodotto finale ha subito delle evoluzioni rispetto al mockup ma segue comunque le linee guida imposte. Nonostante la resa grafica sia stata rivoluzionata, la user experience e i meccanismi di navigazione del sito sono rimasti gli stessi. Il cambiamento più degno di nota è stato lo spostare le voci del menù dalla barra in alto all’apposito scomparto a sinistra. Qui di seguito sono riportati gli screenshot delle schermate più importanti.
La home del sito è la pagina visivamente più importante, in quanto sarà la prima che l’utente visualizza e quella che vedrà più spesso. Per facilitare l’esperienza, il primo box disponibile è quello delle previsioni. Questa scelta è stata fatta soprattutto per incentivare i nuovi utenti a provare le funzionalità del sito immediatamente, senza che debbano sforzarsi a cercarle. Oltre all’immediatezza intuitiva la scelta aiuta a velocizzare le operazioni per i visitatori assidui del sito, che vogliono raggiungere il risultato desiderato con il minore numero di click possibili.
Sotto all’elemento per le previsioni sono disposti due pulsanti di Login e Registrazione. Questo funge da incentivo a creare un account o a effettuarvici l’accesso. Qualora l’utente effettui il login e ritorni sulla home, i pulsanti non saranno più visualizzati.
La schermata di login ha una resa molto funzionale e chiara. Questa scelta ha lo scopo di rendere semplice e intuitiva l’operazione chiave di collegarsi al proprio account, senza che l’utente possa cliccare altrove e non portarla a termine.
Il profilo privato permette di gestire i propri dati. Un design tabulare è stato scelto per rendere chiare le varie operazioni possibili di modifica e cancellazione. Tramite le due tabelle l’utente può visionare immediatamente i feedback rilasciati e quali centraline siano collegate al suo profilo.
La pagina delle previsioni permette di selezionare una posizione e scegliere tra la previsione corrente e quella futura fino a 3 giorni. Nella barra di ricerca è possibile scrivere il nome di una località o passare direttamente le coordinate. Qualora si volesse avere le previsioni nella posizione corrente è possibile chiedere la geolocalizzazione.
La pagina delle previsioni attuali permette di comparare facilmente le differenti previsioni dei provider. In alto è disponibile sempre la barra di ricerca geografica per cambiare località. Un’ulteriore barra di ricerca fornisce la possibilità di ricercare uno specifico provider o centralina digitando il nome o parte di esso.
La card centrale fornisce i dati aggregati. La stima viene fatta prendendo la media dei valori e la previsione con frequenza maggiore.
La pagina con le previsioni future segue lo stesso schema della pagina delle previsioni attuali. La scelta è stata presa per facilitare l’utente per permettergli di decidere di scegliere la finestra temporale di cui sapere le previsioni. Inoltre, sono presenti dei pulsanti per poter selezionare le 3 giornate successive e uno slider per poter decidere anche l’orario.
La pagina dei feedback raccoglie tutte le recensioni lasciate dagli utenti divise per provider. Anche qui è possibile ricercarne uno con l’apposita barra. Cliccando sull’icona di un utente si viene indirizzati al suo profilo pubblico. Qualora si sia autenticati è possibile lasciare una recensione direttamente dal pulsante sottostante.
Lo sviluppo delle applicazioni web a livello professionale richiede la qualità e la robustezza del codice che è stato prodotto. Per avere delle metriche concrete su tali metriche, è necessario eseguire intensivamente ed estensivamente test sul prodotto, sia automatici che manuali.
Le parti più importanti inerenti la logica di business sono stati testati con gli unit test per migliorarne la robustezza e l’affidabilità. Molte componenti dell’applicativo Server sono state sviluppate con un approccio Test Driven Development e sono state controllate molte volte prima di essere messe in produzione.
In generale si è cercato di tenere un approccio sistematico per affrontare i problemi:
Si cercava di modellare in modo il più reale possibile le entità che si sarebbero manipolate successivamente, cercando di capire il dominio del problema e quali fossero tutti i dati di cui si avesse bisogno;
Successivamente si sviluppava il componente che sarebbe stato delegato a interagire principalmente con la base dati delle entità appena modellate. Creati i test automatici per controllare che i dati venissero manipolati correttamente a seconda delle necessità, solamente in un secondo momento, dopo aver appurato il fallimento dei test appena scritti, si sarebbe proceduto a scrivere il codice necessario per farli riuscire;
Allo stesso modo, si sviluppavano anche i componenti della logica di business.
Infine, al manifestarsi di ulteriori problemi e malfunzionamenti, si è sempre cercato innanzitutto di comprendere se ci fossero stati dei problemi nell’implementazione dei test e che le loro funzionalità fossero quelle che ci si aspettava. In tal caso, allora si procedeva alla stesura di altri test automatici che permettessero di riprodurre il problema e risolverlo.
Il backend utilizza il testing stack Mocha + Chai + Sinon.
Mocha è il testing framework ricco e semplice che consente di creare facilmente degli unit test eloquenti. Chai è la libreria di assertions BDD/TDD che consente di creare le asserzioni multi-paradigma per i test. Tali asserzioni rendono i test più leggibili e forniscono messaggi di errore migliori.
Sinon è la libreria per creare e gestire i test spies, stubs e mocks da utilizzare nei test. Nel nostro caso è stato utilizzato soltanto per simulare l’invio delle email.
Durante lo sviluppo del backend è stata adoperata una collection Postman per testare tutte le varie chiamate al server anche in assenza dell’applicativo client definitivo, in attesa di sviluppo.
Alla fine della realizzazione del progetto tutti i membri del team hanno testato il sistema integrale per decidere se poteva essere accettato o meno. Ciò ha permesso di riconoscere alcune inconsistenze e aspetti poco chiari e di sistemarli. Inoltre la piattaforma è stata fatta provare a degli utenti che non hanno seguito lo sviluppo (e che quindi non sono soggetti ad un bias cognitivo come quello sviluppato da noi programmatori). Gli utenti, inoltre, hanno contribuito non solo al testing finale, ma a tutto lo sviluppo del sito. Sono stati interrogati periodicamente fornendo passo passo dei feedback prezioni e delle dritte utili per raggiungere una UX appagante.
In questo capitolo viene spiegato come scaricare e utilizzare la piattaforma WeatherVortex. Essa è consultabile a questo link: WeatherVortex Organization.
Nella prima visione del progetto, era stato pensato effettuare il deploy del progetto Client sulle Github Pages e quello del progetto Server su Heroku.
Github Pages è una funzionalità di Github che permette di generare e ospitare un sito web scritto con le tecnologie HTML, CSS e JS memorizzato nel repository su Github. Heroku è uno servizio PaaS progettato per aiutare a realizzare e distribuire applicazioni online. Il piano gratuito per entrambi questi ambienti infatti sarebbe stato sufficente.
Entrambe si integrano con il repository Github per rendere semplice il deploy. Infatti, ad ogni commit sul branch main dei repository, avviene in automatico la compilazione e, se ha successo, le applicazioni vengono pubblicate.
Il sito sulle Github Pages è visualizzabile a questo link:
https://weather-vortex.github.io/weather-vortex-client/
Tuttavia, successivamente ci siamo accorti che l’ambiente Pages non ci permetteva di supportare anche l’uso dei cookie con il parametro HTTP only valorizzato a True perché il dominio github.io è elencato in una reserved list e i browser non permettono di salvare cookies di quel tipo in questi domini a meno che non provengano dal dominio stesso. Questa configurazione quindi si è dimostrata inadeguata ai fini del progetto, dato che il dominio dal quale sarebbero arrivati i cookies di autenticazione corrisponde ad un altro (https://weather-vortex-server.herokuapp.com/). Abbiamo dovuto quindi trovare un’altra modalità che non richiedesse di stravolgere l’architettura del nostro sistema senza rinunciare alla sicurezza.
Data la presenza in tutti i repository dei file Dockerfile per la creazione delle immagini Docker e l’esecuzione in containers come visto a lezione, abbiamo pensato di sfruttare tali funzionalità con l’aggiunta dell’applicativo Docker Compose per la dimostrazione in sede d’esame.
Per dispiegare tutti i componenti utili per l’applicazione è stato impiegato il gestore di container Docker e la sua estensione Docker-compose.
Per ciascun componente del sistema è stato creato il file Dockerfile, contenente le istruzioni per generare l’immagine dove il componente possa essere eseguito.
Per l’immagine dell’applicativo Server e Centralina è stata richiesta una configurazione semplice e lineare, come quella vista al seminario a lezione:
FROM node:16-alpine
...
CMD ["npm", "start"]
Per l’immagine dell’applicativo Client è stato necessario programmare due fasi di creazione dell’immagine, come nel seguente listato:
# build stage
FROM node:lts-alpine as build-stage
...
RUN npm run build
# production stage
FROM nginx:stable-alpine as production-stage
...
CMD ["nginx", "-g", "daemon off;"]
Questo è necessario perché per l’applicativo con Vue è richiesto l’uso di un reverse proxy per gestire la navigazione con il componente Vue-Router, ma non in fase di build, dove basta soltanto partire da un’immagine leggera per snellire il processo.
Il repository contenente la configurazione Docker-Compose per Weather Vortex è pubblica e presente a questo link:
https://github.com/Weather-Vortex/docker-compose.
Dopo aver apportato le opportune configurazioni descritte nel file Readme basterà infatti il comando [sudo] docker-compose up per avviare l’intero sistema.
Il lavoro è stato svolto utilizzando un approccio Scrum, con sprint periodici, di cui uno iniziale incentrato sullo studio delle tecnologie. Un diagramma di Gantt è stato creato all’inizio del progetto per definirne le tempistiche. Inizialmente una buona dose di tempo è stata impiegata per un design dettagliato, per non incorrere in cambiamenti in corso d’opera. Inoltre, si è prestata attenzione a costruire la relazione e la documentazione passo passo durante il lavoro. Qui di seguito viene riportato lo schema realizzato inizialmente.
Nonostante il programma dettagliato e le deadlines periodiche il progetto verso la fine si è dilazionato nel tempo. Lo si può vedere chiaramente dalla curva formata dal grafico. Riteniamo però che l’allungamento dei tempi sia dovuto anche a fattori esterni, quali l’inizio delle lezioni e il sovrapporsi di impegni non programmati. Di seguito è riportato il reale andamento del progetto nel tempo.
Gli sprint sono stati portati avanti nel seguente modo:
Pianificazione a inizio sprint degli obiettivi, tempistiche e responsabilità nel periodo dello sprint corrente. Diviso in due parti:
parte 1 Viene raffinato e rivisto il product backlog, viene effettuata la scelta dello sprint goal (what).
parte 2 Si decidono gli item e viene raffinato come implementarli (how). Effettuato con solo il team senza la figura del product owner
Breve meeting svolto giornalmente. Viene utilizzato per gli aggiornamenti sull’andamento del progetto, senza scendere nei dettagli implementativi.
Utilizzato per risolvere problemi che causano il blocco di un componente del team per parecchio tempo su una issue.
Riflessioni e considerazioni finali sullo spint passato. Suggerimenti per migliorare il prossimo. Diviso in tre parti:
Product backlog refinement aggiunta di dettagli e riordino del product backlog
Sprint review è stato ispezionato l’incremento, il Minimum Viable Product o di risultati sul processo. Discernere cosa è stato fatto e cosa no.
Retrospettiva Considerazioni sul team stesso e sui miglioramenti per il prossimo sprint.
All’interno dello sprint 0 il focus è stato posto sull’apprendimento delle tecnologie scelte più dal punto di vista tecnico. Inoltre è stato impostato l’ambiente di sviluppo, rendendolo condiviso e unificato. Infine sono state definite le operazioni chiave per le API REST, lo user data model e le procedure di user authentication, login e register.
architettura base server
scheletro relazione
All’interno dello sprint 1 il focus è stato sulla creazione del client, con l’utilizzo di Vue per creare le pagine base di esso e alcuni componenti chiave.
Pagina 404
Pagina About
Menu
All’interno dello sprint 2 sono stati fatti cambiamenti e miglioramenti su più parti del sito. Arrivati a questo punto inoltre è stato necessario anche occuparsi di bug creati in precedenza. E’ stato aggiunto il deploy automatico su GH Pages. Nuovi campi centralina sono stati aggiunti. La geolocalizzaizone ora acquisisce la posizione corrente.
Forecast Page
Homepage
Responsiveness Fixed
Footer
All’interno dello sprint 3 il focus è stato sul creare i componenti principali rimanenti. La pagina dei feedback è stata modellata dal lato grafico. L’homepage è stata completata assieme alla pagina di autenticazione. Sono stati aggiunti per gli sviluppatori dei codici rappresentanti le varie condizioni meteo.
Homepage completa
Leave Feedback Page
Autentication Page
All’interno dello sprint 4 il focus è stato nuovamente sulla correzione di errori e bug. Le routes sono state inoltre rifattorizzate. Sono stati aggiunti gli alert per rendere più intuitiva la navigazione del sito.
Refactoring
Bug fix
Alert
All’interno dello sprint 5 la mole di lavoro è stata notevole, essendo lo sprint finale. I feedback degli utenti sono stati recuperati dal DB e mostrati. La route per la password dimenticata è stata completata. Inoltre sono state implementate le previsioni meteo dalle stazioni. La funzionalità dell’aggregazione delle previsioni è stata definita.
Feedback Page
Forgot Password
IoT Forecast
Aggregation Forecasts
Questo progetto mi ha sin da subito motivato moltissimo nel lavorare data la sua natura intrinseca e l’oggetto del sistema da sviluppare. Essendo scout, ho spesso provato un certo astio nei confronti dei differenti providers di previsioni che non si riescono mai a mettere d’accordo e, più ne vengono consultati, più le idee diventano confuse. Con questo progetto ho sperato di creare qualcosa che io possa usare anche in futuro e che possa essere conosciuto anche da altre persone.
L’inizio dello sviluppo, in estate, è andato bene e liscio per poi rallentare drasticamente nel momento in cui sono rincominciate le lezioni. Questo ha fatto calare la mia motivazione. L’uso di tecnologie che io già conoscevo per via del mio lavoro extra universitario e di progetti personali non ha certo aiutato a proseguire a passo spedito.
Penso tuttavia che questo progetto mi abbia aiutato ad avere una migliore visione di cosa voglia dire sviluppare dei sistemi applicativi web al giorno d’oggi, avendo utilizzato tecnologie che vengono tutti i giorni utilizzate da altri milioni di persone al mondo e che sono in costatnte sviluppo.
Il risultato finale del progetto secondo me è buono ma non ottimo. Avrei voluto avere più tempo per poter portare a termine tutte le funzionalità che avevamo avuto in mente, ma con il susseguirsi dello sviluppo, abbiamo notato che avevamo sovrastimato il carico complessivo.
Questo progetto mi ha dato la possibilità di approfondire le mie conoscenze riguardanti l’utilizzo di NodeJs, Express e MongoDb. Tutte le tecnologie che sono state usate erano per me completamente nuove, ma sono soddisfatta del mio apprendimento. Ho anche compreso come con Vue si riescono a realizzare velocemente e in modo non troppo complesso degli applicativi molto interessanti ed user-friendly.
Un aspetto importante, non tanto riguardante l’ambito dello Sviluppo Web, che ho potuto imparare è l’importanza dell’organizzazione: collaborare in questo team mi ha incentivato ad organizzare il lavoro, e questo mi ha insegnato un modo migliore di lavorare. A inizio progetto eravamo partiti con in mente qualche funzionalità in più. Poi per una questione di tempi, un membro ha avuto qualche difficoltà in più, non sono stati realizzati. Sono comunque soddisfatta del progetto svolto e lo ritengo un’idea innovativa, magari da approfondire in futuro.
Al termine del percorso di sviluppo del progetto ritengo di aver acquisito una discreta moltitudine di nuove conoscenze. Sono state impiegate e integrate diverse tecnologie e metodologie anche complesse con cui sono state affinate parecchio le mie competenze nell’ambito. Sicuramente c’è ancora spazio per approfondire molti argomenti, ma nel complesso reputo sia servito a formare una base di conoscenza a tutto tondo. Il lavoro di gruppo ha permesso, infatti, di scambiarci nozioni a vicenda e ne sono più che contento, seppur mi rincresce non essere stato presente a volte come avrei voluto. Molte tecnologie usate sono state per me una scoperte in-itinere, in quanto completamente nuove. Ritengo comunque il progetto sia stato particolarmente ambizioso e il risultato ottenuto a mio parere è più che soddisfacente. Infine, spero questo lavoro possa rappresentare una buona base di partenza per un eventuale sviluppo futuro.
In futuro, il progetto potrà essere migliorato nelle sue parti lasciando spazio a nuove tecnologie e, auspicabilmente, anche ad una commercializzazione. Le aggiunte che abbiamo individuato sono sia di natura grafica che funzionale, ma, a causa delle tempistiche ridotte e del carico di lavoro, sono state demandate ad un’implementazione futura.
Eventualmente la parte funzionale si può estendere creando nuove pagine per l’utente finale, con sezioni quali "notizie", "video degli utenti", "allerte meteo". Inoltre nuove funzioni possono sempre essere aggiunte al backend per migliorare la parte di aggregazione delle varie previsioni con machine learning, ponderamento in base ai feedback o allo storico delle condizioni meteo reali. Può essere implementata una parte amministrativa del sito e integrata in maniera non invasiva della pubblicità.
La parte grafica invece può essere ulteriormente migliorata con animazioni e elementi accattivanti, eventualmente che rispecchino le attuali condizioni meteo. Inoltre mappe interattive possono aiutare l’utente ad avere un’idea più chiara della situazione geografica. Eventualmente anche temi personalizzati possono essere sviluppati per rispecchiare i gusti degli utilizzatori.
Negli sviluppi futuri includiamo anche un interfacciamento con i social maggiormente diffusi, oramai essenziali allo sviluppo di un business. In questo modo si potrebbe automatizzare la creazione di post, facilitare l’interazione tra gli utenti, lo sviluppo di una community e l’esposizione della piattaforma.
Inoltre, come possibili spin-off sono state individuate delle aree tematiche spesso ignorate in cui le previsioni sono necessarie, ad esempio previsioni per lo sport, quali venti per i praticanti di parapendio o correnti marine per i surfisti. Anche qui è altamente necessario l’utilizzo di device IoT.
A riguardo, in futuro si potrebbe pensare ad una commercializzazione di un device integrato "ready to use" per delle previsioni più personali.
In conclusione in futuro il progetto offre numerose opportunità di ampliamento, con interessanti prospettive sia dal lato tecnologico che dal lato business.