Tag: nerd

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/

Kodi 18.1 Leia su LibreELEC

kodi_18.1

Questo è lo spettacolare splash screen della nuova versione 18.1 Leia di Kodi (che gira su un sistema LibreELEC sul mio HTPC Asrock ION 330). La versione, al momento della scrittura di questo articolo, è già avanzata alla versione 18.3 (il nome in codice è ancora Leia, ma sono stati introdotte alcune migliorie minori). Questa versione di Kodi è dedicata alla Principessa Leia di Guerre Stellari interpretata dalla indimenticabile Carrie Fisher.

Permanent link to this article: http://www.andrea.rustichelli.name/kodi-18-1-leia-su-libreelec/

Linux Mint 19.1

Ormai sono più di 3 anni che utilizzo abitualmente Linux Mint sul mio portatile.
Mi sono fatto prendere da un demone interiore e ho deciso di provare ad installare un nuovo sistema operativo… la scelta è caduta su:

  • Linux Mint (la nuova versione 19.1)
  • Ubuntu (la versione 18 e qualcosa… sia la LTS sia quella più “aggiornata”)
  • Debian (la versione 9.8 sia con Gnome sia con Cinnamon)
  • Fedora (con sostanziale passaggio da “casa” Debian a “casa” Red Hat)

Li ho provati prima in un ambiente virtuale grazie a VirtualBox. Volevo provare Debian e testare anche il Desktop Engine Gnome 3, ma l’ho trovato troppo semplicistico e troppo lontano dalla mia idea di desktop. Fedora era un passaggio troppo grande… vorrebbe dire passare al lato oscuro della forza. Ubuntu… beh lasciamo stare… proprio non ce la faccio ad utilizzare un SO con un nome così aberrante.

Sono tornato sulla nuova edizione di Linux Mint 19.1 (nome in codice “Tessa”) con Cinnamon come Desktop Engine. Però non riuscivo ad installarla perché ad un certo punto dell’installazione compariva il messaggio di errore:

PCIe bus error severity=corrected type= physical layer (eccetera eccetera eccetera)

Come soluzione ho dovuto modificare i parametri in fase di boot con il comando “c” e ho aggiunto il parametro pci=nomsi. In questo modo l’installazione è terminata senza nessun problema. Ovviamente però è necessario rendere definitiva la modifica modificando opportunamente il file grub presente nella cartella /etc/default/grub nel seguente modo:

GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash pci=nomsi”

e poi è necessario ricordarsi poi di lanciare il comando
sudo update-grub

Finalmente mi posso godere il mio nuovo sistema Linux Mint 19.1 “Tessa”

Permanent link to this article: http://www.andrea.rustichelli.name/linux-mint-19-1/

Dove mi trovo? Un aiuto inaspettato dal Python

A volte capita di svegliarsi dopo una serata intensa e non sapere dove ci si trova. A questo viene in aiuto il sito geoPlugin che offre molti servizi legati alla geo localizzazione. In particolare ho trovato simpatico il servizio che, data la latitudine e la longitudine, fornisce, tramite un oggetto json, l’elenco di alcune località vicine a noi e con informazioni utili come ad esempio la distanza in miglia e kilometri e la direzione.

Questo è un esempio di url da lanciare per avere un’idea dell’output che viene prodotto:

http://www.geoplugin.net/extras/nearby.gp?lat=44.6983&lon=10.6312&format=json

Il passo successivo è stato quello di scrivere un programma in python per gestire l’output. Questo programma non prevede la modifica delle coordinate geografiche in input, se non modificando il sorgente del programma prima della sua esecuzione, però è solamente un primo passo verso qualcosa di più evoluto (ad esempio un bot Telegram).

Infatti ho trovato delle difficoltà nella formattazione corretta del tracciato json di output e della sua successiva gestione tramite la libreria json di python. Ho risolto questo problema convertendo l’output in formato UTF-8.

Molto utile anche l’utilizzo del ciclo for per la lettura dei dati json e degli elementi in esso contenuti.

Riporto di seguito il codice funzionante… andrebbe migliorato… ma funziona.

Permanent link to this article: http://www.andrea.rustichelli.name/dove-mi-trovo-un-aiuto-inaspettato-dal-python/

MusicBrainz Picard

Picard è un programma cross-platform scritto in Pyton per taggare i file musicali attingendo le informazioni dal sito MusicBrainz.

Come prima cosa è necessario installare il programma; da Linux Mint è possibile installarlo tramite riga di comando, tramite gestore delle applicazioni o, a partire dalla versione 18.3, anche tramite Flathub.

Una volta aperto Picard è possibile aggiungere un singolo file o una cartella… in questo caso ho caricato l’album Ok Computer dei Radiohead.

E’ possibile premere il pulsante Raggruppa per chiedere al programma di raggruppare i file (e quindi le canzoni) per Album. A questo punto è possibile premere il pulsante Analizza; in questo modo Picard trova (o meglio prova a trovare) le informazioni delle canzoni su Musicbrainz.

A questo punto, se l’analisi va a buon fine, l’album viene visualizzato nella parte destra della finestra (e contestualmente viene eliminato dalla parte sinistra) con l’icona del CD in colore giallo oro per confermare che l’analisi è andata a buon fine. Espandendo il CD è possibile vedere le canzoni che sono state etichettate con i TAG ricevuti dal portale Musicbrainz.

L’utilità di questo TAG è opinabile… aggiunge informazioni utili soprattutto se le canzoni vengono gestite con programmi, come ad esempio Kodi, che permettono di avere una gestione molto complessa e precisa dei file musicali presenti sul proprio computer.

Come ultima cosa è necessario selezionare il CD e premere il tasto Salva in modo da salvare le informazioni sui file di origine. L’operazione viene confermata dall’icona a forma di segno di spunta verde davanti ad ogni file salvato con successo.

Permanent link to this article: http://www.andrea.rustichelli.name/musicbrainz-picard/

Installare Retropie su SD per Raspberry

Formattare la scheda SD con il filesystem Fat32 con il programma GParted.
Ho scaricato la versione 4.3 di Retropie per Raspberry pi 3 dal sito ufficiale.
Decomprimere il file in modo da ottenere l’immagine del programma; si crea un file in formato .IMG da circa 2,2 GB. In alternativa è possibile usare il comando:

gzip -dv retropie-4.3-rpi2_rpi3.img.gz 

Con il comando il file di origine .GZ viene cancellato a meno che non venga utilizzato l’apposita opzione per conservare il file compresso.
Per comodità ho posizionato il file .img sulla Scrivania e l’ho rinominato semplicemente in retropie.img. Poi è necessario aprire la console e digitare il seguente comando:

sudo dd if=retropie.img of=/deb/sdb

per copiare l’immagine nella scheda SD che, in questo caso, è collegata al pc tramite un lettore di schede USB,dove if indica il file di input e of il file di output. Armarsi di pazienza e attendere il termine dell’operazione.

Al termine dell’operazione è possibile scollegare il lettore di schede SD e installare la scheda nell’apposito slot del Raspberry per far partire l’installazione.

Una delle funzionalità in assoluto più comode di Retropie, è la possibilità di potersi collegare direttamente tramite protocollo SSH, e questo significa che è possibile caricare i file e le ROM in Retropie senza dover sempre spostare la scheda SD ma collegandosi direttamente tramite rete. Retropie in generale è molto più configurabile rispetto a Recalbox.

Una volta partito Retropie è necessario andare nel menù di configurazione per collegarlo alla rete WiFi e successivamente per attivare il protocollo SSH.

Andare su Linux e selezionare File – Connetti al server… e inserire i seguenti parametri di login per poter collegarsi direttamente a Retropie da Linux e poter accedere al file system per copiare, ad esempio, le varie ROM con i giochi. Nel mio caso l’indirizzo IP di Retropie era 192.168.1.102, sulla porta 22 con nome utente pi e password di default (che però adesso non ricordo).

Facendo ripartire Retropie è possibile iniziare a giocare…

Permanent link to this article: http://www.andrea.rustichelli.name/installare-retropie-su-sd-per-raspberry/

Installare Recalbox su SD per Raspberry

Formattare la scheda SD con il filesystem Fat32 con il programma GParted. Ho scaricato la versione 17.12.02 di Recalbox dal sito ufficiale.
Aprire il terminale ed eseguire il comando
unxz recalbox.img.xz
per creare il file in formato .img da poco più di 2 GB.
Eseguire il comando
sudo dd if=recalbox.img of=/dev/sdb
per copiare l’immagine nella scheda SD che, in questo caso, è collegata al pc tramite un lettore di schede USB.
Al termine dell’operazione è possibile scollegare il lettore di schede SD e installare la schede nell’apposito slot del Raspberry per far partire l’installazione.

Permanent link to this article: http://www.andrea.rustichelli.name/%ef%bb%bfinstallare-recalbox-su-sd-per-raspberry/

Total Digital Experience

Ormai sappiamo tutti cos’è la “customer experience”… è una delle espressioni maggiormente utilizzate in organizzazione, marketing, gestione aziendale, organizzazione lean, ecc. ecc.
Ma ai nostri giorni la “customer experience” (è inutile affermare il contrario) deriva da una sempre maggiore informatizzazione dei processi e delle modalità di interazione tra il cliente e la società fornitrice del bene/servizio. Sia ben chiaro che la “customer experience” è anche altro… ma comunque poco altro rispetto all’informatica.

E come diceva un mio professore alla facoltà di ingegneria informatica:

“un programma o funziona o non funziona. E se un programma funziona… funziona per tutti.”

Questa frase mi ha sempre fatto riflettere, soprattutto quando si fanno interventi software volti a migliorare la “customer experience”. Trovo riduttivo infatti ricondurre uno sviluppo software al soddisfacimento dei bisogni o per aumentare la soddisfazione dei clienti. Se uno sviluppo software funziona, funziona sia per i clienti sia per i clienti interni (ovvero coloro che all’interno delle società si occupano delle attività oggetto di sviluppo). Proprio perché se uno sviluppo software viene fatto bene, con logica, con coerenza e con un obiettivo ben definito, i vantaggi non sono limitati al cliente “esterno”, ma si propagano (magari in modo ridotto) anche sui “worker” (ovvero coloro che agiscono il processo che ha beneficiato dell’intervento software). Ecco che in questo caso allora i “worker” diventano veramente clienti “interni” nel senso che anche loro beneficiano dell’intervento di evoluzione software.
Beh quindi a questo punto mi chiedo se abbia ancora senso parlare di “customer experience”. Secondo me i benefici dell’intervento devono essere riassunti in questo modo:”

“customer experience” (anche detta “internal customer experience”) + “worker experience” (anche detta “external customer experience”) = “total digital experience”

Proprio perchè l'”experience” migliora per tutti gli attori coinvolti nel processi oggetto di sviluppo e la natura dell’intervento è (ormai quasi sempre) puramente digitale.

Come ultima cosa, vorrei farvi notare come questo sia il post che, a livello mondiale, ha il maggior numero di ” (doppi apici).

Permanent link to this article: http://www.andrea.rustichelli.name/total-digital-experience/

Asrock Ion 330

E’ un po’ che volevo scrivere questo articolo per documentare l’acquisto e il successivo modding che ho fatto all’ASrock Ion 330. Ho comprato questo PC per utilizzarlo come HTPC attaccato alla mia televisione tramite cavo HDMI. Inizialmente ho usato Windows XP con sopra Media Portal e successivamente XBMC. Adesso lo utilizzo con LibreElec e Kodi come media player.

L’idea che avevo fin dall’inizio era quella di rimuovere il lettore DVD, inserire due dischi, uno per il sistema operativo e uno per contenere tutti i file multimediali da utilizzare sull’HTPC. Inoltre volevo installare una nuova ventola enorme, potente ma silenziosissima. Ecco la storia fotografica dall’unboxing fino all’assemblaggio finale del mio modding. In fondo all’articolo ho inserito anche la documentazione ufficiale in formato PDF.

Unboxing

Ecco come appare l’ASrock Ion 330. Nella parte frontale si trova il lettore DVD e il pulsante di accesione; mentre nella parte posteriore si trovano lo spinotto per l’alimentazione, le uscite audio tra cui una digitale, la porta per il cavo di rete (anche se è disponibile il modulo WiFi), 6 porte USB, pa porta HDMI, l’uscita video e l’eSata per i dischi esterni che supportano questo formato.

Lo smontaggio

Svitando le viti sul pannello posteriore è possibile togliere la parte superiore del case per avere pieno accesso al case e da lì iniziare a smontare tutti i componenti. Come detto l’idea era quella di togliere il lettore DVD in modo da fare arrivare l’aria della nuova ventola direttamente sui dischi e sui processori, aumentando il potere di raffreddamento dell’intero sistema e, al contempo, diminuire la rumorosità.

Fori di ventilazione e frontale

Purtroppo, considerando le mie scarse abilitò manuali, ho fatto un lavoro molto “hard” per creare il foro nella parte alta del case. Nel supporto interno invece ho praticato facilmente il foro utilizzando il Dremel. Nella parte alta del case ho fatto un buco in modo da poterci alloggiare una ventola abbastanza grossa appoggiata su 4 piedini in silicone in modo da azzerare completamente il rumore dovuto alle vibrazioni. Infine ho dovuto praticare un altro foro piccolo per fare passare il cavo di alimentazione della ventola e poterlo collegare alla presa presente nella scheda madre.

Il riassemblaggio

Ora non resta che riassemblare il tutto.

Permanent link to this article: http://www.andrea.rustichelli.name/asrock-ion-330/

Sebastian Raschka – Machine Learning con Python

Libro interessante ma, per quanto mi riguarda, poco pratico.

Questo libro parla delle principali tecniche di machine learning, ovvero:

  • apprendimento con supervisione
  • apprendimento senza supervisione
  • apprendimento di rafforzamento

Dopo una ampia ed esaustiva introduzione teorica, si inizia a parlare in Python e le librerie utilizzate sono:

  • NumPy
  • SciPy
  • scikit-learn
  • matplotlib
  • pandas.

Permanent link to this article: http://www.andrea.rustichelli.name/sebastian-raschka-machine-learning-con-python/

La nascita del Vero Uomo 2.0

Se in epoche passate, dove l’informatica era una materia conosciuta da pochi eletti, il Vero Uomo utilizzava sistemi Unix, adesso, dove  l’informatica è diventata una sottocategoria dell’elettronica di consumo, il Vero Uomo 2.0 utilizza (anche) Windows. E il Mangiatore di Quiche che fine ha fatto? Esiste ancora? Si, il Mangiatore di Quiche esiste ancora e usa un qualsiasi prodotto della Mela o un Tablet (di qualsiasi marca) in quanto li considera entrambi soluzioni informatiche avanzate; non si accorge che stanno uccidendo la Vera Informatica.

L’informatica di consumo (che è quella che piace ai Mangiatori di Quiche) è diventata talmente modaiola, poco affascinante e quanto di più lontano dalla Vera Informatica ci possa essere, da rendere i sistemi Microsoft (e quindi, di conseguenza, i personal computer non iQualcosa) degni di un Vero Uomo 2.0.

I veri uomini sono i veri smanettoni e adesso che Windows sta morendo a causa della sua incapacità di rimanere uguale alle versioni che ne hanno determinato il successo i veri uomini sono quelli che usano sistemi operativi alternativi… ma sempre meno di nicchia.L’importante è che il Vero Uomo ne sappia di informatica e sia uno smanettone… comprare un pc da 2.000 € solo perché è costoso non aggiunge nessun valore alla persona che rimane, di conseguenza, un Mangiatore di Quiche. Perchè la verità è che sul nuovo portatile era installata una versione del nuovissimo Windows 10 e, piuttosto di imparare ad utilizzare questo “nuovo” sistema operativo, ho preferito imparare ad utilizzare Linux Mint per le attività di tutti i giorni. E devo ammettere che mi sto adattando molto bene e il divertimento e il piacere aumentano giorno dopo giorno.

E poi vuoi mettere la sensazione di potenza quando per spegnere un pc devi scrivere sulla riga di comando (preferibilmente la BASH Shell):

shutdown -h now

Permanent link to this article: http://www.andrea.rustichelli.name/la-nascita-del-vero-uomo-2-0-2/