Università degli Studi di Padova - SIAGAS

Pagina creata da Laura Forte
 
CONTINUA A LEGGERE
Università degli Studi di Padova - SIAGAS
Università degli Studi di Padova
 Dipartimento di Matematica "Tullio Levi-Civita"
                Corso di Laurea in Informatica

 Sviluppo di un motore di statistiche e di un
 chatbot per monitorare account Instagram
                        Tesi di laurea triennale

Relatore
Prof.Tullio Vardanega

                                                         Laureando
                                                   Tommaso Panozzo

                    Anno Accademico 2017-2018
Università degli Studi di Padova - SIAGAS
Tommaso Panozzo: Sviluppo di un motore di statistiche e di un chatbot per monitorare
account Instagram, Tesi di laurea triennale, c Dicembre 2017.
Università degli Studi di Padova - SIAGAS
Indice

1 Azienda Ospitante                                                                                                                     1
  1.1 Struttura . . . . . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    1
      1.1.1 Reparti Tecnici . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    1
  1.2 Rapporto con l’Innovazione       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    3
  1.3 Prodotti dell’Area Sviluppo      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    4
  1.4 Tecnologie Utilizzate . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    4
  1.5 Gestione di Progetto . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    5

2 Progetti di Stage nella Strategia Aziendale                                                                                           7
  2.1 Miriade e i rapporti con l’università . . . .                        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    7
  2.2 Proposte di Stage 2017/2018 . . . . . . . .                          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    8
  2.3 Proposta di Stage Scelta . . . . . . . . . . .                       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    8
      2.3.1 Obiettivi . . . . . . . . . . . . . . .                        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    9
      2.3.2 Vincoli . . . . . . . . . . . . . . . . .                      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   11

3 Svolgimento del Progetto                                                                                                             13
  3.1 Studio delle Piattaforme . . . . . . . . . . . . . . . . . . .                                       .   .   .   .   .   .   .   13
      3.1.1 Caratteristiche delle API di Instagram . . . . . . .                                           .   .   .   .   .   .   .   13
      3.1.2 Caratteristiche delle Bot API di Telegram . . . . .                                            .   .   .   .   .   .   .   14
      3.1.3 Definizione dei casi d’uso del prodotto . . . . . . .                                          .   .   .   .   .   .   .   15
  3.2 Analisi dei requisiti . . . . . . . . . . . . . . . . . . . . . .                                    .   .   .   .   .   .   .   15
      3.2.1 Scopo del prodotto . . . . . . . . . . . . . . . . . .                                         .   .   .   .   .   .   .   15
      3.2.2 Attori . . . . . . . . . . . . . . . . . . . . . . . . .                                       .   .   .   .   .   .   .   16
      3.2.3 Casi d’uso salienti . . . . . . . . . . . . . . . . . .                                        .   .   .   .   .   .   .   18
  3.3 Architettura . . . . . . . . . . . . . . . . . . . . . . . . . .                                     .   .   .   .   .   .   .   21
      3.3.1 Business Logic . . . . . . . . . . . . . . . . . . . .                                         .   .   .   .   .   .   .   22
      3.3.2 Persistenza dei Dati . . . . . . . . . . . . . . . . .                                         .   .   .   .   .   .   .   23
      3.3.3 Front end . . . . . . . . . . . . . . . . . . . . . . .                                        .   .   .   .   .   .   .   24
  3.4 Progettazione . . . . . . . . . . . . . . . . . . . . . . . . .                                      .   .   .   .   .   .   .   25
      3.4.1 Spring Boot e Maven . . . . . . . . . . . . . . . . .                                          .   .   .   .   .   .   .   25
      3.4.2 Struttura del codice di routing dei comandi del bot                                            .   .   .   .   .   .   .   26
      3.4.3 Gestione di Utenti con Diversa Autenticazione . .                                              .   .   .   .   .   .   .   28
      3.4.4 Instagram Subscriptions . . . . . . . . . . . . . . .                                          .   .   .   .   .   .   .   28
      3.4.5 Design del Cron . . . . . . . . . . . . . . . . . . .                                          .   .   .   .   .   .   .   30
      3.4.6 Internazionalizzazione del Bot . . . . . . . . . . . .                                         .   .   .   .   .   .   .   30
      3.4.7 Log Unificati . . . . . . . . . . . . . . . . . . . . .                                        .   .   .   .   .   .   .   31
  3.5 Verifica e Validazione . . . . . . . . . . . . . . . . . . . . .                                     .   .   .   .   .   .   .   31
  3.6 Prodotto Finale . . . . . . . . . . . . . . . . . . . . . . . .                                      .   .   .   .   .   .   .   33

                                               iii
Università degli Studi di Padova - SIAGAS
iv                                                                                                    INDICE

4 Valutazioni Retrospettive                                                                                   37
  4.1 Raggiungimento degli Obiettivi . . . . .      . . . . . .   .   .   .   .   .   .   .   .   .   .   .   37
      4.1.1 Obiettivi Aziendali . . . . . . . .     . . . . . .   .   .   .   .   .   .   .   .   .   .   .   37
      4.1.2 Obiettivi Personali . . . . . . . .     . . . . . .   .   .   .   .   .   .   .   .   .   .   .   39
  4.2 Bilancio Formativo . . . . . . . . . . . .    . . . . . .   .   .   .   .   .   .   .   .   .   .   .   40
  4.3 Valutazioni Personali . . . . . . . . . . .   . . . . . .   .   .   .   .   .   .   .   .   .   .   .   41
      4.3.1 Preparazione del Corso di Laurea        al Lavoro     .   .   .   .   .   .   .   .   .   .   .   41

Bibliografia                                                                                                  43
Università degli Studi di Padova - SIAGAS
Elenco delle figure

 1.1   Logo di Miriade S.p.A. . . . . . . . . . . . . . . . . . . . . . . . . . . .      1
 1.2   Reparti Tecnici di Miriade . . . . . . . . . . . . . . . . . . . . . . . . .      2
 1.3   Funzionamento di un bot . . . . . . . . . . . . . . . . . . . . . . . . .         3
 1.4   Logo di Spring by Pivotal e Apache Maven . . . . . . . . . . . . . . .            5
 1.5   Principi Agile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .    5
 1.6   Logo di Jira e Bitbucket . . . . . . . . . . . . . . . . . . . . . . . . . .      6

 2.1   Esemplificazione del funzionamento di un bot. . . . . . . . . . . . . . .         8

 3.1   Principali metodi di input dei comandi del chatbot . . . . . . . . . . .         14
 3.2   Mockup del Prodotto . . . . . . . . . . . . . . . . . . . . . . . . . . . .      15
 3.3   Mockup Instagram Top Popular . . . . . . . . . . . . . . . . . . . . . .         17
 3.4   Tipologie di Utenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . .    18
 3.5   Use Case Principali . . . . . . . . . . . . . . . . . . . . . . . . . . . . .    19
 3.6   Logo di PostgreSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . .       24
 3.7   Prodotti di Google Cloud Platform. url: https://cloud.google.com                 25
 3.8   Parte del Package Instagram della Business Logic . . . . . . . . . . . .         29
 3.9   Workflow del post per gli utenti autenticati . . . . . . . . . . . . . . .       29
 3.10 Workflow del post per gli utenti non autenticati . . . . . . . . . . . . .        30
 3.11 Console di Gestione del Cron di GCP . . . . . . . . . . . . . . . . . .           31
 3.12 Console di Controllo dei Log di GCP . . . . . . . . . . . . . . . . . . .         32
 3.13 Schema TDD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .        33
 3.14 Screenshot delle schermate di avvio ed autenticazione         . . . . . . . . .   34
 3.15 Screenshot delle schermate di performance di account e singolo post .             34
 3.16 Screenshot della schermata di suggerimento dell’orario per pubblicare             35
 3.17 Screenshot della schermata di download di un media . . . . . . . . . .            35

                                           v
Università degli Studi di Padova - SIAGAS
vi                                                           ELENCO DELLE TABELLE

Elenco delle tabelle

     2.1   Piano di Lavoro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .               10

     3.1   Comparazione Database Considerati . . . . . . . . . . . . . . . . . . .                     24

     4.1   Raggiungimento degli Obiettivi Aziendali . . . . . . . . .      .   .   .   .   .   .   .   37
     4.1   Raggiungimento degli Obiettivi Aziendali . . . . . . . . .      .   .   .   .   .   .   .   38
     4.2   Realizzazione delle Funzionalità Applicative Obbligatorie       .   .   .   .   .   .   .   38
     4.2   Realizzazione delle Funzionalità Applicative Obbligatorie       .   .   .   .   .   .   .   39
     4.3   Realizzazione delle Funzionalità Applicative Opzionali . .      .   .   .   .   .   .   .   39
     4.4   Raggiungimento degli Obiettivi Personali . . . . . . . . .      .   .   .   .   .   .   .   39
     4.4   Raggiungimento degli Obiettivi Personali . . . . . . . . .      .   .   .   .   .   .   .   40
Università degli Studi di Padova - SIAGAS
Capitolo 1

Azienda Ospitante

1.1      Struttura

                             Figura 1.1: Logo di Miriade S.p.A.

   Miriade1 è un’azienda di consulenza informatica nata nel 2000 a Caldogno, in
provincia di Vicenza; attualmente occupa 2 sedi: Thiene, la principale, e Padova.
Entro il primo trimestre del 2018 ne aprirà un’altra a Milano.
Conta approssimativamente 50 dipendenti divisi tra amministrazione e 5 reparti tecnici.

   Miriade S.p.A. è divisa in due settori: amministrativo e tecnico. Del reparto
amministrativo fanno parte l’ufficio legale, l’ufficio acquisti, i back e front office, l’ufficio
paghe, i commerciali e l’ufficio marketing. Per quanto riguarda gli uffici tecnici, Miriade
ha un 5 divisioni: il loro numero è elevato, se si considerano quelle presenti nelle aziende
di pari dimensioni. Questo la rende maggiormente appetibile per clienti con progetti
che necessitino di prodotti completi e che attraversino diversi ambiti.

1.1.1     Reparti Tecnici

I reparti tecnici e le loro principali occupazioni sono:

   ∗ Sviluppo si occupa dello sviluppo di applicazioni on demand (sia web sia mobile),
     di portali aziendali (tipicamente B2B o intranet) e dello sviluppo di integrazioni
  1 Miriade   S.p.A.. url: http://www.miriade.it.

                                               1
Università degli Studi di Padova - SIAGAS
2                                                     CAPITOLO 1. AZIENDA OSPITANTE

       tra sistemi già esistenti (utile per chi volesse estendere un prodotto giunto a fine
       vita o per l’affinamento di prodotti realizzati in casa dal cliente);
    ∗ Servizi Cloud si occupa di creare ambienti cloud nuovi o di migrare sistemi
      esistenti on premise;
    ∗ Database Administration DBA si occupa di installazione, migrazione, gestione
      di database dei clienti (sia SQL che noSQL);
    ∗ Big Data è la divisione più recente e si occupa di analisi di big data: dalla
      creazione di cluster (principalmente Hadoop2 ) allo sviluppo di modelli predittivi
      di machine learning3 ;
    ∗ Servizi Sistemistici si occupa di installare, configurare e gestire presso il cliente
      soluzioni di networking, virtualizzazione, antivirus, storage, nonché di soddisfare
      le esigenze aziendali in termini di hardware e configurazioni;
    ∗ Business Intelligence BI si occupa della creazione di datawarehouse (archivi
      di dati interni all’azienda, utili per analisi di profitti e per prendere decisioni
      sulla strategia dell’azienda), caricando dati da fonti eterogenee e della creazione
      di dashboard di reportistica.

                              Figura 1.2: Reparti Tecnici di Miriade

    Miriade è partner di due dei più importanti e innovativi provider di servizi cloud:
Amazon (con Amazon Web Services [g] ) e Google (con Google Cloud Platform [g] ); questa
partnership viene spesa soprattutto nei reparti sviluppo e servizi cloud, Big Data e
sistemistico.
    2 Hadoop è un framework per consentire l’elaborazione dati in parallelo di grandi quantità di dati.

I cluster Hadoop sono costituiti da numerosi nodi che si occupano ciascuno di una porzione ridotta di
dati.
    3 I modelli di machine learning sono modelli matematici che, ricevendo un insieme di dati in input,

forniscono un output che sia coerente con dei pattern appresi in una precedente fase di training.
Questi modelli vengono spesso allenati su un gran numero di osservazioni per poi essere utilizzati per
effettuare previsioni. Chiariamo con un esempio. Si potrebbe allenare un modello fornendo in input
sia i valori di pressione e umidità di alcune stazioni metereologiche di una zona che un valore booleano
che indica se il giorno seguente alle misurazioni ha piovuto o meno; in un secondo momento si potrebbe
chiedere al modello di prevedere la possibilità di pioggià per l’indomani, considerati in input i valori di
pressione ed umidità attuali. Ovviamente l’accuratezza di tali modelli cresce all’aumentare del numero
di dati di allenamento (e test) e all’aumentare della correlazione tra grandezze in input e in output.
Università degli Studi di Padova - SIAGAS
1.2. RAPPORTO CON L’INNOVAZIONE                                                           3

                    (a) Logo AWS                           (b) Logo GCP

1.2     Rapporto con l’Innovazione

Nonostante l’innovazione non sia gratuita (la formazione e l’ambientamento dei tecnici
con le nuove tecnologie hanno infatti un costo temporale non trascurabile), essa è al
centro della strategia aziendale di Miriade; la società è infatti in costante ricerca delle
novità e delle nuove tendenze in fatto di prodotti, strumenti e piattaforme. Un esempio
è dato dai numerosi prodotti creati con i Beacon Bluetooth[g] (tecnologia che permette
la micro-localizzazione dei dispositivi mobili attraverso piccoli dispositivi bluetooth che
trasmettono un indentificativo univoco nel raggio di pochi metri); un altro esempio è
dato dall’interesse che Miriade ha manifestato da subito nell’ambito dei chatbot, che
cominciano ad essere sempre più in voga.

                          Figura 1.3: Funzionamento di un bot

    Nel reparto Sviluppo questa filosofia di rinnovamento costante è abbracciata da
tutti i dipendenti ed è messa in evidenza dalle frequenti discussioni sulle novità in
fatto di framework/prodotti da utilizzare, dalla propensione alla formazione continua
nonché dall’apertura all’adozione di nuovi framework/tecnologie proposti da membri
del gruppo. Tuttavia, non è sufficiente che i soli reparti tecnici desiderino innovare: è
fondamentale anche l’atteggiamento del titolare e degli altri commerciali, che stimolano
i clienti a scegliere soluzioni moderne e innovative. La reputazione che si è creata
Miriade nel tempo è quella di un’azienda che sa suggerire al cliente soluzioni nuove a
problemi che egli stesso non aveva compreso appieno, spesso sfruttando le numerose
competenze derivanti dalla stretta collaborazione dei 5 reparti tecnici (si vedano i reparti
tecnici). Questo modus operandi consente di realizzare prodotti ad ampio spettro; due
esempi possono essere modelli predittivi di machine learning che monitorano la linea
di produzione attraverso dispositivi IoT e interagiscono con l’utente attraverso chatbot
ed estensioni per applicativi di reportistica nell’ambito della Business Intelligence.

   Uno stimolo spontaneo all’innovazione è dato dall’interazione con i tecnici degli altri
reparti nei momenti di pausa o nelle chat, email o post nel social network interno. La
4                                                  CAPITOLO 1. AZIENDA OSPITANTE

propensione allo scambio di competenze è ben radicata nei dipendenti: in fase di analisi
e progettazione sono numerosi i confronti e le interazioni tra i vari reparti. Nella fase di
progettazione della mia esperienza di stage, ad esempio, nonostante io appartenessi al
reparto Sviluppo non è mancato il confronto con alcuni tecnici Big Data per la scelta
delle tecnologie di storage più appropriate, con tecnici DBA per discutere la struttura
del database e con i sistemisti per valutare l’opzione più conveniente per effettuare il
deployment del sistema.

   Miriade investe molto sulla formazione: quasi tutti i dipendenti dell’area tecnica
conseguono una certificazione all’anno, che verrà poi esposta con orgoglio nella sede
principale. Queste certificazioni consentono a Miriade di essere partner di aziende
leader come Amazon AWS, Google Cloud Platform, Nutanix, Trifacta, Qlik e altri.

1.3      Prodotti dell’Area Sviluppo

Alcuni dei prodotti dell’area sviluppo sono:

    ∗ applicazioni on demand web e mobile per clienti esterni;

    ∗ consulenze (ad esempio riguardanti la migrazione di applicazioni che girano on
      premise verso qualche servizio cloud) e formazione su alcuni framework specifici
      (come Liferay o Spring);

    ∗ definizione di user experience e user interface dei prodotti;

    ∗ sviluppo di portali aziendali (per lo più B2B4 e interni all’azienda);

    ∗ componenti necessarie a prodotti di altri reparti interni (come script/funzioni
      periodiche di collezione dati da iniettare in dataset di Big Data);

    ∗ strumenti per la gestione interna (ad esempio il portale per l’inserimento dei
      rapportini);

    ∗ applicazioni non commissionate da clienti esterni ma proposte dai dipendenti.

1.4      Tecnologie Utilizzate

Per lo sviluppo di applicazioni web si adotta principalmente Java e si fa uso in
maniera estensiva di Spring. Quest’ultimo è un framework che facilita lo sviluppo di
applicativi (in particolare web app) grazie a: numerosi package avanzati (come quelli
per interfacciarsi con DB SQL e NoSQL), l’incentivo ad adottare buone pratiche di
programmazione (una su tutte la Dependency Injection) ed alcuni vantaggi pratici che
riducono il tempo necessario al deployment (come la possibilità di creare facilmente
   4 B2B è l’acronimo di Business To Business e sta ad indicare i prodotti che fungono da interfaccia

tra aziende diverse; si differenzia dai prodotti B2C (Business To Customer) che, invece, collegano
un’azienda con il consumatore finale.
1.5. GESTIONE DI PROGETTO                                                                         5

un’applicazione web in formato jar 5 ). Miriade si occupa anche di formazione su Spring
presso clienti. Per la gestione dei progetti Java, in particolare delle dipendenze e degli
script di compilazione, si utilizza Maven; per buona parte di essi viene utilizzato anche
Liferay, piattaforma per cui Miriade ha conseguito diverse certificazioni.

                   Figura 1.4: Logo di Spring by Pivotal e Apache Maven

   Per il deployment delle applicazioni, ove possibile, vengono preferite le soluzioni in
cloud piuttosto che on premise.

   Queste sono alcune delle tecnologie adottate, ma, come spiegato nella sezione sul
rapporto con l’innovazione, nelle fasi di analisi e progettazione, il team di sviluppo
è aperto a nuove proposte per quanto riguarda innovative e differenti tecnologie da
adottare.

1.5      Gestione di Progetto

Il team di sviluppo implementa un modello Agile: il lavoro viene diviso in sprint della
durata di 2 settimane. Durante questo periodo ciasun membro si occupa di portare a
termine i task a lui assegnati facendo progredire il progetto. La maggior parte dei task
viene stabilita ed assegnata all’inizio dello sprint (qualche aggiunta è permessa ma
perlopiù per la correzione di errori, o per imprevisti con priorità elevata); al termine
delle 2 settimane il team effettua una valutazione retrospettiva. Lo strumento utilizzato
per il tracciamento delle issue e dei task è Jira; quello per effettuare del planning e per
tracciare diagrammi di Gantt è Teamwork.

    Per il versionamento del codice viene usato git, in particolare Bitbucket (su un server
privato), che si integra facilmente con Jira e permette di correlare issue o task con i
relativi commit. Nexus viene utilizzato come repository di pacchetti (perlopiù librerie
   5 Il file jar è un’applicazione web standalone, l’alternativa avrebbe richiesto l’installazione e

configurazione manuali di un Web Container (come Apache Tomcat) e la creazione di file war.

                                   Figura 1.5: Principi Agile
6                                                  CAPITOLO 1. AZIENDA OSPITANTE

interne); Bamboo (della suite di Atlassian come Jira e Bitbucket) viene utilizzato in
alcuni progetti per gestire CI e CD6 .

                             Figura 1.6: Logo di Jira e Bitbucket

    6 CI sta per Continuous Integration mentre CD per Continuous Deployment e indicano sistemi

automatizzati di compilazione, test e deployment del codice al fine di ridurre al minimo il lavoro da
effettuare ad ogni rilascio per aumentare quindi la frequenza di deployment di nuove versioni.
Capitolo 2

Progetti di Stage nella Strategia
Aziendale

2.1      Miriade e i rapporti con l’università

I motivi principali per cui Miriade partecipa all’evento StageIT e propone dei progetti
di stage a studenti laureandi sono principalmente due:

    ∗ avviare, proseguire o completare progetti che rischiano di bloccarsi per mancanza
      di tempo delle risorse interne;

    ∗ valutare nuovi elementi da inserire eventualmente in organico.

   Va precisato che l’area sviluppo non è la sola ad aderire ad iniziative simili: anche i
reparti DBA, BI e Big Data partecipano ad eventi dell’Università di Padova e accettano
stagisti.

   La collaborazione con l’Università di Padova è motivo d’orgoglio per Miriade, la
quale, infatti, oltre a partecipare all’evento StageIT, nell’anno didattico 2016/17 è stata
azienda proponente di un capitolato d’appalto del corso di Ingegneria del Software
e due dei suoi dipendenti hanno tenuto un seminario tecnologico dedicato ai Beacon
Bluetooth1 .

   1 I Beacon sono dei piccoli dispositivi che attraverso la tecnologia Bluetooth a bassa energia (BLE)

trasmettono in broadcast un codice identificativo univoco (UUID) settabile dal programmatore. I
dispositivi mobili possono sfruttare l’univocità di questo codice e, per alcuni scopi, l’intensità del
segnale al fine di localizzare l’utente in uno spazio ristretto.

                                                  7
8      CAPITOLO 2. PROGETTI DI STAGE NELLA STRATEGIA AZIENDALE

2.2      Proposte di Stage 2017/2018

    ∗ Un primo progetto chiedeva allo stagista di svolgere un’analisi delle modalità di
      integrazione di un bot di una delle principali piattaforme di comunicazione (Sky-
      pe, Messenger, Telegram, WhatsApp) e di implementarne uno che permettesse
      l’interazione degli utenti con alcuni social network, in particolar modo Insta-
      gram. Allo stagista erano richiesti anche l’esplorazione e l’utilizzo dei framework
      disponibili per la creazione di chatbot.
    ∗ Una seconda proposta verteva sullo studio delle API di Amazon AWS e Google
      Cloud Platform e sulla realizzazione di una console unificata, semplice ed intuitiva
      da usare, per la gestione dei backup dei dischi connessi alle istanze attive presso
      ciascuno dei due provider. Tale console consiste di un portale web a cui l’utente
      finale possa collegare i propri account AWS e GCP per gestire in maniera
      trasparente le istanze.
    ∗ Il terzo progetto consisteva nello sviluppo di un’estensione per il prodotto di
      reportistica Qlik Sense (un applicativo per la raccolta e la visualizzazione di dati
      aziendali, utile per analisi di Business Intelligence e per prendere decisioni di
      strategia aziendale). In particolare, allo stagista era proposto di lavorare con i
      tool a disposizione nell’ambiente di Qlik Sense per l’estensione delle dashboard
      al fine di realizzare un plugin che mettesse a disposizione dell’utente un set di
      report più efficace e personalizzabile di quello fornito out-of-the-box.

                Figura 2.1: Esemplificazione del funzionamento di un bot.

2.3      Proposta di Stage Scelta

Ho scelto il primo dei progetti di stage proposti da Miriade (si veda la sezione precedente
§2.2). Le principali motivazioni che mi hanno spinto a chiedere a Miriade di potermi
dedicare a questo particolare progetto sono le seguenti:

    ∗ Interesse personale verso i Chatbot. Il fenomeno dei chatbot (finti utenti di
      piattaforme di messaggistica che sono in realtà applicativi software) mi incuriosisce
      da qualche anno: essi rappresentano infatti un nuovo paradigma di interfaccia
      utente molto differente da quelli tradizionali (web app, app native o altro) e per
      molti aspetti simile ad un’interfaccia da riga di comando (seppur più amichevole).
      I chatbot, infatti:
         – necessitano di un minor impiego di risorse per lo sviluppo di un’interfaccia
           utente;
2.3. PROPOSTA DI STAGE SCELTA                                                                          9

          – non necessitano di installazione nei device degli utenti (che sono spesso restii
            a scaricare nuove applicazioni a causa di consumo di dati e memoria nel
            dispositivo);
          – vengono percepiti come app native (e non web);
          – sono multipiattaforma senza alcuno sforzo di sviluppo (almeno in tutte le
            piattaforme in cui l’applicazione di messaggistica viene distribuita).

    ∗ Opportunità di approfondire API di prodotti leader. La connessione con
      piattaforme esterne è un’esigenza comune alla maggior parte delle applicazioni
      moderne.
      Dovermi interfacciare e dover studiare le API di due piattaforme leader come
      Telegram e Instagram è stata un’ottima occasione per capire come si implementino
      questi servizi connessi. Ad esempio:

          – entrambi i servizi espongono delle API RESTful (l’architettura più popolare
            e comune per comunicare con i web service2 );
          – Instagram richiede di effetturare l’autenticazione con il protocollo OAuth
            2.0, molto diffuso e considerato tra i più sicuri sistemi di autenticazione;
          – Instagram consente di indicare un indirizzo per creare un webhook, in modo
            da notificare il proprio web service ogni volta che un utente autenticato
            pubblica un’immagine (Instagram effettua una chiamata POST con il
            contenuto all’endpoint specificato).

    ∗ Opportunità di implementare un’architettura moderna. La natura stan-
      dalone del progetto (che non è un’estensione di un prodotto esistente) e la libertà
      lasciatami dal proponente riguardo alle tecnologie da utilizzare permettono di
      studiare le moderne soluzioni di back end (ad esempio soluzioni serverless, basate
      su servizi di terze parti che si occupano di effettuare la manutenzione necessaria
      sui server) e di implementare un’architettura moderna.

2.3.1      Obiettivi

Obiettivi aziendali

L’obiettivo principale del mio stage era quello di sviluppare un bot per una piattaforma
di messaggistica che fornisse servizi utili per gli utenti di Instagram desiderosi di
migliorare le prestazioni del proprio account. Le attività da svolgere durante il periodo
di stage sono riassunte nel seguente piano di lavoro:

   2 I web service sono componenti di un sistema che consentono l’interazione con applicativi terzi;

ad esempio i web service delle Bot API di Telegram espongono le funzioni che i bot possono
eseguire (inviare messaggi, ricevere aggiornamenti, . . . ), mentre i web service di Instagram consentono
interrogazioni al database di Instagram (richiedere il numero di follower di un dato utente, la sua foto
profilo, . . . ).
10      CAPITOLO 2. PROGETTI DI STAGE NELLA STRATEGIA AZIENDALE

                              Tabella 2.1: Piano di Lavoro

            Attività                                           Ore di lavoro

            Studio di Java e Spring                                  40
            Studio API Telegram e Instagram                          32
            Studio GCP e AWS e scelta stack tecnologico              16
            Progettazione del prodotto                               16
            Sviluppo connettore Instagram                            40
            Sviluppo connettore Telegram                             40
            Sviluppo core                                            40
            Definizione funzionalità aggiuntive                      8
            Sviluppo funzionalità aggiuntive                         72

                            (a) Logo Instagram (b) Logo Telegram

Obiettivi Personali

Gli obiettivi personali che mi sono posto per lo stage sono stati:

     ∗ la realizzazione del prodotto richiesto dall’azienda;
     ∗ lo studio approfondito della struttura di un back end moderno e la sua imple-
       mentazione;
     ∗ l’inserimento in un team di sviluppo stimolante;
     ∗ l’adottare un’attitudine propositiva e una propensione alla collaborazione;
     ∗ l’approfondimento della metodologia agile by doing;
     ∗ l’eventuale inserimento in azienda dopo la laurea.

   In particolare, oltre al soddisfacimento dell’obiettivo aziendale di realizzare un
prodotto funzionante, volevo sfruttare l’opportunità e la predisposizione di Miriade alla
sperimentazione di nuove tecnologie per realizzare un’architettura moderna, magari
serverless. Già in fase preliminare mi era chiaro che tale obiettivo avrebbe comportato
un maggior impiego di ore nelle fasi di studio, di progettazione e probabilmente anche
2.3. PROPOSTA DI STAGE SCELTA                                                         11

di codifica (a causa della minor conoscenza dei nuovi strumenti) e che questo avrebbe
diminuito l’efficacia del mio lavoro sul progetto. Il tutor aziendale ha però valutato
che ciò non sarebbe stato un problema e che l’adozione delle tecnologie individuate
sarebbe stata compatibile con la realizzazione del progetto.

2.3.2    Vincoli

Vincoli temporali

La durata dello stage è stata di 8 settimane (320 ore), da svolgersi tutte presso la sede
principale, a Thiene, e seguendo gli orari dei dipendenti: 9:00 - 13:00, 14:00 - 18:00.

Vincoli metodologici

Un vincolo di progetto riguardava le interazioni con il tutor; in particolare, erano
previsti:

   ∗ alcune ore di formazione su Java e Spring

   ∗ un momento di formazione su Jira

   ∗ un’ora di configurazione di Bitbucket e Jira

   ∗ confronti al termine della fasi di analisi e di progettazione.

Il tutor è rimasto comunque sempre a disposizione e le interazioni sono state frequenti.

   La definizione delle specifiche del prodotto è stata effettuata con una dipendente che
conosce molto bene il social network Instagram e le esigenze degli utenti del prodotto.

    Il progetto doveva utilizzare la stessa metodologia agile applicata dall’intero team
di sviluppo con sprint di 2 settimane (si veda §1.5 Gestione di Progetto).

Vincoli tecnologici

Miriade ha richiesto che il front end dell’applicazione (la componente che si interfaccia
con Telegram) fosse scritto in Java e in particolar modo utilizzasse Maven e Spring
Boot.

    Il sistema di versionamento adottato è stato Bitbucket di Atlassian, strumento
utilizzato da tutto il team sviluppo, mentre per la gestione del progetto è stata creata
una board agile su Jira per gestire gli sprint e tracciare l’avanzamento.
12    CAPITOLO 2. PROGETTI DI STAGE NELLA STRATEGIA AZIENDALE

   Altri vincoli teconologici non sono stati definiti a priori, ma, al termine della fase
di analisi, lo stack tecnologico proposto avrebbe dovuto essere approvato dal tutor.
migliorare le prestazioniAPI
Capitolo 3

Svolgimento del Progetto

3.1     Studio delle Piattaforme

La proposta di stage era realizzare un chatbot che permettesse di monitorare e migliorare
le prestazioni del proprio account Instagram.

   Tra le piattaforme di messaggistica che permettono di implementare dei chatbot è
stata scelta Telegram perché molto flessibile e con una buona base di utenti.

3.1.1     Caratteristiche delle API di Instagram

L’interfaccia con le API di Instagram 1 era un elemento fondamentale per la realizzazione
del prodotto. Purtroppo tali API consentono di effettuare un numero ristretto di
operazioni.

   In particolare gli endpoint utilizzati più significativi sono stati quelli relativi alle
seguenti funzioni:

   ∗ autenticazione per permettere agli utenti di effettuare il login;

   ∗ statistiche sul post per permettere di salvare il numero di like e commenti che
     un post ha ricevuto in un certo momento;

   ∗ statistiche sull’utente per salvare nome e numero dei seguaci di un dato utente.

    Un limite delle API di Instagram è dato dalla mancanza di informazioni "storiche":
non si possono cioè ottenere dati su statistiche nel passato, che sarebbero utili per
effettuare previsioni e indicare all’utente i progressi.
  1 Instagram   Developer Portal. url: https://instagram.com/developer/.

                                              13
14                                    CAPITOLO 3. SVOLGIMENTO DEL PROGETTO

                  Figura 3.1: Principali metodi di input dei comandi del chatbot

       (a) Input con Comandi           (b) Custom Keyboard          (c) Inline Keyboard

3.1.2       Caratteristiche delle Bot API di Telegram

La piattaforma bot di Telegram2 consente di collegare la propria applicazione a
Telegram.

   Dal punto di vista dell’interfaccia grafica, la piattaforma mette a disposizione
dell’utente 4 principali metodi di input:

      ∗ input testuale (semplici messaggi di testo) che sono però poco intuitivi (l’utente
        non necessariamente conosce la sintassi da utilizzare né quali sono le funzionalità
        disponibili) e richiedono all’utente lo sforzo di digitare la propria richiesta;
      ∗ comandi i comandi sono sequenze di caratteri (senza spazi) preceduti da un
        "/" vengono interpretati dai bot per eseguire specifici compiti, inoltre, quando
        l’utente inizia il messaggio con uno slash, l’applicazione suggerisce i possibili
        comandi all’utente;
      ∗ custom keyboard il metodo di input più amichevole è rappresentato da una
        tastiera personalizzata: composta cioè da pochi pulsanti specificati dallo svilup-
        patore;
      ∗ inline keyboard è composta da una serie di bottoni che compaiono direttamente
        sotto ad uno specifico messaggio inviato dal bot, e rappresenta le possibili risposte
        indirizzate a quel preciso messaggio.

    Queste sono le principali modalità attraverso cui l’utente può inviare contenuti al
bot. Le più intuitive sono la terza e la quarta e sono state usate il più possibile dal bot.
     2 Telegram   Bot API. url: https://core.telegram.org/bots.
3.2. ANALISI DEI REQUISITI                                                                15

3.1.3    Definizione dei casi d’uso del prodotto

La definizione dei casi d’uso del prodotto è stata da me effettuata attraverso alcune
riunioni con una dipendente di Miriade esperta di Instagram. Tali riunioni hanno
portato alla realizzazione dei seguenti mockup come linee guida.

                           Figura 3.2: Mockup del Prodotto

   Per la descrizione dei casi d’uso significativi si veda § 3.2.3 Casi d’uso salienti.

3.2     Analisi dei requisiti

3.2.1    Scopo del prodotto

Il prodotto avrebbe dovuto essere un bot sulla piattaforma Telegram che consentisse
agli utenti di monitorare e migliorare le performance del proprio account Instagram.
Le performance di un account dipendono da alcune metriche legate all’account e ai
suoi post. Le metriche più comuni sono:

   ∗ follower il numero di seguaci che ha un determinato account. Più che il valore
     assoluto di questo numero è significativo l’aumento relativo tra due istanti di
     tempo.

   ∗ post like il numero di mi piace che un determinato post ha totalizzato. I like
     vengono ricevuti in maggiore quantità nelle prime ore di vita di un post, mentre
     già dopo 24 ore il numero tende a non incrementare ulteriormente.

   ∗ commenti il numero di commenti che gli altri utenti scrivono in risposta ad
     un post effettuato. Sebbene non sia automatico che tutti i commenti siano
     di apprezzamento (come invece è per i like), essi rappresentano una metrica
     positiva. I commenti negativi, infatti, (in cui gli altri utenti denigrano il post o
     l’autore) sono nella pratica una minima percentuale e contribuiscono ugualmente
     ad accrescere la notorietà dell’autore del post.
16                                    CAPITOLO 3. SVOLGIMENTO DEL PROGETTO

     ∗ post engagement: è una metrica relativa al singolo post composta dalle tre
       precedenti; essa indica la visibilità e l’apprezzamento generato da un determinato
       post in relazione al numero di utenti che solitamente seguono l’autore. Per il
       computo ho utilizzato la formula:
                                                       like + commenti
                                    engagement =
                                                           f ollowers
       Come si può notare, tale valore aumenta all’aumentare delle interazioni legate
       ad un post ma risulta normalizzato al numero di seguaci.
       Una formula simile viene utilizzata da Instagram per valutare quali siano i
       contenuti più interessanti, ma essa non è resa pubblica dall’azienda.
     ∗ popular for hashtag è una metrica booleana che rappresenta l’ingresso o meno
       di un post nella pagina dei "post popolari" per uno degli hashtag indicati in
       descrizione.
       Quando un utente posta un contenuto è solito aggiungere delle etichette3 (o
       hashtag) alla descrizione. Queste etichette vengono indicizzate da Instagram ed
       è possibile, tramite la funzione cerca o il click/tocco su un hashtag, visualizzare i
       post pubblicati recentemente da tutti gli utenti con profilo pubblico che conten-
       gono quello stesso hashtag.
       I primi 9 post di questa pagina sono post selezionati da Instagram che vengono
       visualizzati da tutti gli utenti; tali post sono comunemente chiamati top popular 4
       (si veda la figura 3.3 come esempio).
        L’algoritmo utilizzato da Instagram per la scelta di quali post mostrare è scono-
       sciuto, ma è certo che i like, i commenti e il numero di follower lo condizionino
       (probabilmente è una variazione sulla formula di engagement indicata prima).
       Quando un post viene selezionato da Instagram e inserito tra i popular, esso
       ottiene molta più visibilità migliorando notevolmente la propria performance.

3.2.2      Attori

Gli attori coinvolti nei casi d’uso del progetto sono:

     ∗ Telegram Bot API le API che Telegram mette a disposizione degli sviluppatori
       per la creazione di bot;
     ∗ Instagram API le API che Instagram mette a disposizione per interrogare il
       database e ottenere dati sugli utenti e sui post;
     ∗ Utenti sono utenti di Instagram e di Telegram che decidono di avviare una
       conversazione con il bot per monitorare le proprie performance.

   Per ottenere l’accesso più permissivo ai dati Instagram di un determinato utente è
necessario che egli autorizzi l’applicazione. Gli utenti sono però restii ad autorizzare
   3 La sintassi per indicare queste etichette è un cancelletto "#" (hashtag in inglese) seguito dall’eti-

chetta scritta senza spazi. ad esempio, per i post relativi ad una giornata di sole, si potrebbe usare
#sunnyday.
   4 Si consulti, a titolo di esempio la pagina https://www.instagram.com/explore/tags/sunnyday/.
3.2. ANALISI DEI REQUISITI                                                                           17

                          Figura 3.3: Mockup Instagram Top Popular

applicazioni di terze parti a gestire il proprio account Instagram: in parte per la noia
di dover inserire username e password, in parte perché Instagram è solito bloccare i
profili di utenti che usano applicazioni di terze parti che violino le sue linee guida5 .

   Per rassicurare l’utente, al momento dell’autorizzazione dell’app, vengono richiesti
solamente i permessi di visualizzare le proprie statistiche (like, followers, . . . ) e non,
ad esempio, quelli per effettuare like o postare contenuti. L’utente inesperto potrebbe
però non notare ciò e rinunciare comunque del tutto all’autenticazione.

   Si è scelto quindi di considerare 3 tipologie di utenti:

    ∗ autenticati: sono gli utenti che effettuano il login con Instagram permettendo
      così di avere pieno accesso ai loro dati attraverso le API Instagram;

    ∗ indicanti l’username: sono utenti che indicano solamente il proprio username.
      Essi hanno accesso ad un set limitato di funzionalità che utilizzano quote pubbliche

   5 Alcune applicazioni di terze parti sfruttano l’autorizzazione fornita dall’utente per postare conte-

nuti, seguire nuovi utenti, o mettere "mi piace" a post di altri in maniera automatica, violando le
linee guida di Instagram.
18                                    CAPITOLO 3. SVOLGIMENTO DEL PROGETTO

                                 Figura 3.4: Tipologie di Utenti

       delle API di Instagram (quindi potrebbero aggiornare i dati con una frequenza
       minore) o fanno affidamento a web crawler 6 ;

     ∗ non autenticati: sono utenti che non effettuano il login né indicano il proprio
       username e utilizzano il bot per una serie minima di funzionalità (come il download
       di media a partire dall’url di un post).

3.2.3      Casi d’uso salienti

UC1 Effettua login

Permette a qualsiasi utente di effettuare il login. Se l’utente è già autenticato viene
sostituito il precedente account in favore di quello nuovo.

     ∗ UC1.1 Login con Instagram permette di autenticarsi attraverso le proprie
       credenziali di Instagram. È il modo consigliato e che mette a disposizione
       dell’utente tutte le funzionalità

     ∗ UC1.2 Login con l’username permette di autenticarsi inserendo solamente il
       proprio nome utente di Instagram. È una modalità sconsigliata, ma a disposizione
       degli utenti più diffidenti.

     ∗ UC1.3 Visualizza errore di login indica all’utente che l’username/password
       erano errati (se è stato tentato un login autenticandosi con Instagram) ovvero
       che l’username non esiste o appartiene ad un utente privato (se è stato tentato il
       login con il solo username).
    6 Per aggiornare alcuni dati degli utenti che indicano solamente il proprio username, il back end

visita le pagine web di instagram.com e scansiona il contenuto dell’html per estrapolare le informazioni
rilevanti. Questo metodo è meno affidabile perché non fa affidamento sull’immutabilità della struttura
della pagina web
3.2. ANALISI DEI REQUISITI                             19

                     Figura 3.5: Use Case Principali
20                                    CAPITOLO 3. SVOLGIMENTO DEL PROGETTO

UC2 Visualizza messaggio di aiuto

Permette all’utente di ricevere un messaggio testuale che lo istruisca sulle funzionalità
del bot e sulle loro modalità di fruizione.

UC3 Visualizza statistiche account

Permette all’utente di visualizzare informazioni riguardo al proprio account, come:

     ∗ il numero di seguaci;
     ∗ il numero di utenti seguiti;
     ∗ il numero di media condivisi finora;
     ∗ un grafico rappresentante l’andamento dei follower nelle ultime settimane.

UC4 Ottieni stima miglior momento per postare

Permette all’utente di ricevere una stima di quale sia il miglior momento della giornata
per pubblicare un contenuto.

    Tale stima viene inferita dall’engagement dei post passati nelle prime 2 ore di vita.
Miriade intende affinare l’algoritmo di suggerimento dell’orario migliore per postare
effettuando analisi statistiche raffinate quando si saranno racconti un numero maggiore
di dati sui post degli utenti. Ho implementato il design pattern Strategy al fine di
rendere agile la sostituzione dell’algoritmo con uno più avanzato.

     Le informazioni salienti che vengono visualizzate sono:

     ∗ l’intervallo orario di 2 ore entro cui si consiglia pubblicare;
     ∗ una heatmap 7 dell’engagement ottenuto dall’utente con i contenuti passati.

UC5 Visualizza statistiche ultimo post

Permette di visualizzare alcune informazioni circa l’ultimo post; in particolare:

     ∗ il numero di like;
     ∗ il numero di commenti;
    7 L’heatmap è un grafico utilizzato per rappresentare funzioni che, presi due argomenti in input,

ne restituiscano uno di tipo numerico. Si presenta visivamente come una tabella le cui le colonne
indicano uno dei valori in input, le righe l’altro e a ciascuna cella sia associato un numero. Solitamente
le celle vengono colorate con intensità proporzionale al proprio contenuto.
3.3. ARCHITETTURA                                                                                    21

    ∗ l’engagement (cfr. equazione dell’engagement);

    ∗ se l’ultimo post è stato selezionato ed inserito Instagram nei popular per qualche
      hashtag, questi vengono visualizzati.

UC6 Inserisci URL nuovo post

Permette di inserire l’url del proprio post, dopo che si è pubblicato, per cominciare a
monitorarne le performance.

    Questo caso d’uso è necessario solamente agli utenti non autenticati tramite In-
stagram. Quando un utente si autentica effettuando il login con Instagram, grazie
ad un webhook 8 , il back end viene informato automaticamente della pubblicazione di
nuovi contenuti, rendendo superflua questa funzionalità. Di contro, gli utenti che si
autenticano inserendo solamente il proprio username devono informare manualmente
il back end dell’aggiunta di nuovi contenuti.

UC7 Download Media

Permette di inviare un link ad un post Instagram (di qualsiasi utente, purché pubblico)
a cui il bot risponderà inviando il contenuto in chat.

   È una funzione utile per effettuare il repost di contenuti o per salvarne una copia.
Sono supportati i tipi di contenuti ad ora supportati da Instagram: video e immagini.

3.3       Architettura

Per l’applicazione, ho scelto un’architettura three-tier in cui i 3 strati Business Logic,
Persistenza Dati e Front End fossero ben separati.

    La separazione netta degli strati favorisce la loro manutenzione (ad esempio: si
può rilasciare una nuova versione del front end senza che la business logic debba
riavviarsi con esso) e l’estensione (ad esempio: per aggiungere una nuova piattaforma
di messaggistica, o un’applicazione web, sarebbe sufficiente aggiungere un nuovo
elemento di front end, senza alcuna modifica al sistema esistente).

    La separazione è enfatizzata dall’utilizzo di tecnologie diverse per ciascuno strato.

   8 Instagram consente di indicare un indirizzo per creare un webhook, in modo da notificare il proprio

web service ogni volta che un utente autenticato pubblica un’immagine (Instagram effettua una
chiamata POST con il contenuto all’endpoint specificato)
22                                   CAPITOLO 3. SVOLGIMENTO DEL PROGETTO

3.3.1      Business Logic

Lo strato di Business Logic si occupa principalmente di:

     ∗ aggiornare periodicamente le statistiche dei vari post e account;

     ∗ esporre un endpoint per l’autenticazione ad Instagram con OAuth 2.0 9 ;

     ∗ esporre un endpoint su cui realizzare un webhook per gli aggiornamenti di
       Instagram.

Tecnologie

Si è scelto di utilizzare i prodotti offerti da Google Cloud Platform perché convenienti
dal punto di vista delle funzionalità e del prezzo. La Business Logic, in particolare, è
tutta basata su Google Cloud Functions.
Le Cloud Functions sono funzioni NodeJS che vengono invocate al verificarsi di uno
specifico evento trigger. Questa tecnologia favorisce la scrittura di codice che rispetti
il principio di singola responsabilità; infatti ogni compito viene incapsulato in una
specifica Cloud Function.

    Il cuore della Business Logic è quindi rappresentato dalle Cloud Functions, ma sono
necessarie altre tecnologie per la coordinazione della loro esecuzione.
Google Cloud Platform mette a disposizione Cloud Pub/Sub per l’invio di messaggi tra
i suoi prodotti.
Avviene quindi che ogni funzionalità ha un suo topic (un titolo) associato (come
updateFollowersCount); quando si vogliono attivare le funzioni associate è sufficiente
emettere un messaggio Pub/Sub contenente quel topic ed un eventuale payload di dati
necessari. Le funzioni che avranno quel preciso topic come evento trigger verranno
quindi invocate.

    Le Cloud Functions permettono di limitare i costi di manutenzione del sistema
(essendo totalmente gestite da Google non necessitano di aggiornamenti, antivirus,
rinnovo di certificati o altro). Il costo del sistema è nullo, infatti le prime 2 milioni
di invocazioni di funzioni e i primi 3.2 milioni di secondi di esecuzione (circa 890 ore)
ogni mese sono gratuiti10 .

    Per supportare la schedulazione di compiti ricorrenti è stato necessario scrivere un
cron. Per semplicità di gestione ho scelto di usare Google App Engine, un altro prodotto
della suite di prodotti di GCP, che consente di effettuare il deployment di applicazioni
senza curarsi dell’infrastruttura sottostante. Indicando in un file yaml l’opportuna
   9 OAuth 2.0 è un protocollo che permette a terze parti di ottenere accesso limitato agli account

di un determinato utente presso un servizio http: nello specifico Instagram. Viene utilizzato per
autorizzare il bot ad accedere ai dati Instagram di un determinato utente. Si veda OAuth Protocol.
url: https://oauth.net
  10 I costi attualmente in vigore prendono in considerazione 3 parametri: il numero di invocazioni (i

primi 2 milioni sono gratuiti), il traffico di dati uscente (i primi 5GB sono gratuiti) ed il numero di
GB-secondi di memoria complessivi (sono grauiti i primi 400000 GB-secondi, cioè 400000 secondi di
esecuzione allocando 1GB di RAM o, ad esempio, 3.2 milioni secondi allocandone 128MB)
3.3. ARCHITETTURA                                                                       23

configurazione si possono lanciare applicazioni che scalino automaticamente da zero a
centinaia di istanze.
Ho quindi realizzato un cron in Python per lanciare periodicamente dei messaggi
Pub/Sub che invocassero le necessarie funzioni.

3.3.2     Persistenza dei Dati

La persistenza dei dati è centrale nell’applicazione sviluppata in particolare per due
motivi: per mantenere uno storico delle varie statistiche raccolte al fine di mostrare
all’utente dati rilevanti e per creare dataset sufficientemente ampi sui quali condurre
qualche indagine statistica che sia significativa al fine di migliorare l’algoritmo di
suggerimento del momento migliore per pubblicare.

   La maggior parte dei dati da immagazzinare sono dati di statistiche associati ad
un certo istante in cui sono stati misurati. Ad esempio si vuol tener traccia dei like,
commenti e engagement dei post pubblicati nelle ultime 48 ore, aggiungendo il valore
aggiornato ogni 10 minuti.
Per fare questo verranno privilegiate operazioni di append piuttosto che update in
modo da preservare i dati storici. Questo richiede a sua volta che i dati siano lo stretto
necessario, perché il numero di entrate nel database potrebbe crescere smisuratamente.

Tecnologie

Si è considerato dapprima se fosse più opportuno un database relazionale od uno non
relazionale. La natura strutturata dei dati da inserire (tabelle con poche metriche e
ben definite) gioca a favore dei primi, mentre la maggior semplicità di interazione con
un database non relazionale dal linguaggio NodeJS (utilizzato nelle Cloud Function)
giocava a favore dei primi.
Il fattore decisivo che ha condizionato la scelta in favore dei database relazionali è
l’abilità di processare join in maniera efficiente. Come spiegato sopra, l’aggiunta di
nuovi dati deve essere effettuata senza creare entrate inutili (se il numero di like di un
post è rimasto invariato dall’ultima misurazione, è inutile aggiungere una nuova entrata):
la possibilità di effettuare join su una tabella temporanea, prima dell’inserimento dei
dati, consente di scremare i dati in ingresso dimandando al database il computo delle
differenze con quelli già presenti.

    Ho considerato ulteriormente il servizio gestito Google BigQuery, per lo stoccaggio e
l’analisi di Big Data. BigQuery consente di interrogare rapidamente grandi quantità di
dati, ma ha un limite nella latenza relativamente elevata (tra i 5 e i 10 secondi) anche
per le query più banali su dataset di una decina di righe (probabilmente a causa del
tempo necessario a dividere il dataset nei nodi che poi devono effettivamente eseguire
la query) e per questo non l’ho ritenuto opportuno.

    Per questa serie di considerazioni si è scelto di utilizzare PostgreSQL, in particolare
il prodotto CloudSQL di Google Cloud Platform che fornisce un database PostgreSQL
completamente gestito.
24                                CAPITOLO 3. SVOLGIMENTO DEL PROGETTO

                              Figura 3.6: Logo di PostgreSQL

                     Tabella 3.1: Comparazione Database Considerati

 Tecnologia         Pro                                Contro

 MySQL             - Veloce                            - Poco flessibile
                   - SQL compliant                     - Necessita di licenze
 PostgreSQL        - Veloce                            - Poco flessibile
                   - SQL compliant
 NoSQL             - Flessibile                        - Poco performante in join
 BigQuery          - Performante con dataset molto     - Alta latenza, influente soprat-
                   ampi                                tutto con dataset ridotti

3.3.3      Front end

Il Front End consiste di una applicazione Java che si occupa di fornire un’interfaccia
utente attraverso le Bot API di Telegram.
Il Front End si connette al database da cui ricava i dati da mostrare all’utente.

Tecnologie

Per il deployment si è optato, anche in questo caso, per Google App Engine per i
seguenti motivi:

     ∗ è una soluzione completamente gestita con zero costi di manutenzione;
     ∗ è di semplice implementazione;
     ∗ è semplice la gestione di prodotti appartenenti tutti alla stessa suite (ad esempio
       viene fornita una console unificata dei log).

     Per effettuare il deployment dell’applicazione, ho compiuto i seguenti passi:
3.4. PROGETTAZIONE                                                                                 25

    Figura 3.7: Prodotti di Google Cloud Platform. url: https://cloud.google.com

         (a) Logo Cloud Functions         (b) Logo CloudSQL          (c) Logo App Engine

   1. grazie a Apache Maven e Spring ho potuto creare un eseguibile .jar dell’appli-
      cazione (si veda §1.4 Tecnologie Utilizzate);
   2. specificando un semplice Dockerfile ho potuto creare un container Docker 11
      contenente il necessario per configurare ed avviare il modulo di front end ;
   3. attraverso un file yaml, ho specificato quali fossero le configurazioni per App
      Engine;
   4. attraverso l’interfaccia di Google Cloud Platform da linea di comando, ho potuto
      effettuare il deployment dell’applicazione in pochi minuti.

   Si noti come i successivi deployment richiedano semplicemente:

   1. la creazione del package .jar;
   2. il build dell’immagine Docker ;
   3. l’upload dell’app aggiornata;

consentendo quindi di lanciare in produzione una nuova versione del front end in meno
di 2 minuti.

3.4      Progettazione

3.4.1      Spring Boot e Maven

Nella realizzazione del front end si è utilizzato Maven per la gestione delle dipendenze:
attraverso un documento xml, noto con il nome di pom, è possibile definire tutte
le dipendenze esterne del progetto (ad esempio framework come Spring Boot) e le
istruzioni per effettuare la compilazione del progetto.
  11 I container Docker sono dei pacchetti contenente tutto quello che serve ad un’applicazione per

essere eseguita. Sono isolati dal contesto e vengono caricati da App Engine in una o più macchine
virtuali a seconda delle esigenze di scalabilità dell’applicazione. Consentono, inoltre, di isolare il
software da quello che è il sistema specifico in cui viene fatto girare, semplificandone la verifica.
26                                 CAPITOLO 3. SVOLGIMENTO DEL PROGETTO

   Come anticipato, nel progetto, ho utilizzato estensivamente il framework Spring
Boot. Alcuni dei vantaggi tratti dal suo utilizzo sono stati:

     ∗ Dependency Injection: l’iniezione delle dipendenze è un design pattern che
       mira a semplificare lo sviluppo e migliorare la testabilità del codice. Spring Boot
       mette a disposizione del programmatore l’annotazione @Autowired che consente
       l’iniezione automatica delle variabili da parte del framework.
       Supponiamo, ad esempio, che una classe C debba utilizzare un oggetto di un’altra
       classe I. Per rispettare il principio di Inversione delle Dipendenze, C dovrebbe
       dipendere da una astrazione di I, quindi è opportuno dichiarare un’interfaccia
       InterfaceI, che verrà implementata da I e che esponga il set minore possibile
       di funzionalità. Si pone però il problema dell’istanziazione dell’oggetto specifico
       I: se la sua creazione fosse fatta da C, i nostri tentativi di isolare il più possibile
       le implementazioni delle interfacce dagli oggetti che le usano sarebbero vanificati.
       A questo punto entrano in gioco le annotazioni @Autowired e @Bean, semplificando
       il lavoro dello sviluppatore. Supponiamo ad esempio le classi siano dichiarate
       come segue:
                          Listing 3.1: Esempio di Autowiring di Spring
          @Service
          public class C {

              @Autowired
              private I i ;
          }

          public interface InterfaceI {}

          @Bean
          public class I implements InterfaceI {}
                                                                                                 
       Quando viene instaziato un oggetto di tipo C, Spring Boot cerca una classe
       annotata con @Bean che implementi l’interfaccia richiesta (InterfaceI) e si
       occupa di iniettare un oggetto di questa classe nella proprietà i di C.
       Quello presentato è un caso semplice, a titolo esemplificativo. Spring Boot
       consente di configurare in maniera raffinata i Bean, prima di effettuare l’injection.
     ∗ Package inclusi: Spring Boot include numerosi package utili per effettuare
       operazioni comuni. Ad esempio il package JDBC fornisce un meccanismo semplice
       ed intuitivo per gestire le connessioni e le interrogazioni di un database esterno.
     ∗ Creazione di un jar: Spring Boot consente la creazione di un unico pacchetto
       jar con tutto il necessario per eseguire l’applicazione; l’alternativa sarebbe la
       produzione di un archivio war che deve però eseguito su un servlet (ad esempio
       Apache Tomcat), il quale deve essere installato e manutenuto.

3.4.2      Struttura del codice di routing dei comandi del bot

Lo sviluppo di un bot presenta delle sfide legate al routing degli aggiornamenti. Gli
aggiornamenti che Telegram invia all’applicazione sono di tipologie molto diverse tra
3.4. PROGETTAZIONE                                                                      27

loro; alcuni esempi di aggiornamenti sono:

    ∗ un nuovo messaggio in una chat privata;
    ∗ un nuovo messaggio in un gruppo;
    ∗ un utente lascia un gruppo;
    ∗ il bot viene aggiunto in un gruppo;
    ∗ un utente modifica un messaggio inviato in precedenza;
    ∗ un utente invia una foto in una chat di gruppo;
    ∗ un utente preme su un inline button (si veda §3.1.2 Caratteristiche delle Bot API
      di Telegram).

Si deve prevedere un oggetto che effettui il routing di ciasun aggiornamento verso
l’oggetto handler a cui compete la sua gestione.

    L’idea più intuitiva è inserire un metodo in ogni oggetto handler che valuti se
l’aggiornamento ricevuto è di sua competenza ed eventualmente agisca.
Questo approccio è di semplice implementazione e permette di avere una struttura del
codice chiara, ma comporta uno spreco di risorse: molti oggetti handler effettueranno
gli stessi controlli sul medesimo aggiornamento, aumentando il tempo di risposta del
server.

   Un secondo approccio potrebbe essere di inserire nel router un metodo che valuti
tutti i possibili casi e inoltri l’aggiornamento solamente all’handler designato.
Questo porterebbe però ad un lungo elenco illeggibile di clausole if ed else che
renderebbero difficili l’aggiunta di nuovi handler e la manutenzione di quelli esistenti.

   Il terzo approccio, quello adottato, è una versione ibrida dei primi due. Consiste
nell’effettuare alcuni dei controlli nel router, al fine di scremare l’insieme di handler a
cui viene inoltrato l’aggiornamento.
Per non aumentare, però, le responsabilità del router e violare il principio di singola
resposabilità, sono i vari handler che devono dichiarare a quali tipologie di aggiorna-
mento sono o non sono interessati.
L’interfaccia degli handler si può esemplificare nella seguente:

        Listing 3.2: Esempio di interfaccia di Handler degli aggiornamenti del bot
public enum ChatType {
  PRIVATE , GROUP , ALL
}
public interface Handler {
  boolean wantsTextMessage () ;
  boolean wantsPhoto () ;
  ChatType wantsMessageFromChat () ;
  // altri

    void handle ( Update upd ) ;
}
                                                                                              
28                                 CAPITOLO 3. SVOLGIMENTO DEL PROGETTO

Mentre questa è una esemplificazione del metodo di routing:

                     Listing 3.3: Esempio di metodo di routing del bot
private List < Handler > handlers ;

private route ( Update upd ) {
  Stream < Handler > selected = handlers . stream () ;
  selected = selected . filter ( h -> upd . chatType == h .
      wantsMessageFromChat () || h . wantsMessageFromChat () ==
      ChatType . ALL ) ;
  if ( upd . isMessage () && upd . hasText () ) {
    selected = selected . filter ( Handler :: wantsTextMessage ) ;
  }
  if ( upd . isMessage () && upd . isPhoto () ) {
    selected = selected . filter ( Handler :: wantsPhoto ) ;
  }
  selected . foreach ( h -> h . handle ( upd ) ) ;
}
                                                                                                     

3.4.3     Gestione di Utenti con Diversa Autenticazione

Come spiegato in §3.2.2 Attori, ci sono alcuni utenti che effettuano il login con Instagram,
e alcuni utenti che forniscono solamente il proprio nome utente.
Mentre per i primi si possono utilizzare le API di Instagram adoperando il token
associato a ciascun account senza preoccuparsi di raggiungere il limite della quota
prevista di utilizzo12 , per la seconda categoria si devono usare dei token comuni (con il
rischio di eccedere i limiti di quota).

   Un altro problema è che alcune statistiche richieste dal proponente non sono fornite
dalle API di Instagram. Per esse è stato quindi necessario implementare alcuni crawler 13
che analizzassero le pagine di instagram.com.

    Nel diagramma in fig. 3.8 Parte del Package Instagram della Business Logic si
possono vedere alcune delle classi del pacchetto "Instagram" della business logic. Si
noti in particolare l’utilizzo delle interfacce Provider e delle classi Factory al fine di
istaziare gli oggetti appropriati per ogni caso.
Si noti anche come alcuni dati (come le statistiche sugli hashtag) siano ricavabili
unicamente tramite web crawler.

3.4.4     Instagram Subscriptions

Per migliorare l’esperienza degli utenti autenticati si è scelto di implementare le User
Subscriptions. Tale mecanismo consente di indicare ad Instagram un indirizzo di
callback su cui effettuare una chiamata in POST ogniqualvolta un utente autenticato
  12 Le API di Instagram consentono di effettuare fino a 5000 chiamate entro una sliding window di

un’ora.
  13 I crawler sono applicazioni che scansionano le pagine web per estrapolarne dei dati.
Puoi anche leggere