Tag: nerd

Retropie – Parte 2: configurare l’SSH

Uno dei motivi che mi hanno fatto propendere per l’utilizzo di Retropie al posto di Recalbox è che con Retropie è possibile attivare e configurare il protocollo SSH; in questo modo è possibile collegarsi al sistema anche da remoto con un altro pc sulla stessa rete ed operare quindi direttamente sul sistema senza dover sempre togliere e mettere la scheda microsd.

Per abilitare l’SSH è necessario andare nel menù di configurazione
“Raspi-Config” ed entrare nella voce “Interfacing options” dove c’è proprio una voce dedicata al protocollo SSH (che ovviamente è da abilitare). Per conoscere l’indirizzo IP a cui collegarsi è sufficiente entrare nel menù di configurazione e selezionare “Show IP”… semplicissimo. Ovviamente il Raspberry e il pc devono essere collegati alla stessa rete.

Una volta attivato il protocollo SSH è possibile eseguire, ad esempio, PuTTYSSH Client e inserire l’indirizzo IP del nostro Rasbperry con installato Retropie… una volta aperta la sessione SSH inserire username (pi) e password (raspberry) ed eccoci alla console…

Ovviamente appena si inizia a lavorare direttamente con il protocollo SSH diventa chiaro che dover digitare sempre la password dell’utente root non è affatto pratico. Per questo motivo è necessario configurare il sistema in modo che l’utente root venga abilitato ad operare con tale protocollo. In questo modo è possibile impartire i comandi (o operare dalla sessione grafica) direttamente con i permessi di root senza dover eseguire il comando sudo. Ma vediamo come fare modificando opportunamente il file /etc/ssh/sshd_config.

sudo nano /etc/ssh/sshd_config

modificare la riga

 PemitRootLogin without-password

in modo che diventi

 PermitRootLogin yes

Salvare il file premendo Ctrl X e confermare la sovrascrittura del file. A questo punto è possibile impostare la password per l’utente root con il comando:

sudo passwd root

inserire la nuova password e confermarla nuovamente.

Per rendere effettiva la modifica è necessario riavviare il sistema o tramite l’interfaccia grafica oppure con il comando:

sudo shutdown -r now

Le modalità di collegamento, una volta abilitato il protocollo SSH, sono molteplici:

  • è possibile utilizzare PuTTY SSH Client
  • è possibile selezionare File -> Connetti al server dal window manager di Cinnamon
  • è possibile creare una sessione SSH con Remmina
Un esempio di sessione SSH configurata con Remmina

Permalink link a questo articolo: http://www.andrea.rustichelli.name/retropie-parte-2-configurare-lssh/

Retropie – Parte 1: l’installazione

Decido di fare una installazione di Retropie sul mio Raspberry partendo da 0 e cercando di modificare e personalizzare l’installazione dei vari emulatori e dei giochi.

Questa volta ho scaricato l’immagine retropie-4.5-rpi2_rpi3.img.gz dal sito ufficiale e l’ho decompressa. Questa volta per copiare l’immagine su scheda micro SD ho deciso di utilizzare il programma già presente nella distro Linux Mint anziché utilizzare il comando dd.

Dopo aver copiato l’immagine sulla scheda SD è necessario inserirla nel Raspberry e avviarlo per completare l’installazione. Al termine dell’installazione e al primo riavvio, EmulationStation rileva l’eventuale gamepad o joystick collegato al Raspberry e presenta subito la procedura guidata per la configurazione in modo da poter utilizzare subito il nuovo sistema.

Consiglio: quando si configura il joypad è opportuno configurare il tasto Hotkey con il tasto Select; in questo modo premendo contemporaneamente il tasto Select e il tasto Start si esce da ogni gioco.

Se si hanno problemi con l’audio collegando il Raspberry al televisore utilizzando un cavo HDMI (e quindi sfruttando la funzionalità di “pass-through”) è necessario togliere il commento dalle seguenti righe presenti nel file /boot/config.txt eseguendo la combinazione di comandi:

sudo nano /boot/config.txt

e togliere il commento dalle righe (ovvero togliere il carattere iniziale #)

hdmi_drive=2
hdmi_force_hotplug=1
hdmi_force_edit_audio=1

riavviare il sistema.

Consiglio: se dopo l’installazione del sistema Retropie funziona correttamente, NON FARE (e ripeto NON FARE) nessun aggiornamento del sistema. Può solo rendere il sistema più instabile.

Permalink link a questo articolo: http://www.andrea.rustichelli.name/retropie-parte-1-linstallazione/

Ridimensionare, rinominare e aggiungere un watermark con uno script BASH (zh_rrw.sh)

Chi ha un sito sa bene che caricare le immagini è sempre un mezzo dramma.

Occorre ridimensionare le immagini perchè le attuali macchine fotografiche o i cellulari e i tablet fanno foto grandi come lenzuoli e con pesi (in MB) che non sono sempre comodi da uploadare (e da visualizzare sul sito).

Poi bisogna rinominare i file in modo da gestirli meglio… ma se i file sono molti diventa una scocciatura. Si possono usare programmi per il “rename” massivo, ma non sono sempre pratici.

Poi è carino aggiungere un watermark. E non sempre i programmi che usiamo per rinominare i file in modo massivo hanno questa funzionalità.

Per gestire le foto del mio sito usavo questa strategia:

  • rinominavo le foto a mano (con il tasto funzione F2 in ambiente Linux);
  • ho installato un plugin su WordPress in modo da ridimensionare la foto appena caricata in modo da ridimensionarla secondo una certa dimensione massima
  • poi ho installato un altro plugin su WordPress in modo da aggiungere automaticamente un watermark all’immagine. Il problema è che la dimensione del testo del watermark era fissa e non dipendeva dalle dimensioni dell’immagine caricata. Quindi a volte la scritta era microscopica, mentre altre volte enorme

Poi cercando in internet una soluzione migliore (e che magari mi facesse smacchinare un po’) ho trovato ImageMagick e tutti i suoi comandi per realizzare uno script da eseguire. Di seguito trovate il codice dello script perfettamente funzionante e con i commenti delle principali funzioni.

#!/bin/bash
echo "******************************************"
echo "* Script per ridimensionare, rinominare  *"
echo "* e aggiungere un watermark alle foto    *"
echo "* in modo massivo.                       *"
echo "*   Andrea Rustichelli - Dicembre 2019   *"
echo "*      www.andrea.rustichelli.name       *"
echo "******************************************"

echo "Inserisci il nome per i nuovi files..."
read file_name
echo "Ok, procedo a rinominare i file in: " $file_name

count=0
#scorre tutti i file .jpg presenti nella cartella dello script
for each in *.jpg
 do
  echo "Inizio elaborazione file "$each"..."
  #incrementa il contatore da utilizzare come suffisso del nome del file
  count=`expr $count + 1`
  echo $count
  #il contatore viene convertito su 3 cifre in modo da poter ordinare fino a 999 immagini con lo stesso nome
  count3d=$(printf "%03d" $count)
  #viene composto il nome del file di output
  file_out="$file_name"_"$count3d".jpg
  
  #questo comando di ImageMagick converte il file in modo che la dimensione massima del lato più lungo
  #sia impostato a 1024 pixel... il lato più corto viene ridimensinato di conseguenza per mantenere le
  #proporzioni dell'immagine
  convert -resize 1024x1024\> "$each" "$file_out"
  #questo comando di ImageMagick serve per creare il watermark con la scritta "andrea.rustichelli.name"
  #nalla parte bassa dell'immagine ridimensionata
  convert "$file_out" -pointsize 35 -fill white -undercolor '#00000080' -gravity South -annotate +0+5 'andrea.rustichelli.name' "$file_out"

  #il file originale viene spostato nella sottocartella chiamata "original_file", mentre il 
  #file di output viene spostato nella nella sottocartella chiamata "thumb"
  mv "$each" ./original_file
  mv "$file_out" ./thumb
 done
echo "Elaborazione terminata!"
exit

Permalink link a questo articolo: http://www.andrea.rustichelli.name/ridimensionare-rinominare-e-aggiungere-un-watermark-con-uno-script-bash-zh_rrw-sh/

Estrazione dati da vecchi HDD: da SATA a USB

L’opera di recupero dati prosegue… ma considerato che adesso mi sono rimasti solamente dei dischi con interfaccia SATA sia per l’alimentazione sia per i dati, ho deciso di fare un acquisto incauto su Ebay… un adattatore da SATA a USB (doppia USB per garantire una maggiore stabilità) dall’incredibile costo di € 9,90.

Oltre che per questa attività di recupero dati su HDD da 3.5 pollici sarà molto comodo per gestire come unità esterne i miei dischi da 2.5 pollici (ricavati da vecchi pc portatili).

Permalink link a questo articolo: http://www.andrea.rustichelli.name/estrazione-dati-da-vecchi-hdd-da-sata-a-usb/

Estrazione dati da vecchi HDD: il coltellino svizzero

Coltellino svizzero perchè è un tool con tutti gli standard in un unico strumento, ma in realtà, a differenza del coltellino originale, è uno strumento ben poco compatto e portatile. Ma andiamo con ordine.

Ho voluto riesumare tutti i miei vecchi dischi fissi (o HDD o ancora HD) per vedere se riesco ad estrarre i dati cancellati nel corso delle varie formattazioni usando due strumenti come TestDisk e PhotoRec.

Sul mio vecchio computer fisso, nome in codice Giove, erano presenti 3 dischi fissi di dimensioni decenti, che però oggigiorno sembrano completamente sottodimensionati. Avevo 3 dischi da 3.5 pollici da 10, 120 e 320 GB (potrei anche sbagliarmi di qualche GB, ma la sostanza non cambia). Nel disco da 120 GB era installato il sistema operativo (il disco ha ospitato molteplici sistemi operativi, ma quelli ufficiali sono stati Windows 98 e Windows XP) e in una seconda partizioni i dati. Nel disco da 320 GB c’era una unica partizione con i dati “grossi” (musica, film e file di backup), mentre il disco da 10 GB (denominato Limbo) era utilizzato per stoccare i file in attesa di lavorazione.

Bene ciò premesso ho rispolverato un vecchio dispositivo acquistato alla Fiera dell’Elettronica di Gonzaga che permette di alimentare e di collegare i dischi alla porta USB di un computer per poter accedere ai dati contenuti sul disco come se fosse una qualsiasi unità rimovibile.

L’alimentatore termina con un connettore Molex (per alimentare i dischi più vecchi) ma è presente anche una prolunga che permette di alimentare anche i dischi con il connettore SATA (di più recente introduzione).

Invece il cavo USB da collegare al computer si collega ad un adattatore che presenta due attacchi IDE (o ATA) ma che presenta anche una porta per collegarci un cavo dati SATA nel caso si volesse interfacciare un disco con questo standard.

Permalink link a questo articolo: http://www.andrea.rustichelli.name/estrazione-dati-da-vecchi-hdd-il-coltellino-svizzero/

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.

Permalink link a questo articolo: 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

Permalink link a questo articolo: 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

Permalink link a questo articolo: 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")

Permalink link a questo articolo: 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

Permalink link a questo articolo: 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"]

Permalink link a questo articolo: 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.

Permalink link a questo articolo: 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”

Permalink link a questo articolo: 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.

Permalink link a questo articolo: 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.

Permalink link a questo articolo: http://www.andrea.rustichelli.name/musicbrainz-picard/