Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Go + AppEngine = <3

Go + AppEngine = <3

Nicola Corti

April 26, 2016
Tweet

More Decks by Nicola Corti

Other Decks in Technology

Transcript

  1. Telegram: cos’è? Telegram è un servizio di messaggistica istantanea open

    source. Rispetto alla concorrenza si differenzia per alcune particolari features: ➔ Chat segrete: messaggi cifrati con autodistruzione. ➔ Gruppi e Super-gruppi. ➔ Multipiattaforma, basato su Cloud.
  2. Telegram: cos’è? ➔ Canali ◆ Un utente admin e tanti

    utenti iscritti ◆ solo gli admin possono scrivere messaggi ◆ gli utenti iscritti possono soltanto leggere ➔ API fornite gratuitamente ➔ BOT
  3. Telegram: bot Un bot è un utente “software” con cui

    un utente “umano” può scambiare ed inviare messaggi. I bot di telegram possono offrire svariate funzionalità: ➔ Inviare/ricevere media ➔ Possono essere fornite di IA ➔ Possono essere usati nelle chat di gruppo I bot sono riconoscibili dai propri nickname, avranno sempre la parola bot alla fine del nome.
  4. Telegram: bot É possibile comunicare con i bot inviando dei

    messaggi semplici oppure lanciando dei comandi seguiti dal carattere speciale “/”. Comandi standard ➔ /start per avviare il bot ➔ /stop per arrestare il bot ➔ /help informazioni di utilizzo Comandi per bot nei gruppi ➔ @nome_bot [messaggio semplice] ➔ /comando@nome_bot [messaggio]
  5. Telegram: bot SearchGoBot: un telegram bot che velocizza l’esperienza di

    ricerca via Google, effettuando ricerche sul web usando soltanto il client Telegram. Inviando un messaggio al bot con la parola o frase che abbiamo intenzione di cercare, il bot inoltrerà la richiesta a Google. Riceveremo come risposta dei messaggi contenenti link e descrizione della ricerca fatta.
  6. API Google Search ➔ Approccio 1: HTML ◆ Ricerca di

    ciò che ci serve direttamente dall’HTML fornitoci da Google ➔ Approccio 2: JSON ◆ Le API fornite da Google sono inviate in un formato “parsabile” da più linguaggi di programmazione.
  7. JSON JavaScript Object Notation è un formato testuale per descrivere

    i dati: ➔ rende più semplice lo scambio tra programmi: ➔ non dipende dai linguaggi ➔ facilmente leggibile, notazione “chiave”:”valore”
  8. JSON Tipi elementari ➔ Number: numeri a virgola mobile ➔

    String ➔ Boolean ➔ Array [ ] ➔ Object { }
  9. JSON Google offre una moltitudine di API, alcune di queste

    permettono di personalizzare la ricerca in base alle proprie necessità, in questo caso useremo una tra le più semplici. Basta fare una richiesta GET al link seguente seguito dal termine che si vuole cercare: http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=TERMINE+DA+CERCARE
  10. JSON ➔ Molto più ridotto rispetto alla risposta HTML. ➔

    Contiene SOLO informazioni strettamente necessarie alla nostra ricerca! Approfondimento sulla struttura JSON
  11. Go: caratteristiche Go è un linguaggio di programmazione compilato nato

    in Google nel 2009. É stato creato per rispondere alle moderne esigenze degli sviluppatori: ➔ brevi tempi di compilazione. ➔ performante su tutti i calcolatori. ➔ soddisfa le necessità attuali della programmazione concorrente. ➔ ha un Garbage collector
  12. Go: caratteristiche ➔ Supporto nativo della concorrenza ➔ Supporto nativo

    di unicode (tipo rune) ➔ Fortemente tipato ➔ “do more with less” (solo 25 keywords) ➔ Documentazione ricca ➔ Go Playground
  13. Go: tipi bool rune string uintptr byte uint, uint16,..., uint64

    int, int16,..., int64 float32, float64 complex64, complex 128 struct array slice map pointer interface function channel
  14. Go: comandi Dichiarazione di variabili e assegnamento: equivalente a if-then-else:

    Cicli: for Nota: NON esiste il while, si usa un for con una guardia Switch: function, main and “Hello World”
  15. Go: JSON Marshalling Per codificare i dati JSON si usa

    la funzione Marshal. Una volta definita la struttura da codificare, produciamo una sua istanza e la convertiamo in stringa JSON usando json.Marshal(istanza).
  16. Go: JSON Unmarshalling Per decodificare i dati JSON si usa

    la funzione Unmarshal. Una volta definita la struttura da codificare e la stringa Json da trasformare in istanza basta invocare json.Unmarshal(stringa, riferimento), passando come parametri la stringa ed il riferimento dell’istanza da popolare. Basterà passare il riferimento della variabile lista per popolarla con i valori contenuti nella jsonString
  17. Go: Ricerca su Google É la funzione che rappresenta il

    cuore del nostro bot: Il risultato sarà un array di stringhe contenenti i risultati del termine che abbiamo inserito come parametro
  18. Ricerca: HTTP GET Request Inviamo una richiesta HTTP GET contenente

    l’URL delle API di Google. Come abbiamo visto, sappiamo che la risposta a questa richiesta sarà una stringa JSON che dovremo poi convertire in una struttura dati usando il metodo Unmarshal.
  19. il tipo googleSearchResponse Se tutto è andato per il meglio,

    la variabile searchResults conterrà i risultati della ricerca Google effettuata, possiamo manipolarla come meglio vogliamo. searchResults.ResponseData.Results conterrà i risultati della ricerca. Adesso siamo in grado di ricevere risposte Google usando un programma Go.
  20. BotFather BotFather è un bot che permette a sua volta

    la creazione di altri bot telegram. Per creare un nuovo bot basta aggiungere BothFather su telegram come @BotFather e creare un nuovo bot tramite il comando /newbot. Riceveremo l’API KEY, necessaria per far comunicare il nostro bot con Telegram.
  21. Telebot Una volta ottenuta l’API Key da BotFather bisogna interfacciare

    il bot alle API di Telegram, occorre un procedimento simile a quello che abbiamo appena visto per effettuare la ricerca Google. ➔ Registrazione del bot usando nome del bot e API key ➔ Scambio di messaggi usando le API di telegram (sempre in formato JSON) utilizzeremo una libreria già scritta: github.com/cortinico/telebot
  22. Telebot: Download per scaricare la libreria basta usare il comando

    go get seguito dal link della libreria. NOTA: necessita di git installato
  23. Telebot Dopo aver scaricato ed importato telebot, istanziamo una variabile

    di tipo telebot.Bot Inseriamo i parametri di accesso usando il tipo Configuration. Telebot offre: ➔ tipo Bot ➔ tipo Configuration ➔ il metodo Start()
  24. SearchGoBot: telebot Start() è un metodo applicabile al tipo Bot

    ➔ Configuration: variabile contenente i parametri di accesso ➔ Il tipo Responder è una funzione che restituisce una coppia di valori ◆ Responder: funzione che gestisce messaggi ricevuti e da inviare
  25. Tutto molto bello, ma... ➔ Google offre API molto più

    complete e sofisticate di quella presentata qui ➔ C’è un limite imposto da Google per il numero di ricerche che è possibile fare ◆ per superare questo limite bisogna pagare ➔ Questo bot gira in una macchina locale ◆ una volta spenta, il bot non sarà più operativo ➔ Go presentata molte altre caratteristiche non presentate qui Per questo e molto altro ancora, ci affidiamo alla vostra curiosità ;-)
  26. Google Cloud Platform ◦ cloud.google.com ◦ Hostato nei datacenter di

    Google ◦ Svariati servizi, in base alle proprie esigenze
  27. Google Compute Engine ◦ IaaS (Infrastructure as a Service) di

    Google ◦ Permette l’esecuzione di VM predefinite o customizzate ◦ Storage su SSD, connessioni in Fibra, Global load balancing ◦ Ottimo per applicativi CPU Intensive
  28. Google Container Engine ◦ Orchestratore di cluster di container Docker

    ◦ Basato su Kubernetes ◦ Free fino a 5 nodi nel cluster ◦ Ottimo se la vostra applicazione è deployata tramite docker
  29. Google App Engine ◦ PaaS (Platform as a Service) di

    Google ◦ Fully managed ◦ Scala su richiesta ◦ Si deploya il codice, AppEngine deciderà quante/quali istanze avviare ◦ Ottimo per applicativi che possono avere picchi di richieste nel tempo (ad esempio un Bot di telegram…)
  30. Pros ◦ Nessuna manutenzione dei server ◦ Applicazioni facilmente scalabili

    ◦ Gratuito fino ad un certo limite ◦ Integrato in svariati tool
  31. Cons ◦ Codice “castrato” (solo un sottoinsieme delle funzioni/librerie) ◦

    Accesso al filesystem read-only (sola lettura) ◦ Esegui codice solamente in risposta a richieste HTTP ◦ Lock-in ◦ No multi-threading
  32. Services • Cloud Datastore Database NoSQL • Cloud SQL Database

    Relazionale • Cloud Storage Archivazione di file grossi • Mem Cache Caching di dati globali • Authentication Login degli utenti tramite Google Auth • Task Queues Esecuzione asincrona di task futuri • Logging Scrittura di Log • Urlfetch Esecuzione di chiamate HTTP • Mail API Invio di email • Security Scanner Ricerca di vulnerabilità nella propria applicazione
  33. Restrictions ◦ Le applicazioni gireranno all’interno di una sandbox ◦

    Non si può scrivere sul filesystem! ◦ Non si può “rispondere lentamente” ◦ Non si possono effettuare system call The Go runtime restricts the use of standard library packages that would violate the sandbox policies. Such functions have been replaced by stubs that return an os.ErrPermission error or removed entirely. From https://cloud.google.com/appengine/docs/go/runtime
  34. The GO SDK 1. Scaricare lo SDK https://cloud.google.com/appengine/downloads#Google_App_Engine_SDK_for_Go 2. Unzippalo

    in una cartella (/home/gopher/appengine) 3. Imposta la variabile d’ambiente PATH $ export PATH=$PATH:/home/gopher/appengine 4. Assicurati di avere Python 2.7 (Lo SDK è scritto in parte in Python) $ /usr/bin/env python -V Python 2.7.10 5. Siete pronti per sviluppare per App Engine in Go!
  35. goapp ◦ Il comando base per lavorare con App Engine.

    ◦ Un wrapper del comando go (goapp build, goapp run, ...) ◦ $ goapp help [topic] Ottiene aiuto su un comando ◦ $ goapp serve Esegue un development environment locale ◦ $ goapp deploy Deploya l’app su AppEngine
  36. app.yaml • runtime: go Nel nostro caso il runtime è

    semplicemente Go • api_version: go1 È disponibile solo una api_version (per ora…) • handlers: … Definisce l’elenco degli endpoint • application: my-app-id L’application ID da cloud.google.com • version: v1 La versione dell’applicazione, per supportare versioni multiple dell’app
  37. handlers handlers: - url: /images static_dir: static/images - url: /.*

    script: _go_app handlers: - url: / script: _go_app - url: /index\.html script: _go_app - url: /browse/(books|videos|tools) script: _go_app
  38. scaling instance_class: B8 manual_scaling: instances: 5 instance_class: F2 automatic_scaling: min_idle_instances:

    5 max_idle_instances: automatic min_pending_latency: 30ms max_pending_latency: automatic max_concurrent_requests: 50 instance_class: B8 basic_scaling: max_instances: 11 idle_timeout: 10m
  39. goapp deploy - The first time Autenticazione con OAuth2, il

    token viene salvato in ~/.appcfg_oauth2_tokens
  40. getUpdates ◦ Approccio più semplice per ottenere i messaggi da

    Telegram ◦ Implementa il Long Polling (con timeout) ◦ Perfetto per testare il bot ◦ Funziona in ogni circostanza (dietro NAT, etc…) ◦ Non necessita di configurazioni particolari (firewall, etc…)
  41. setWebhook ◦ Approccio più complesso per ottenere i messaggi da

    Telegram ◦ Riceve i messaggi con una logica push ◦ Si fornice l’URL dove si riceveranno delle POST per ogni messaggio al bot ◦ Richiede un certificato SSL ◦ Se si usa un certificato self-signed, deve essere passato come parametro
  42. setWebhook ◦ L’utilizzo di setWebhook risulta obbligato su App Engine

    per come è pensata la piattaforma (esegui codice su richiesta HTTP). ◦ Ci permette di risparmiare risorse ◦ Il certificato SSL viene offerto gratuitamente da Google
  43. telebotgae ◦ Un fork di telebot ◦ Funziona utilizzando setWebhook

    (altrimenti inutilizzabile su GAE) ◦ Scrive sul log di App Engine ◦ Per l’utente è molto simile a telebot ◦ Espone l’oggetto http.Response, necessario per accedere alle funzionalità di App Engine (context)
  44. telebotgae 1. Creaiamo un progetto su cloud.google.com 2. Creiamo un

    nuovo bot con @BotFather 3. Copiamo la cartella bot_example/ da github.com/cortinico/telebotgae/ 4. Mettiamo il project ID dentro il file app.yaml 5. Mettiamo l’API Key e il nome del bot nel file hello.go 6. Scrivi la logica del bot nel file hello.go 7. Deploya con $ goapp deploy 8. Ricordati di chiamare setWebhook
  45. Logging ◦ La stampa su standard output/error non funziona (ovviamente)

    ◦ Si deve utilizzare il pacchetto google.golang.org/appengine/log ◦ I log potranno quindi essere visti/scaricati
  46. Questions? Giovanni Modica [email protected] @infernatico /GianniGM Nicola Corti [email protected] @cortinico

    /cortinico github.com/cortinico/telebotgae Slide distribuite sotto licenza CC By-4.0