Andrea Rustichelli

Most commented posts

  1. MLDownloader fine tuning — 5 comments
  2. CompeGPS Land – Appunti sull’utilizzo — 4 comments
  3. AS400 vs. SAP — 4 comments
  4. Kurt Vonnegut – Ghiaccio-nove — 3 comments
  5. WordPress 5 e Gutenberg — 2 comments

Author's posts

Saponi da barba duri

Mi sono fatto un regalo e ho acquistato i saponi da barba duri della Goodfellas’ in due versioni diverse… Furiah e Abysso. Sono saponi da barba artigianali fatti in Italia.

Furiah, al profumo di cuoio su legno, è perfetto per la stagione invernale, mentre il sapone Abysso ha delle note molto più fresche (note agrumate, bergamotto, ananas) ed è quindi perfetto per la stagione estiva.

Per l’utilizzo, basta versare un po’ di acqua sul sapone e lasciare agire, e poi prelevare il sapone con il pennello e poi terminare il montaggio in ciotola.

Permanent link to this article: http://www.andrea.rustichelli.name/saponi-da-barba-duri/

I DRM in Calibre

Questo post non vuole essere un incitazione a rimuovere i DRM dai file comprati con Adode Digital Edition, bensì vuole essere una guida per chi volesse alcuni chiarimenti tecnici su come rendere compatibile tale formato con gli eBook reader che non supportano questo formato (o i sistemi Linux senza Vine e senza il programma di Adobe installato).

Innanzi tutto, Adobe Digital Edition non è compatibile con Linux (a meno che non si voglia utilizzare Vine, cosa che io non ho fatto), e quindi è necessario lavorare in ambiente Mac o Win. Io ho scelto, ovviamente, Windows 7 per fare queste prove. Sul PC è installato Adobe Digital Edition con relativa attivazione del profilo.

Collegarsi al sito Apprentice Alf’s Blog giusto per capire di cosa stiamo parlando. Sul sito troveremo il collegamento al sito dove scaricare l’apposito plug in per Calibre che, con ogni probabilità, punterà a questo sito. A questo punto è necessario decomprimere il file .ZIP e installare il plug in direttamente da Calibre andando nella sezione Preferenze. Ricordo che per funzionare correttamente sul PC deve essere installato Adobe Digital Edition tramite Vine altrimenti il plugin per Calibre non sarà in grado di funzionare.

Devo essere sincero che non ho trovato nessun utilità nel plug in… però nei file Pyton contenuti nella cartella del plug in sono stati molto utili. Ma vediamo i dettagli.

Ho scaricato il Pyton 2.7 e l’ho installato sul pc. A installazione completata ho scaricato e installato il modulo PyCrypto.

Quindi, ricapitolando, a questo punto abbiamo Windows 7 con installato Adobe Digital Edition attivato, Pyton, il modulo PyCrypto, il plug in DeDRM decompresso e il file in formato .PDF o .EPUB protetto da DRM. Una volta importato il file .acsm all’interno di Adobe Digital,Edition è necessario inserire l’utente e la password per scaricare il file corrispondente. Tutti i libri protetti da copyright si trovano all’interno della sezione Libreria. è necessario selezionare un file e premere il tasto destro per selezionare l’opzione Mostra il file in esplora risorse in modo da aprire la cartella del,computer che contiene i file con estensione .epub con i DRM.

Eseguendo i 3 programmi Pyton presenti nel plug in DeDRM (che è possibile trovare cercando nelle sottocartelle) denominati:

  • adobekey.py
  • ineptpdf.py
  • inptebup.py

è possibile rimuovere il DRM dai file.

Eseguendo il programma adebekey.py viene visualizzato il percorso del file .DER che contiene le informazioni del certificato digitale di Adobe. Una volta individuato il file .DER è possibile copiarlo in un’altra cartella come un normalissimo file.

Rispettivamente i programmi ineptpdf.py e inptepub.py servono per rimuovere il DRM dai file .PDF o ,EPUB. Lanciando ogni programma vengono richiesti 3 parametri: il percorso del file .DER, il percorso del file di input e il percorso del file di output senza il DRM.

Una volta completata l’operazione viene prodotto un file identico al primo ma senza il DRM e quindi utilizzabile su quei dispositivi che non gestiscono correttamente il certificato di Adobe Digital Edition (come ad esempio Calibre per gli ambienti Linux).

Permanent link to this article: http://www.andrea.rustichelli.name/i-drm-in-calibre/

Audio Technica LP120 USB

L’idea c’era da molto tempo Poi però non ho mai trovato il tempo e la voglia di approfondire l’argomento. Ma finalmente, dopo una lunga ricerca, mi sono deciso e ho fatto il passo di acquistare un giradischi.

La scelta è caduta sul modello LP120 USB della Audio Technica. E’ un modello a trazione diretta (in opposizione a quello a cinghia) e imita il famoso modello della Technics di qualche decennio fa.

Ascoltare un disco è una cosa completamente diversa rispetto a quanto siamo abituati a fare. Prima gli mp3 e poi i servizi come Spotify, ci hanno abituato ad avere tutto subito e soprattutto a cambiare canzone con una velocità praticamente istantanea. Con il giradischi il paradigma cambia completamente. Ovviamente per iniziare ho tirato fuori i vecchi vinili di mio padre, ma ben presto ho iniziato a comprare i vinili (nuovi od usati) che mi interessano maggiormente. Ovviamente sto cercando gli album che preferisco e per i quali vado sul sicuro… anche perchè se una canzone non piace, non è proprio agevole passare alla successiva.

Ho scelto questo giradischi anche per la presenza di una porta USB sul retro al quale è possibile collegare il PC tramite l’apposito cavo. Usando il programma gratuito Audacity è possibile rippare e poi salvare e modificare le tracce audio dei dischi.

Ecco, di seguito, le foto dell’unboxing e del montaggio del giradischi.

Specifiche

  • Tipo: Funzionamento a 3 velocità, completamente manuale
  • Motore: Servomotore DC
  • Metodo drive: diretta
  • Velocità: 33-1 / 3 RPM, 45 RPM, 78 RPM
  • Piatto del giradischi: Alluminio pressofuso
  • Starting torque: > 1,0 kgf.cm
  • Sistema di frenata: Freno elettronico
  • Wow e Flutter: <0,2% (WTD) @ 3 kHz (JIS)
  • Rapporto segnale-rumore: > 50 dB
  • Livello di uscita:
    • Pre-amp “PHONO”: 4 mV nominali a 1 kHz, 5 cm / sec
    • Pre-amp “LINE”: 240 mV nominali a 1 kHz, 5 cm / sec
  • Phono Pre-Amp Gain: 36 dB nominali, RIAA equalizzato
  • Funzione USB:
    • A/D, D/A – USB selezionabile a 16 bit / 44,1 kHz o 48 kHz;
    • Interfaccia computer – Compatibile con USB 1.1 Windows 7 o superiore, o MAC OS X o successivo
      Alimentazione: 120 V CA, 60 Hz
  • Consumo di energia: 2,75 W
  • Dimensioni: (LxPxA) 452,0 mm x 352,0 mm  x 141,6 mm
  • Peso: 8 kg (senza coperchio antipolvere)
  • Accessori inclusi: Cartuccia phono AT-VM95E; Headshell AT-HS6; Cavo USB da 1,9 m (6,2 ‘); doppio cavo RCA (maschio) a doppio RCA (maschio) con cavo di messa a terra; contrappeso; feltro opaco; copertura antipolvere; Adattatore 45 giri; obiettivo di tipo stilo plug-type
  • Tipo di braccio: braccio a forma di S bilanciato con guscio staccabile
  • Lunghezza braccio effettiva: 230,5 mm
  • Sporgenza: 16 mm
  • Angolo di inseguimento: meno di 3 gradi
  • Peso cartuccia applicabile: 3,5-8,5 g
  • Campo antislittamento: 0-4 g
  • Stilo di ricambio: AT -VMN95E (venduta separatamente)

Requisiti del sistema operativo per la porta USB

  • PC o Mac con una porta USB disponibile (USB1.1 o successiva)
  • Windows 7 o versione successiva, o Mac OS X o superiore

Manuali

Permanent link to this article: http://www.andrea.rustichelli.name/audio-technica-lp120-usb/

Cosa mi sta succedendo?

Oggi ho vissuto la seguente esperienza.

Un collega, appassionato di montaggi video in 4K registrati con il drone, mi dice che il suo computer scatta ed è parecchio lento nell’aprire e modificare i file video (che hanno la dimensione di circa 1,2/2 GB). Ok, detta così è troppo semplice, gli chiedo di portarmi il portatile così provo a dare un occhio per capire quale sia il reale problema.

Mi porta il suo computer e, nonostante abbia un paio di anni, è equipaggiato con un processore Intel i7, scheda grafica dedicata ATI e 12 GB di ram. Sistema operativo Windows 8 nativo (quello già installato al momento dell’acquisto). Provo a smanettarci un po’ e capisco subito che il sistema operativo è piantatissimo. Ho provato anche ad installare VLC (che generalmente fornisce ottimi risultati in termini di stabilità e velocità rispetto a Media Player) ma il problema è del sistema operativo. Lentissimo, piantatissimo, inutilizzabile.

Svengo

Poi mi riprendo, mi guardo in giro, poi lo fisso negli occhi e gli dico: “Non l’ho mai detto a nessuno, ma se fossi in te comprerei un Mac”.

Sono svenuto nuovamente.

Morale della storia: se uno è uno smanettone può provarci a mettere mano al pc e provare a reinstallare da 0 una versione non OEM di Windows oppure provare a installare una qualsiasi distro di Linux e incrociare le dita per trovare i programmi con le stesse funzionalità di quelli utilizzati in ambiente Microsoft. Però alla fine, comprando un Mac, potrebbe risolvere velocemente il problema visto che i programmi per la gestione dei file multimediali abbondano su questo sistema operativo. Per me è stato un modo per dare un ottimo consiglio senza dover metterci le mani perchè poi ho aggiunto: “Però per il Mac non posso aiutarti perchè è un sistema che non conosco (e che non voglio conoscere)”.

Permanent link to this article: http://www.andrea.rustichelli.name/cosa-mi-sta-succedendo/

Vizi e virtù di un programmatore

Alla facoltà di ingegneria informatica di Modena ho appreso, per la prima volta, che la pigrizia è una dote fondamentale per i programmatori. Il concetto è abbastanza semplice… se c’è già un programma che funziona bene, è inutile cercare di fare un programma che faccia la stessa cosa… o si usa il programma esistente o si cerca di migliorarlo/modificarlo per “piegarlo” alle proprie esigenze. Questa è una caratteristica fondamentale che ha, fra le altre cose, ispirato le librerie per la programmazione (API). Se poi uno usa un ambiente Linux, sa benissimo che utilizzando la shell e i programmi disponibili nel sistema operativo, può fare qualsiasi cosa combinandoli insieme senza dover riscrivere i programmi base.

Facendo qualche ricerca in internet ho trovato questo sito che conferma questa teoria… e inoltre vengono individuate altre due caratteristiche che i programmatori devono possedere che sono l’impazienza e la tracotanza.

L’elenco delle tre virtù di un programmatore sono state codificate da Larry Wall, l’inventore del linguaggio di programmazione Perl (pagina Wiki e sito ufficiale)… programmatore con un grande umorismo…

Permanent link to this article: http://www.andrea.rustichelli.name/vizi-e-virtu-di-un-programmatore/

Radersi come un Uomo Alfa – Capitolo 4: Razorock the other italian one

Avevo voglia di un rasoio nuovo e mi sono fatto invogliare dagli sconti di Novembre per acquistare un rasoio Razorock Lupo Black.

Il rasoio è in alluminio e lavorato al tornio a CNC e quindi garantisce una finitura perfetta ed elegante. La testina copre interamente la lametta e questo secondo me è un plus non indifferente, sia a livello estetico ma anche a livello pratico perchè la particolare conformità dell’alloggiamento garantisce il corretto allineamento della lametta (che quindi risulta sempre perfettamente allineata e perpendicolare al verso del taglio).

La lavorazione in alluminio si fa sentire, tanto è vero che il peso del rasoio con la lametta montata è pari a 32 grammi (quindi nettamente inferiore agli altri rasoi che che utilizzato recentemente). Ricordo che il Fatip pesa 70 grammi, mentre il rasoio Wilkinson Classic 43 grammi.

Insomma, in poco tempo è diventato il mio rasoio preferito e faccio veramente molta fatica a passare agli altri rasoi. E’ molto deciso anche se non l’ho trovato troppo aggressivo sulla pelle. Il baricentro si trova proprio nella parte zigrinata del manico. Con questo rasoio (e la giusta lametta) è possibile tagliare la barba di una settimana senza nessun problema.

Permanent link to this article: http://www.andrea.rustichelli.name/radersi-come-un-uomo-alfa-capitolo-4-razorock-the-other-italian-one/

Il mio rapporto con i social network

Non è che odio i social network.

Cioè… alla fine sono presente su tutti i principali social network, ma non li frequento attivamente.

Il problema è che sono pieni di tag, di slogan, di hastag (che poi non sono altro che tag con un nome più accattivante) e di vuoto.

I social network partono bene, ma poi si perdono… sono pochi quelli che continuano a mantenere un certo “appeal” nel tempo. Un esempio su tutti Facebook (che secondo me tra 3 anni da ora non ci sarà più)… o G+ che non è neanche decollato. All’inizio, su Facebook, tutti postavano qualcosa di originale e personale… adesso ci sono solo dei link a dei link e ad altro materiale spazzatura presente in giro per la rete (che lucra sul traffico generato).

E poi sono drammaticamente vuoti di contenuti interessanti. Se si ricerca qualcosa (ad esempio per interesse personale, per hobby, perchè si vuole trovare una soluzione ad un problema, ecc.), si verrà reindirizzati verso siti, blog, forum, newsgroup ma sicuramente non verso un social network, perché li è impossibile trovare contenuti degni di nota.

Ecco, questo penso che sia il problema principale dei social… devono essere utilizzati solamente per scopo “ludico”.

Quindi massimo rispetto per tutte quelle persone che perdono tempo a scrivere e mantenere attivi i siti e i blog sparsi per la rete. Conosco benissimo quanto tempo e passione ci vuole…

Permanent link to this article: http://www.andrea.rustichelli.name/il-mio-rapporto-con-i-social-network/

Radersi come un Uomo Alfa – Capitolo 3: The Plastic Choice

Ho comprato (in occasione di un regalo per alcuni amici) un rasoio Wilkinson Classic a pettine chiuso in plastica. L’ho pagato circa 5 euro con anche le lamette Wilkinson (che non sono affatto male, anche se le trovo non all’altezza delle altre lamette che uso normalmente).

Questo rasoio è lungo circa 10 cm e quindi risulta più lungo rispetto al Fatip e pesa 43 grammi con la lametta montata. Quindi risulta molto più leggero del Fatip ma risulta comunque un ottimo rasoio nonostante il prezzo praticamente irrisorio. E’ un rasoio a 2 pezzi e rende il montaggio molto facile perchè basta ruotare il manico per avvitare o svitare la testa per montare la lametta. Tra l’altro, a differenza del Fatip, la testa del rasoio protegge completamente la lametta che risulta completamente racchiusa nel corpo del rasoio. E’ una soluzione che trovo molto bella esteticamente oltre che pratica.

Non sarà il rasoio della mia vita, però come alternativa o da portare in vacanza non è affatto male.

Permanent link to this article: http://www.andrea.rustichelli.name/radersi-come-un-uomo-alfa-capitolo-3-the-plastic-choice/

Paolo Villaggio – Fantozzi, rag. Ugo (La tragica e definitiva trilogia)

Dopo aver visto tutti i film del famoso “Ragionier Fantozzi” decido di buttarmi nella lettura dei libri che li hanno ispirati.

Praticamente è un frullato dei film, con gli eventi, i personaggi e i nomi sparsi qua e là tra le pagine dei 3 libri raccolti in un unico eBook.

Carino il primo, bello il secondo, il terzo a tratti diventa imbarazzante. Si ride a tratti. Però rimane una delle migliori e più longeve analisi della società italiana.

Permanent link to this article: http://www.andrea.rustichelli.name/paolo-villaggio-fantozzi-rag-ugo-la-tragica-e-definitiva-trilogia/

Factotum BOT – il sorgente completo e funzionante

Ed ecco finalmente il codice completo del bot perfettamente funzionante. Visto che il codice è particolarmente lungo lo potete trovare continuando a leggere questo post.

Ogni commento o contributo è particolarmente gradito.

Permanent link to this article: http://www.andrea.rustichelli.name/factotum-bot-il-sorgente-completo-e-funzionante/

Factotum BOT – analizza_audio(…)

Ed eccoci all’ultima funzione del bot.

Quella che mi ha dato più problemi e quella che mi ha dato maggiori soddisfazioni.

Quando passiamo al bot un messaggio audio registrato all’interno di Telegram, questa funzione, come prima cosa, converte il file audio dal formato OGG al formato WAV. E per fare questo ho trovato una meravigliosa quanto pratica libreria PYDUB.

Successivamente la funzione passa il file audio in formato WAV all’engine di speech recognition di Google per riconoscere il messaggio vocale ed ottenere una stringa di testo.

Infine, la stringa di testo riconosciuta dal messaggio vocale, viene passata alla funzione formula_risposta(…) per formulare una risposta basata sul testo dettato (direi meraviglioso).

"""
=== ANALIZZA_AUDIO ===
Funzione per convertire in WAV il file audio registrato
in Telegram (nativo in formato OGG) e analizzare il messaggio audio
contenuto nel file WAV
======================
"""
def analizza_audio(bot, chat_id, msg):
    print("Funzione ANALIZZA_AUDIO: START")
    ogg_file_id=msg["voice"] ["file_id"]
    print("Funzione ANALIZZA_AUDIO:",ogg_file_id)
    print("Funzione ANALIZZA_AUDIO: Downloading file in formato OGG...")
    bot.download_file(ogg_file_id, "audio_da_telegram.ogg")
    print("Funzione ANALIZZA_AUDIO: Salvataggio file OGG terminato.")
    file_ogg = AudioSegment.from_ogg("audio_da_telegram.ogg")
    file_handle = file_ogg.export("output.wav", format="wav")
    print("Funzione ANALIZZA_AUDIO: Convesione file WAV terminato.")

    r = sr.Recognizer()
    with sr.WavFile("output.wav") as source:
        audio = r.record(source)

    try:
        domanda=r.recognize_google(audio,language="it_IT")
        print("Trascrizione del file audio: " + domanda)   # recognize speech using Google Speech Recognition
        formula_risposta(bot,chat_id,msg,domanda)
    except LookupError:                                 # speech is unintelligible
        print("Impossibile riconoscere del testo nel file audio analizzato")

    return

Permanent link to this article: http://www.andrea.rustichelli.name/factotum-bot-analizza_audio/

Factotum BOT – leggi_QR_code(…)

Ancora grazie agli amici del sito http://www.allafinedelpalo.it/ per il codice sulla lettura dei codice QR code che ho copiato dal loro post e che ho applicato all’interno del mio bot.

Pubblico anche le 3 immagini che contengono i codici QR che vengono riconosciuti dal bot. Non sono altro che 3 immagini che contengono le stringhe qrcode1, qrcode2 e qrcode3.

Quando viene inviata una immagine nella chat, il bot prova a controllare se nell’immagine è presente un QR code e legge il contenuto. Confronta il testo contenuto nel QR code con le 3 variabili definite a livello di programma e così definite:

QRCODE1="qrcode1"
QRCODE2="qrcode2"
QRCODE3="qrcode3"

Il bot, nella sua versione base, non fa altro che visualizzare il testo riconosciuto e comunicare se coincide con il valore di una delle 3 variabili.

Se il bot non riconosce nessun codice QR valido, visualizza un messaggio all’utente. E’ meglio stampare il codice QR e utilizzare la fotocamera dello smartphone per caricare l’immagine del QR code, perchè se si fotografa il codice QR dallo schermo del computer, il bot fa fatica a riconoscere correttamente il contenuto dell’immagine (forse i pixel disturbano l’identificazione).

Ecco il codice della funzione completa:

"""
=== LEGGI_QR_CODE ===
Funzione per analizzare l'immagine passata al BOT nella chat
e cerca se il testo presente nel QR code coincide con il testo
definito nelle 3 variabili di programma con lo scopo di
effettuare delle scelte sulla base del contenuto del QR code.
=====================
"""
def leggi_QR_code(bot,chat_id,msg):
    bot.sendMessage(chat_id, 'Ricerca dei QR Code in corso...')
    raw_img = BytesIO()
    bot.download_file(msg['photo'][-1]['file_id'], raw_img)
    img = Image.open(raw_img)
    qrcodes = decode(img)

    if len(qrcodes) > 0:
        for code in qrcodes:
            print("Il contenuto del QR code è:", qrcodes)
            qr_string=str(code.data)
            qr_string_unicode=qr_string[2:-1]

            bot.sendMessage(chat_id, "Il QRCode contiene il testo: " + qr_string_unicode)
            if qr_string_unicode==QRCODE1:
                bot.sendMessage(chat_id, "Trovato il QRCODE1")
            elif qr_string_unicode==QRCODE2:
                bot.sendMessage(chat_id, "Trovato il QRCODE2")
            elif qr_string_unicode==QRCODE3:
                bot.sendMessage(chat_id, "Trovato il QRCODE3")

    else:
        bot.sendMessage(chat_id, "Non ho trovato QRCode nella foto...")
    return

Permanent link to this article: http://www.andrea.rustichelli.name/factotum-bot-leggi_qr_code/

Factotum BOT – attiva_maggiordomo(…)

Di seguito riporto il codice per attivare l’Inline Keyboard all’interno di Telegram. Sinceramente pensavo che fosse più utili/pratica, ma alla fine non mi ha convinto come pensavo. Per questo motivo il codice non è ottimizzato e ho creato tante funzioni quante sono le Inline Keyboard da attivare. Ho anche creato una funzione che contiene molti cicli if per gestire i tasti premuti dall’utente, ma sono sicuro che ci sono modalità più raffinate per gestire questo tipo di input.

"""
=== ATTIVA MAGGIORDOMO ===
Funzione attivare l'Inline Keyboard presente in Telegram.
L'InlineKeyboard visualizza 3 pulsanti
 Il pulsante key1 visualizza un sottomenù con altri 2 pulsanti e quello per tornare indietro
 Il pulsante key2 visualizza un elenco di anni e il pulsante per tornare indietro
 Il pulsante key3 visualizza direttamente un testo
Questa è la funzione base. Ci sono altre funzioni per gestire le risposte dell'utente.
==========================
"""
def attiva_maggiordomo(chat_id):
    print("Maggiordomo attivato")

    keyboard = InlineKeyboardMarkup(inline_keyboard=[
                     [InlineKeyboardButton(text='Testo key1', callback_data='key1'),
                      InlineKeyboardButton(text='Testo key2', callback_data='key2'),
                      InlineKeyboardButton(text='Testo key3', callback_data='key3')]
                 ])
    bot.sendMessage(chat_id,"Attivazione del Maggiodomo in corso...",reply_markup=keyboard)

Di seguito riporto le altre funzioni necessarie per attivare e gestire i sotto menù dell’Inline Keyboard. Ricordo che il valore presente nel campo callback_data è quello che viene utilizzato per gestire il flusso all’interno del programma.

def attiva_maggiordomo_key1(chat_id):
    print("Maggiordomo KEY1 attivato")
    key1_keyboard = InlineKeyboardMarkup(inline_keyboard=[
                     [InlineKeyboardButton(text='Testo key1 sub 1', callback_data='key1_1'),
                     InlineKeyboardButton(text='Testo key1 sub 2', callback_data='key1_2')],
                     [InlineKeyboardButton(text='Torna indietro', callback_data='from_key1_back')]
                 ])
    bot.sendMessage(chat_id, "Entro nella sezione KEY1...",reply_markup=key1_keyboard)

def attiva_maggiordomo_key2(chat_id):
    print("Maggiordomo KEY2 attivato")
    key2_keyboard = InlineKeyboardMarkup(inline_keyboard=[
                     [InlineKeyboardButton(text='2016', callback_data='2016')],
                     [InlineKeyboardButton(text='2017', callback_data='2017')],
                     [InlineKeyboardButton(text='2018', callback_data='2018')],
                     [InlineKeyboardButton(text='Torna indietro', callback_data='from_key2_back')]
                 ])
    bot.sendMessage(chat_id, "Entro nella sezione KEY2...",reply_markup=key2_keyboard)

def attiva_maggiordomo_key3(chat_id):
    print("Maggiordomo KEY3 attivato")
    bot.sendMessage(chat_id, "Entro nella sezione KEY3...")

Infine, ecco la funzione per gestire i pulsanti una volta che vengono premuti dall’utente.

def on_callback_query(msg):
    query_id, chat_id, query_data = telepot.glance(msg, flavor='callback_query')
    print('Callback Query:', query_id, chat_id, query_data)
    if query_data=="key1":
        attiva_maggiordomo_key1(chat_id)
    elif query_data=="key2":
        attiva_maggiordomo_key2(chat_id)
    elif query_data=="key3":
        attiva_maggiordomo_key3(chat_id)
    elif query_data == 'from_key1_back':
        attiva_maggiordomo(chat_id)
    elif query_data == 'from_key2_back':
        attiva_maggiordomo(chat_id)
    elif query_data == 'from_key3_back':
        attiva_maggiordomo(chat_id)
    elif query_data == '2016':
        bot.sendMessage(chat_id, "Hai scelto l'anno 2016")
    elif query_data == '2017':
        bot.sendMessage(chat_id, "Hai scelto l'anno 2017")
    elif query_data == '2018':
        bot.sendMessage(chat_id, "Hai scelto l'anno 2018")
    elif query_data == 'key1_1':
        bot.sendMessage(chat_id, "Hai premuto il tasto KEY1_1")
    elif query_data == 'key1_2':
        bot.sendMessage(chat_id, "Hai premuto il tasto KEY1_2")
    elif query_data == 'key2_1':
        bot.sendMessage(chat_id, "Hai premuto il tasto KEY2_1")
    elif query_data == 'key2_2':
        bot.sendMessage(chat_id, "Hai premuto il tasto KEY2_2")

Permanent link to this article: http://www.andrea.rustichelli.name/factotum-bot-attiva_maggiordomo/

Factotum BOT – trova_posizione(…)

Ed eccoci alla funzione che, quando viene passata una posizione geografica al bot, tramite l’interrogazione di un web service, vengono visualizzati dei punti geografici nelle vicinanze del punto indicato. Ovviamente questa funzione ha uno scopo solo dimostrativo, ma serve per testare le potenzialità legate alla geolocalizzazione.

Inoltre è presente un pezzo di codice molto utile per la gestione del risultato dell’interrogazione del web service, in quanto l’output in formato json è stato reso “leggibile” tramite una conversione utilizzando la codifica UTF-8.

"""
=== TROVA_POSIZIONE ===
Funzione per scrivere i dati sulla posizione che viene passata al Bot
tramite l'interrogazione di un web service
=======================
"""
def trova_posizione(bot, chat_id, msg):
    bot.sendMessage(chat_id,'Mi hai passato la posizione geografica')
    print(msg["from"] ["first_name"])
    gps_lat=msg["location"] ["latitude"]
    gps_lon=msg["location"] ["longitude"]
    gps_url="http://www.geoplugin.net/extras/nearby.gp?lat=" + str(gps_lat) + "&lon=" + str(gps_lon) + "&format=json"
    with urlopen(gps_url) as response:
      html_response = response.read()
      encoding = response.headers.get_content_charset('utf-8')
      decoded_html = html_response.decode(encoding)

    data_json=json.loads(decoded_html)
    for posti in data_json:
        print(posti["geoplugin_place"], posti["geoplugin_distanceKilometers"], posti["geoplugin_directionHeading"])
        bot.sendMessage(chat_id, "Ti trovi a " + str(posti["geoplugin_distanceKilometers"]) + " Km da " + str(posti["geoplugin_place"]) + " in direzione " + str(posti["geoplugin_directionHeading"]))
    return

Permanent link to this article: http://www.andrea.rustichelli.name/factotum-bot-trova_posizione/

Factotum BOT – formula_risposta(…)

Vediamo la prima funzione utilizzata all’interno del BOT Factotum.

Il suo scopo è quello di prendere in input il testo digitato dall’utente all’interno della chat, spezzare la frase nelle singole parole che la compongono e confrontare le parole con le 3 HOT WORD inserite come variabili all’interno del programma stesso (e quindi a “compile time” e non a “run time”).

"""
=== FORMULA_RISPOSTA ===
Funzione per analizzare il testo digitato dall'utente nella chat
e formulare la risposta più appropriata sulla base delle 3 HOT_WORD definite
a livello di programma
========================
"""
def formula_risposta(bot, chat_id, msg, domanda):
    print("Funzione FORMULA_RISPOSTA: START")
    print("Funzione FORMULA_RISPOSTA: La domanda è ",domanda)

    parole=domanda.split(" ")
    parole_chiave=[]
    risposta=""
    for i in parole:
      if i in HOT_WORD1:
          parole_chiave.append(i)
          bot.sendMessage(chat_id,"Trovata la HOT_WORD1")
      if i in HOT_WORD2:
          parole_chiave.append(i)
          bot.sendMessage(chat_id,"Trovata la HOT_WORD2")
          #bot.sendDocument(chat_id, open('file_name.pdf', 'rb'))
      if i in HOT_WORD3:
          parole_chiave.append(i)
          bot.sendMessage(chat_id,"Trovata la HOT_WORD3")
          #bot.sendMessage(chat_id, "https://www.google.it")

    if len(parole_chiave)==0:
      bot.sendMessage(chat_id,"Spiacente, non sono riuscito a individuare la richiesta.")
    return

Le HOT_WORD non sono altro che liste che contengono le parole chiave che fanno attivare il BOT. Nel BOT di esempio sono descritte nel seguente modo:

HOT_WORD1=["pippo","Pippo","PIPPO"]
HOT_WORD2=["pluto","Pluto","PLUTO"]
HOT_WORD3=["paperino","Paperino","PAPERINO"]

Permanent link to this article: http://www.andrea.rustichelli.name/factotum-bot-formula_risposta/