[TUTORIAL] Gestione via browser dell’upload dei file sugli ebook reader

Può capitare di dover caricare un ebook reperito in rete sul proprio ebook-reader e questo è il mio modo per gestire il problema.

Banalmente è possibile uplodare un file collegando il dispositivo tramite la porta Usb al computer, ma non sempre si ha sottomano il cavetto giusto… o magari si è a letto con l’improvvisa voglia di iniziare a leggere il libro che si è trovato qualche giorno prima…
IT saves my lazyness!

Il Kindle come il Kobo e pure altri ebook-reader, forniscono da sempre un browser talmente scarno che in realtà nessuno si guarda bene da utilizzare, ma è a parer mio, la via più semplice per caricarci sopra gli ebook. Poi per rendere più sicura e veloce la procedura, da qualche tempo mi sono creato un servizio cloud privato sul mio Raspberry Pi.

Ho installato e configurato un server LAMP, quindi ho pubblicato una cartella in cui salvare gli ebook che trovo in rete. Tramite un paio di script PHP viene creata la pagina Web tramite la quale si accede alle risorse via browser. La sicurezza è garantita dal fatto che il webserver è raggiungibile al momento solo dalla mia rete domestica.

Le istruzioni per installare correttamente Apache2 e PHP sul Raspberry Pi si trovano facilmente in rete, ecco invece di seguito il file index.php che:

  • elenca, se ce ne sono, tutti i file (nel mio caso i .mobi ovvero gli ebook) presenti nella cartella /libri;
  • ogni ebook è visualizzato tramite link pronto per il download;
  • presenta il pulsante per la ‘pulizia’ della cartella;
  • la funzione ‘grassetto’ serve solo per ingentilire la pagina web.

Ecco come si presenta la pagina richiamata nel browser: Una volta scaricati i file è possibile fare pulizia tramite il pulsante “Delete All Mobi” che esegui lo script delete.php:

 

  • elimina tutti i file .mobi presenti nella cartella /libri;
  • viene mostrato il conteggio dei file processati.

Ecco come si presenta la pagina richiamata nel browser:

 

[Python] Calcolo giorni tra due date

Per calcolare il numero di giorni tra due date usando Python possiamo fare affidamento sul modulo datetime che oltre a permetterci di manipolarne la formattazione e l’output è possibile utilizzare anche per operazioni matematiche tra elementi temporali.

from datetime import datetime
date_format = "%d/%m/%Y"
ask_a = input('Inserisci prima data (dd/mm/aaaa) o premi Enter per oggi:\n')
if not ask_a:
   ask_a = datetime.now().strftime(date_format)
   print ("\033[FOggi:",ask_a)
ask_b = input('Inserisci seconda data (dd/mm/aaaa):\n')
try:
    a = datetime.strptime(ask_a, date_format)
    b = datetime.strptime(ask_b, date_format)
    if a > b:
        delta = a - b
    else:
        delta = b - a
    print ('La differenza tra le due date è di',delta.days,'giorni.')
except:
    print('Rilevati problemi con formattazione dati inserite (dd/mm/aaa)')

Ma vediamo meglio nel dettaglio:

  • (Riga 1) importiamo il modulo datetime;
  • (Riga 2) definiamo la formattazione delle date (gg/mm/aaaa) ovvero in Python “%d/%m/%Y”;
  • (Righe 3-6) immettiamo la data di partenza (di default sarà presa in considerazione la data corrente che sarà opportunamente mostrata a schermo);
  • (Riga 7) immettiamo la seconda data;
  • (Righe 8-14) proviamo a calcolare la differenza in giorni tra le date fornite come stringhe trasformandoli in oggetti data e quindi sottraendo sempre alla più lontana quella più vicina in maniera da ottenere sempre un valore positivo;
  • (Riga 15)presentiamo a schermo il valore del calcolo effettuato;
  • (Righe 16-17) nel caso di problemi rilevati durante il suddetto calcolo informare circa l’errore nella formattazione delle date inserite.

[Python] Traduttore automatico di sottotitoli

La mia smodata passione per le serie tv made in USA mi ha iniziato al binge watching molto prima che ne venisse coniato il termine per diventare una moda. Ricordo ancora il week end di una decina di anni fa, passato a ‘recuperare’ su internet gli episodi delle prime tre stagioni di «Battlestar Galactica» poco prima della trasmissione in America della quarta stagione. Di lì ho scoperto che non mi piaceva attendere qualche anno prima di poter guardare una serie tv che mi interessava e che internet da questo punto di vista era una notevole risorsa se si era disposti ad abituare l’occhio a non perdersi nessuna scena sbirciando contemporaneamente i sottotitoli sullo schermo (ancora tante grazie Italiansubs!).


Ora che i sottotitoli in italiano si fa più fatica a trovarli, un po’ per gioco e un po’ per utilità, ho pensato di creare uno script in Python che traduce un file di sottotitoli in inglese nel corrispettivo in italiano utilizzando la libreria googletrans (link) che sfrutta l’API di Google Translate. Il risultato non sarà dei più corretti ma IMHO abbastanza accettabile per godersi un episodio della propria serie tv preferita.


Ingredienti:

    • python 3
    • libreria googletrans (per la traduzione)
    • librerie sys, os (per la gestione dei file)
    • libreria timeit (per computare le prestazioni)

Per installare la libreria avendo a disposizione l’utility PIP è sufficiente digitare il seguente comando:

pip install googletrans

Analizziamo le parti principali del sorgente:

Innanzitutto importiamo le librerie che ci necessitano:

import sys, os
from googletrans import Translator
from timeit import default_timer as timer

Memorizziamo in una variabile il tempo iniziale che ci servirà per calcolare successivamente le prestazioni dello script:

start = timer()

E inizializziamo il traduttore sull’API pubblica di Google Translate:

translator = Translator(service_urls=[
      'translate.google.com',
      'translate.google.it',
    ])

Il progetto prevede di dare in pasto al traduttore le frasi contenute in un file in formato .srt contenente i sottotitoli in inglese, strutturalmente fatto in questo modo:

Per quanto riguarda il nome del file da tradurre lo passeremo come argomento nell’istruzione di esecuzione del programma. Il nome del file prodotto con i sottotitoli tradotti in italiano sarà generato conseguentemente aggiungendo il suffisso “_tradotto”. Viene anche controllata l’esistenza di un eventuale precedente file di traduzione avente lo stesso nome di quello in produzione e nel caso verrà cancellato.

try:
sourcefile = sys.argv[1]
resultfile = sys.argv[1].replace('.srt', '')+'_tradotto.srt'
except:
sourcefile = "sottotitolo.srt"
resultfile = sourcefile.replace('.srt', '')+'_tradotto.srt'

if os.path.isfile(resultfile) == True:
os.remove(resultfile)

Nessun problema ad aprire il file in questione e scomporre le righe di testo in elementi di una lista. Inoltre già che ci siamo cancelliamo gli eventuali inutili spazi vuoti in testa e in coda a ciascuna riga con il metodo strip():

with open(sourcefile) as f:
    content = f.readlines()
content = [x.strip() for x in content]

Ovviamente al nostro traduttore dovremo passare ‘solo’ i testi e non gli altri elementi utili alla renderizzazione a video dei sottotitoli. Inoltre al traduttore dobbiamo passare delle frasi intere, anche se nel file dovessero risultare ‘spezzate’ su più righe.

Processiamo ciascuna riga della lista creata e scartiamo quelle righe (senza eliminarle perché ci occorreranno poi per scrivere correttamente il file .srt dei sottotitoli tradotti) contenenti un numero intero (cioè il numero del sottotitolo) piuttosto che la durata del sottotitolo (che Python vede comunque come una stringa di testo da qui la trovata di pulire la riga dal segno di separazione (“:”) e di considerarne solo i primi 5 caratteri, in modo che ad esempio la riga “00:00:03,886 –> 00:00:07,961” venga computata come “00000” che Python riconosce giustamente come numero e quindi ce la fa scartare:

for item in content:
    count += 1
    if item.isdigit() == False:
        try:
            control = item.replace(":","")
            part = control[0:4].isdigit()
        except:
            part = False

Per risolvere il problema delle frasi spezzate su più righe come abbiamo ad esempio in questo caso:

Dove per ottenere una traduzione corretta occorre passare al traduttore una corretta frase interaBut you won’t fix the real problem” e non due righe separate come si presentano nel file. Si andrà quindi a tradurre quanto memorizzato in una lista ‘volatile’ solo dopo aver incontrato un salto di riga vuoto come questo:

Di seguito la mia soluzione che memorizza il testo da tradurre nella stringa “datradurre” che viene passata al traduttore istanziando l’oggetto translations da cui ricaviamo il testo tradotto quando la variabile trigger ‘accio’ processa una riga vuota. Ovviamente occorre tenere conto che sebbene al traduttore la frase di due righe verrà fornita in una riga sola, al momento della ricostruzione del sottotitolo tradotto la frase dovrà essere nuovamente divisa se troppo lunga per non perdere in leggibilità del sottotitolo: la frase sarà ‘spezzata in due righe dovesse essere composta da più di 5 parole e comunque da più di 40 caratteri (esclusi i segni ‘speciali di renderizzazione). Dopo aver passato la stringa al traduttore questa viene azzerata, pronta per le righe successive. Il tutto viene memorizzato in una lista denominata ‘traduzione’ a cui si aggiungeranno man mano tutte le righe processate, comprendenti il numero del sottotitolo, i tempi di inizio e fine visualizzazione e la traduzione ottenuta (o il testo originale se il programma non è riuscito a tradurre).

       if part != True:
            datradurre = datradurre +' '+item
            datrad_non.append(datradurre)
            accio = ("_______"+str(item)+"________________>")
            if accio == "_______________________>":
                try:
                    translations = translator.translate(datradurre, src='en', dest='it')
                    trad = translations.text
                    parole = 0
                    a = trad.split(" ")
                    for i in a:
                        if (i!=" " and i!="<i>" and i!="</" and i!="i>" and i!="-" and i!="..."):
                            parole=parole+1
                    if parole >5 and len(trad) >40:
                        frase = range(6,parole)
                        primariga = str(a[0])+' '+str(a[1])+' '+str(a[2])+' '+str(a[3])+' '+str(a[4])+' '+str(a[5])
                        secondariga = ''
                        for x in frase:
                            secondariga = secondariga+' '+str(a[x])
                        traduzione.append(primariga)
                        traduzione.append(secondariga[1:])
                        traduzione.append(item)
                        TRcount += 1
                    else:
                        traduzione.append(trad)
                        traduzione.append(item)
                        TRcount += 1
                except:
                    for x in datrad_non:
                        traduzione.append(x)
                    traduzione.append(item)
                    NOcount += 1
                datradurre = ""
                datrad_non.clear()
        else:
            traduzione.append(item)

Dopo aver processato tutte le righe si può procedere a generare scrivendo riga per riga il file .srt con i sottotitoli tradotti:

with open(resultfile, 'a') as f:
    for item in traduzione:
        f.write(item+'\n')

Possiamo calcolare a questo punto il tempo di esecuzione in secondi del programma:

end = timer()
tempo = "{0:.2f}".format((end - start))

E infine visualizzare le statistiche raccolte con i vari contatori alimentati durante il processo di traduzione:

print('\n')
print ('Totale righe _________ '+str(count))
print ('Totale traduzioni ____ '+str(TRcount))
print ('Problemi traduzioni __ '+str(NOcount))
print ('Totale tempo _________ '+tempo+'s')
print('\n')

Non sarà lo script meglio scritto, ma in un tempo ragionevole (circa 300 secondi per processare un episodio di tre quarti d’ora) riesce a sfornare dei sottotitoli in italiano discretamente accettabili.

Codice sorgente completo disponibile su GITHUB (link).

[Tutorial domotica] Sonoff + Python = punto luce intelligente

La possibilità di incrementare le prestazioni dell’interruttore wifi economico Sonoff della iTead grazie al firmware della Tasmota che, tra l’altro, lo svincolano dall’uso tramite App proprietaria, mi ha fatto venire l’idea di far accendere al Raspberry Pi nella mia stanza un punto luce in maniera automatica e magari intelligente (è la domotica baby!)

  • Livello di difficoltà: medio/basso
  • Costoestremamente ridotto (~10 €)

Ingredienti:

  • Sonoff Basic (acquistabile su Amazon.it)
  • saldatore e cavetti prototipazione
  • conoscenza di Python
  • spina elettrica maschio
  • spina elettrica femmina
  • filo elettrico bipolare q.b.
  • server controllo (es. Raspberry Pi)

Procedimento:

  • Innanzitutto occorre programmare il Sonoff con il firmware Tasmota. Per farlo ci sono diversi metodi, tutti magnificamente descritti nella relativa Wiki. Per conto mio non ho avuto fortuna con l’installazione via OTA: il mio interruttore montava un firmware di fabbrica troppo recente, risultato incompatibile con questa modalità di upload. Scartato il metodo via adattatore USB/TTL (che non trovo più nel cassetto e per il quale avevo trovato quest’ottima guida in italiano) mi sono arrangiato via Arduino Uno (e un saldatore) che ho sfruttato per trasferire il nuovo firmware dal PC al Sonoff, seguendo questa chiarissima guida in italiano. Cmq in caso si può fare affidamento sulla community di smanettoni che potete trovare in questo Forum o in questo canale Discord. Infine per chi proprio non se la sente, consiglio di farsi un giro su Ebay e di acquistare un dispositivo già pronto e funzionante con firmware Tasmota pre-installato.
  • Collegamenti elettrici. Ho utilizzato un cavo bipolare tipo H03VVH2 2×0,75mm, una spina elettrica maschio per il collegamento alla rete elettrica e una spina elettrica femmina per il collegamento al punto luce. Ovviamente la lunghezza dei cavi deve essere predisposta secondo necessità.
    ATTENZIONE CON LA CORRENTE 220V NON SI SCHERZA!!!
  • Il software di controllo. Il firmware Tasmota consente già di programmare (tramite la funzione timer) l’orario di accensione e di spegnimento del carico collegato all’interruttore, ma io voglio qualcosa di più intelligente.
    Voglio che il punto luce si accenda in mia presenza e al verificarsi di precise condizioni. Quindi ho creato uno script in Python (che ho chiamato myTwilight) che gira avviato via crontab sul Raspberry Pi. Lo script completo è disponibile sulla mia pagina Github e fa le seguenti cose:


    • Controlla che il Sonoff sia effettivamente operativo:

      • def pingSonoff(): ##Test ping SonOff
            var = os.popen("ping sonoff -c 1").read()
            l = var.index('received')
            l = l-2
            if var[l] == '1':
                return 'ON'
            else:
                return 'OFF'
        

      Ho assegnato l’hostname ‘sonoff’ al mio interruttore così da non essere costretto, per contattarlo, a ricordare il suo indirizzo IP.


    • Controlla via API l’ora del crepuscolo del giorno preciso (calcolata sulle coordinate geografiche della mia stanza);

      • def tramonto(lat, lng): ##Orario calcolato secondo GMT (senza ora legale/ora solare)
            request = requests.get("http://api.sunrise-sunset.org/json?lat="+lat+"&lng="+lng+"&formatted=0")
            return datetime.strptime(str(request.json()['results']['sunset'][11:16]), '%H:%M')
        

      Le coordinate geografiche della stanza le ho ottenute facilmente via Google Maps,  e la richiesta all’API del sito “sunrise-sunset.org” è gratuito e molto semplice da utilizzare, purtroppo il valore orario restituito è calcolato sull’ora GMT. Ho quindi dovuto calcolare l’offset dell’ora legale con una richiesta ad un’altra API di “worldtimeapi.org”:

      • def oralegale(): ##controllo ora legale
            request = requests.get("http://worldtimeapi.org/api/timezone/Europe/Rome")
            utc_offset = str(request.json()['utc_offset'])
            return int(utc_offset[2])
        

      E quindi l’ora del tramonto risulta essere così determinata (richiamando le suddette funzioni):

      • tramonto = tramonto(lat, lng)
        ora_tramonto = str(int(str(tramonto)[11:13])+oralegale())+':'+str(tramonto)[14:16]
        

    • Controlla la situazione meteo (indice copertura delle nuvole e quindi situazione luminosa);

      • def clima(lat, lng, api_key):
            url = "https://api.darksky.net/forecast/"+api_key+"/"+lat+","+lng+"?units=si&lang=it&exclude=daily,hourly,alerts,minutely"
            request = requests.get(url)
            print "Situazione clima: " + request.json()['currently']['summary']
            cloud = request.json()['currently']['cloudCover'] # controllo indice copertura cielo (da 0 a 1, da sereno a molto coperto)
            if  cloud > 0.50:
                if cloud > 0.75: 
                    return -600 # molto coperto
                else:
                    return -300 # coperto
            else:
                if cloud < 0.25:
                    return 0    # sereno
                else:
                    return 750  # molto sereno
        

      La suddetta funzione si è resa necessaria perché voglio che il punto luce si accenda anticipando l’ora del tramonto di qualche minuto nel caso il cielo risulti essere particolarmente coperto e quindi la stanza sia particolarmente buia, piuttosto che rimandare l’accensione di qualche minuto in caso di cielo sereno. Il sito “darksky.net” mette a disposizione via API (gratuitamente fino al limite di 1000 richieste giornaliere) diversi parametri meteorologici calcolati sulla base delle coordinate geografiche tra le quali l’indice ‘cloudCover’ che da 0 a 1 mostra lo statodella nuvolosità del cielo.


    • Controlla se sono presente nella stanza (quindi controlla se almeno uno dei due pc che solitamente utilizzo risultano accesi);

      • def ping(): ##Check presenza (attraverso ping PC e Laptop)
            var1 = os.popen("ping 192.168.1.124 -c 1").read()
            l1 = var1.index('received')
            l1 = l1-2
            if var1[l1] == '1':
                stato1 = 'OK'
            else:
                stato1 = 'NO'	
            var2 = os.popen("ping 192.168.1.111 -c 1").read()
            l2 = var2.index('received')
            l2 = l2-2
            if var2[l2] == '1':
                stato2 = 'OK'
            else:
                stato2 = 'NO'	
            if stato1 == 'OK' or stato2 == 'OK':
                return 'OK'
            else:
                return 'NO'
        

      Anche in questo caso utilizzo il ping per verificare se uno dei due PC che di solito utilizzo risultano accesi, determinando così l’effettiva mia presenza in stanza.


    • La funzione ‘main’ controlla se tutte le condizioni sono soddisfatte:

      • def main(ora, delay):
            diff = int((max(ora) - min(ora)).total_seconds())
            if ora[1] > ora[0] and diff >= delay:
                if pingSonoff() == 'ON':
                    if ping() == 'OK':
                        print 'Accendo Sonoff'
                        powerOn()
                    else:
                        print 'Sole tramontato, ma non rilevo presenza attiva...'
                else:
                    print 'Sole tramontato, ma Sonoff non operativo...'
            else:
                print 'Ancora troppo presto...'
        

      Ovviamente nel caso in cui non sussistano le condizioni il programma prosegue con questo loop:

      • while count <24:
            print str(count)+' - Check: '+strftime("%d-%m-%Y %H:%M:%S", localtime())
            adesso = datetime.strptime(strftime("%H:%M", gmtime()), '%H:%M')
            ora = [tramonto,adesso]
            delay = clima(lat, lng)
            main(ora, delay)
            print '\n'
            count += 1
            time.sleep(750) #loop ogni 15'
        

      Il programma procede quindi per un numero massimo di 24 volte, a distanza di 15 minuti, a controllare le condizioni impostate. Facendo partire il programma alle 16:00 il numero di loop è sufficiente per coprire i possibili scenari.


    • … e nel caso accende il punto luce eccitando il relé del Sonoff:

      •  
        def powerOn(): ##attivazione Sonoff
            r = requests.get("http://sonoff/cm?cmnd=Power%20ON")
            print(r.content)
            sys.exit()
        
    • Una volta provveduto ad accendere il punto luce lo script Python ha terminato la sua funzione quindi viene terminato.

Considerazioni finali:

  • Con poca spesa e un po’ di ingegno ho centrato il mio obiettivo: avere un interruttore intelligente in grado di accendere un punto luce al verificarsi di determinate condizioni (presenza, orario e luminosità).
  • Una peculiarità del Sonoff Basic è quella di consumare veramente poco (circa 0,70-0,80W o qualcosina in più quando il relè è eccitato), inoltre è possibile ridurne ‘sensibilmente’ i consumi impostando il valore Sleep del firmware Tasmota da 50 a 200 espresso in millisecondi. Inoltre ho spento le funzionalità MQTT che di fatto non utilizzo (tramite il comando PowerRetain)..
  • Sempre via console ho disattivato l’accensione del led presente sul Sonoff (comando LedPower e LedState) che quindi ora lampeggia brevemente solo al momento in cui si connette alla rete elettrica segnalando la ricerca della connessione Wifi.
  • La presenza del bottoncino sulla parte alta della copertura di plastica del Sonoff mi consente di accendere e di spegnere manualmente il punto luce.
  • Una prossima versione del programma di controllo, a cui sto già pensando, prevede di modificare il rilevamento di presenza integrando funzionalità via bluetooth (in questo caso andrei a rilevare o meno la connessione con il mio smartphone).
  • Ho già pensato/realizzato un’integrazione con il client Telegram che è già in esecuzione sul mio Raspberry Pi così da ricevere comunicazioni sul funzionamento del Sonoff.
  • Lo script Python completo è disponibile sulla mia pagina Github insieme agli altri progetti.
  • Ho già ordinato un Sonoff Dual (quindi in grado di comandare due uscite) da collegare alla tapparella motorizzata che si abbasserà e si alzerà a seconda delle condizioni da me impostate…

[SOLVED] The Adventure Pals (black screen on start problem!)

“The Adventures Pals” è il gioco preferito al momento dalla mia nipotina che lo ha installato lo scorso mese con l’app di Twitch (credo fosse un gioco in regalo/bundle con il Prime) su un Pc con Windows 10.

L’altro giorno è successo che all’avvio il gioco (dopo i titoli e la raccomandazione di usare il gamepad) non si avviasse, rimanendo fermo su uno schermo nero (la musica si sente però!!!). Non c’è stato verso di sistemare la cosa: né reinstallando il gioco (disinstallandolo completamente, quindi riscaricandolo da capo) e nemmeno l’update dei driver della scheda video ha risolto il problema.

Nei vari forum (Steam, Redditt, ecc…) il problema dell’avvio fermo sullo schermo nero è stato segnalato più volte nelle ultime settimane, ma sembra che nessuno ne sia venuto ancora a capo…

Ho pensato quindi che il problema potesse risiedere in qualche file di configurazione corrotto e ho quindi cercato tra i file utente relativi al gioco.

Infine è bastato procedere nel seguente modo, ovvero cancellando la cartella relativa a “The Adventures Pals” nel profilo dell’utente:

  • cliccare WIN+R e aprire la cartella %APPDATA%\..\LocalLow\Massive Monster\The Adventure Pals:
  • se non si vogliono perdere i salvataggi delle partite in corso, copiare sul desktop il contenuto della cartella “user-1/saves“, altrimenti saltare questo passaggio:
  • cancellare la cartella “\The Adventure Pals”;
  • avviare normalmente il gioco e iniziare una partita salvandola subito;
  • nel caso aveste salvato i salvataggi, chiudete il gioco quindi ricopiate i file precedentemente salvati nella cartella “\saves” che nel frattempo il gioco avrà ricreato durante l’avvio.

[Python] Cercare un server proxy (SOCKS5)

Può capitare di avere bisogno di utilizzare all’interno del proprio codice un servizio proxy SOCKS5 per rendere un po’ più anonima la navigazione nel web senza utilizzare una più sicura, ma più lenta VPN. Personalmente risolvo utilizzando questa funzione in Python che ho realizzato sfruttando i moduli requestBeautifulSoup che richiama la pagina dedicata del portale Spys.one, legge la lista dei server disponibili e ritorna l’IP del server con la relativa porta di utilizzo.

Di seguito il codice pronto all’utilizzo:

import requests
from bs4 import BeautifulSoup

def cercaProxy():
    ip = ''
    porta = ''
    proxy = ''
    t_data = {}
    
    url = "http://spys.one/en/socks-proxy-list/"
    r = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'})
    soup = BeautifulSoup(r.content, 'lxml')
    cercaip = soup.find_all('font', attrs={'class' : 'spy14'})
    work = cercaip[1].text
    legenda = soup.find_all('script', attrs={'type' : 'text/javascript'})
    discover = (legenda[1].text).split(';')
    
    for brace in discover:
        if brace == '':
            continue
        tar = brace.split('=')
        if tar[1][1] == '^':
            t_data.update({tar[0]:tar[1][0]})
            
    if work.find('document.write'):
        start_index = work.find('document.write')
        ip = work[:start_index]
        plus_index = work.find('"+(') + 2
        porta_tmp = work[plus_index:-1]
        leggiporta=porta_tmp.split('+')
        for item in leggiporta:
            rar = item.split('^')
            itm_porta = str(t_data.get(rar[0][1:], 'n'))
            porta = porta + itm_porta
            
    proxy = ip + ':' + porta
    print 'Proxy ip: ' + proxy
    return proxy

[Tutorial] Come controllare lo stato di salute di un’unità SSD in Linux

Uno dei componenti che ‘lavorano’ di più nel nostro computer e che consideriamo meno è l’hard disk. Ci accorgiamo della sua esistenza magari quando finiamo lo spazio disponibile o se siamo più sfortunati quando si rompe.

Negli ultimi anni i ‘vecchi’ dischi ferromagnetici sono stati sostituiti con i più performanti dischi a stato solido (SSD), dimenticandoci di operazioni diventate obsolete come la deframmentazione dei dati.

Una tecnologia che è sempre valida e la S.M.A.R.T. (Self-Monitoring, Analysis and Reporting Technology) ovvero del monitoraggio dei dischi per rilevare e fornire diversi indicatori di affidabilità, nella speranza di anticipare i malfunzionamenti. Essenzialmente, i malfunzionamenti degli hard disk sono di due tipi:

  • quelli prevedibili, specialmente dovuti all’usura o all’invecchiamento, che si manifestano gradualmente.
  • quelli imprevedibili, che accadono improvvisamente e senza preavviso, come nel caso di un componente elettronico che si brucia.

Il monitoraggio può predire circa il 60% dei possibili malfunzionamenti. S.M.A.R.T. ha lo scopo di avvisare l’utente o l’amministratore di sistema che il disco rigido sta per guastarsi, in modo che questi abbia il tempo di copiare i dati su un altro dispositivo di archiviazione (fonte Wikipedia).

Esistono diversi tool software che permettono di monitorare lo stato di salute dei dischi installati nel nostro sistema. Quello che uso abitualmente sulla mio workstation Ubuntu Linux è smartctl. Continua a leggere

[Tutorial – Nostalgia] Prato Fiorito su Windows 10 e non solo…

Giusto oggi che è giornata di aggiornamenti e novità per il sistema operativo Windows di casa Microsoft, mi è venuta nostalgia di quei ‘giochini‘ che in gioventù 😉 mi hanno visto impegnato a perdere un sacco di tempo davanti al PC.

A partire da Win 3.1 e fino a Windows 7 ci si poteva infatti trastullare sul PC, con alcuni giochi passatempo quali SolitarioPrato Fiorito, 3D Pinball e Hearts che pur non avendo niente a che vedere alle performance grafiche di quelli che girano al giorno d’oggi su di un qualsiasi dispositivo mobile,riuscivano a tenerci incollati per delle bellissime ore davanti al monitor del nostro computer.

Gli utenti odierni di Windows 8 o meglio di Windows 10 utilizzano magari un sistema operativo ‘moderno e funzionale’, ma che purtroppo, tra le tante cose, ha eliminato nella sua evoluzione, questi fantastici giochini.

Vi va di recuperarli e magari piangere per la nostalgia?

Il retro-game Microsoft che voglio riproporvi è proprio Prato Fiorito, un campo virtuale composto da numeri nel quale dobbiamo stare attenti a non fare esplodere le mine. Lo scopo e scoprire tutte le mine senza farle scoppiare aiutandosi con i numeri che indicano quante caselle adiacenti ne toccano una.

Ecco le istruzioni da seguire per iniziare a giocare:

  • Scaricate il File .zip da questo link alla mia repository;
  • A download ultimato, scompattate la cartella ed il gioco sarà subito disponibile avviandolo con MineMaster.exe.

P.S.: Se come me usate Windows solo sul vecchio muletto e gli preferite qualcosa di meglio (tipo Linux !!!) con Wine vi potete cmq divertire 😉

E’ arrivato LibreOffice 6.0: ecco le novità!

Libreoffice 6.0 è finalmente arrivato: è stata rilasciato da qualche giorno l’aggiornamento della suite per ufficio multipiattaforma libera e Open Source migliore di sempre (che quelli della Microsoft se la sognano!). Questa release rappresenta la prima major update da luglio 2017  (quando fu rilasciata la versione 5.4) ed è stata fatta uscire da The Document Foundation, che ne cura il progetto, in concomitanza con il suo settimo anniversario (LibreOffice 3.3 rilasciata nel gennaio 2011 a distanza di un anno dal fork con OpenOffice).

LibreOffice è una suite per ufficio completa di foglio di calcolo (Calc), elaboratore testi (Writer), presentazioni (Impress), disegni (Draw) e database (Base).

Personalmente Continua a leggere

[RISOLTO] Il mistero di Windows 10 in bianco e nero

L’altro giorno  mi è stato riferito che un utente dell’ufficio da qualche ora si trovava a lavorare davanti ad una schermata grigia. I due monitor collegati al computer davano lo stesso problema che non erano riusciti a risolvere né muovendo i cavi né agendo sulle impostazioni della scheda video.

Mi sono allora ricordato che Windows 10 ha tutta una serie di ‘filtri colore‘ creati appositamente per migliorare l’esperienza di utilizzo alle persone affette da patologie visive come il daltonismo. Tali impostazioni seguono una sensibilità degli sviluppatori software degli ultimi anni: in alcuni giochi soprattutto FPS attraverso filtri per le diverse patologie di visione si cerca di ampliare la platea di giocatori.

Su Windows 10 il relativo pannello si trova in Impostazioni > Colore e contrasto elevato e ho scoperto che il filtro in scala di grigi si può attivare anche premendo la combinazione di tasti WIN+CTRL+C. Esistono diversi filtri, dalla semplice scala di grigi, anche invertita, inversione dei colori, fino alle diverse combinazioni di colore in grado di favorire la visione per le persone affette dai diversi tipi di daltonismo (deuteronopia, protanopia, tritanopia).

L’utente in questione, molto probabilmente accidentalmente, ha premuto la suddetta combinazione di tasti e voilà svelato il mistero di Windows 10 in bianco e nero.

Riassunto istruzioni: Continua a leggere