27 giugno 2019

ricerca nei PDF, Python e Apache Tika

Questa settimana, al lavoro, ho dovuto rovistare nella spazzatura informatica, un compito apparentemente lungo e ingrato, ma che mi ha dato l'opportunità di conoscere uno strumento nuovo.

Il compito consisteva nell'analizzare un migliaio di file senza estensione e con nomi casuali (GUID) per attribuirgli l'estensione corretta e un nome basato sul contenuto che consentisse di identificare quelli utili, da conservare e quelli da scartare.

Nella mia scatola degli attrezzi, per fare questi lavoretti in ambiente Windows, utilizzo spesso il linguaggio Python. Nel caso specifico ho utilizzato la versione 3.6.

Disclaimer/Avvertenza: non sono un programmatore Python. Ho assemblato i programmini qui sotto in pochi minuti, modificando codice trovato su Internet. Non garantisco né per la correttezza, né per lo stile! 

Ricerca e memorizzazione del tipo di file

Con uno script in Python posso passare uno ad uno i file senza estensione e cercare nei caratteri iniziali qualche sigla, tipo "Magic Number" o "shebang" che mi dice che tipo di file sto elaborando.

Nello specifico si trattava di file PDF (estensione .pdf), Excel 2013 (estensione .xlsx) e XML (estensione .xml). Trascrivo il codice specifico per i file pdf.


import os

mydir = "./temp"
directory = os.fsencode(mydir)
print(directory)

substring = "%PDF"                #pdf

for file in os.listdir(directory):
    filename = os.fsdecode(file)
    filenamefullpath = os.path.join(mydir, filename)
    file_extension = os.path.splitext(file)[1]

    if not file_extension:

        # Open the file with read only permit
        f = open(filenamefullpath, encoding="Latin-1")
        found = False
        linen = 0
        # use readline() to read the first line
        line = f.readline()

        while (line and not found and linen<3):
            if linen == 0:
                print(filename)

            if substring in line:
                print ("Your substring was found!")
                found = True

            else:
                # use readline() to read next line
                line = f.readline()
                linen += 1

        f.close()

        if found:
            os.rename(filenamefullpath, filenamefullpath + '.pdf')

    else:
        continue

Così ho identificato i file pdf. Rimane da leggere il pdf per capire che tipo di documento è, e se il contenuto è utile.


Embed from Getty Images

Ricerca del contenuto

Se apro un pdf con un editor di testo (il mio preferito è Notepad++) non riesco a trovare il testo che vedo quando apro il pdf con un lettore di pdf come Adobe Acrobat Reader.  Il testo è nascosto o ricodificato in maniera da non essere immediatamente ricercabile come caratteri ASCII.

Ho tentato diverse strade, tra cui xpdf_python, che però si è immediatamente rivelata infruttuosa perché in Windows falliva l'installazione del modulo.

Grazie a Stack Overflow, ho trovato altri suggerimenti, tra cui l'utilizzo della libreria Apache Tika, che per vostra convenienza e cultura ho anche documentato su Wikipedia.


import os

from tika import parser

mydir = "./temp"

directory = os.fsencode(mydir)

print(directory)

substring = "RAPPORTO ANNUALE"                #RA

filename_prefix = 'RA-'

for file in os.listdir(directory):
    filename = os.fsdecode(file)
    filenamefullpath = os.path.join(mydir, filename)
    file_extension = os.path.splitext(file)[1]

    if file_extension == b".pdf":
        raw = parser.from_file(filenamefullpath)
        text = raw['content']
        # print(raw['content'])
        found = False

        if substring in text:
            print ("Your substring was found!")
            found = True

        if found:
            filenamenew = filename_prefix + filename
            filenamefullpathnew = os.path.join(mydir, filenamenew)
            os.rename(filenamefullpath, filenamefullpathnew)

    else:
        continue

Il codice andrebbe commentato, ma non vorrei annoiarvi.

Vi confesso che sono rimasto molto ben impressionato dalle funzionalità di Tika, che mi ha consentito di automatizzare rapidamente un lavoro da incubo se fatto a mano.

14 maggio 2019

Scuola Montessori e Ufficio Scolastico Provinciale

L'Ufficio Scolastico Provinciale

Prima si chiamava "Provveditorato agli Studi", poi Centro Servizi Amministrativo (CSA), poi Ufficio Scolastico Provinciale (USP), ora "uffici con competenza per ambiti territoriali" (AT). Questa l'evoluzione della denominazione dell'ufficio delegato dal Ministero della Pubblica Istruzione (MPI) per sovraintendere le scuole locali.

Questo post riassume la Direttiva protocollo n. 7551/FR del 7 settembre 2006 ed elenca tra i compiti dell'ufficio la

ricognizione, per ogni opportuna azione di supporto, dell’offerta formativa realizzata dalle istituzioni scolastiche;
 ricognizione e monitoraggio dello stato di assegnazione e di utilizzazione dei finanziamenti attribuiti alle istituzioni scolastiche autonome.
Ho deciso di cercare un incontro con il Dirigente dell'USP di Pavia, per esporre il mio caso personale e capire che percezione ha della situazione delle scuole di Pavia, e, in particolare, riguardo alla possibilità di avviare sezioni a didattica differenziata Montessori.

Le scuole pubbliche a Pavia

Pavia: 70 mila abitanti, 12 scuole primarie pubbliche (la vecchia Scuola Elementare), 4 plessi scolastici o scuole principali.

Nessuna sezione Montessori, nessuna sezione con frequenza solo di mattina.

Voglio capire se il Dirigente ha una responsabilità nei confronti di quelle famiglie che abitano a Pavia e che quotidianamente affrontano chilometri in auto per portare i propri figli ad una scuola lontana perché in città l'offerta è carente.

Idem per le famiglie che decidono di affrontare spesi ingenti per iscrivere i figli a scuole private (paritarie) che offrono il pomeriggio libero, perché la scuola statale non offre questa possibilità.

Voglio capire se l'ufficio provinciale ha la sensazione che ci sono famiglie che non sono soddisfatte da quello che offre la scuola pubblica a Pavia.

L'incontro

Dopo vari tentativi telefonici infruttuosi da ambo le parti, scrivo una mail e infine riesco a parlare con una signora gentile che mi spiega che c'è un impiegato assegnato alle relazioni con i genitori.

A questo punto ci diamo appuntamento e, non mi sembra vero, una mattina mi trovo seduto alla scrivania di una affabile maestra "distaccata", cioè non in servizio in aula, ad esporre il mio caso.

Insieme con me ho invitato anche una rappresentante dell'associazione dei genitori promotori del metodo Montessori, sia per confermare date e numeri che per cogliere qualunque proposta costruttiva dovesse emergere a favore del cambiamento.

A tre, raccontiamo le nostre esperienze, analizzando punti dubbi o critici, e, con pazienza, l'impiegata cerca di spiegarci il ruolo del suo ufficio.

I ruoli delle parti

Molto riduttivamente, ho capito che l'Ufficio Provinciale si interessa dell'offerta formativa solo per questioni amministrative.

Quando le scuole propongono il numero di nuove classi e per ciascuno il numero di alunni, l'Ufficio verifica che la proposta sia compatibile con il numero totale di insegnanti assegnati alla Provincia. Verifica che le classi rispettino i vincoli numerici e le quote "stranieri".

L'offerta è a totale discrezione del Direttore o Direttrice del plesso, in conformità alle indicazioni ministeriali sull'autonomia degli istituti scolastici, e ogni plesso tende a soddisfare le richieste della maggioranza delle famiglie.

In una città come Pavia, dove nella maggior parte delle famiglie lavorano entrambi i genitori, se 80% dei genitori vuole il tempo pieno, partiranno classi a tempo pieno. In generale, dato che le scuole sono in competizione fra loro per ottenere risorse economiche e di personale, non è mai nell'interesse di una scuola primaria proporre classi con meno ore e quindi impegnare meno organico.

Solo una scuola che ha almeno quattro classi nuove potrà mettere insieme abbastanza genitori che non lo vogliono per far partire una classe che fa meno rientri pomeridiani.

Nessuno, tanto meno l'Ufficio Provinciale, verrà a chiedere ad un Dirigente di prendersi carico delle richieste di minoranza.


Per quanto riguarda le sezioni differenziate a metodo Montessori, il discorso si fa ancora più complesso. Infatti per offrire una sezione a metodo differenziato, gli insegnanti devono essere qualificati. La formazione Montessori con l'Opera Nazionale Montessori costa 550 ore e qualche migliaio di euro, normalmente a carico dell'insegnante. Se spalmate 550 ore sulle sere e i weekend, e pensate che i corsi non sono solitamente sotto casa, ma magari in una città ad un'ora di auto, iniziate a capire come mai l'Italia non è piena di maestri e maestre montessoriane.

Dunque, supponiamo che esista una scuola primaria che ha un organico stabile di 20 insegnanti e voglia istituire una sezione a didattica differenziata. Ebbene, dovrà trovare due insegnanti qualificati, e far uscire due insegnanti non qualificati. Si capisce bene che questo solitamente non avviene, se non per via di trasferimenti o pensionamenti.

Le conclusioni

Dal mio colloquio di oggi, assolutamente informale e senza riferimenti bibliografici, ho capito che la "scuola della mutua" non ha, almeno a livello provinciale, obiettivi istituzionali che vadano fuori dal rispetto delle leggi e delle direttive amministrative.

Ho trovato gentilezza, cordialità e anche passione per l'attività e la missione svolta in questo ambito così delicato e importante per la nostra società. Ma, come spesso succede, l'iniziativa è lasciata all'individuo per le scelte e alle associazioni di genitori per le proposte di cambiamento.

Io, come genitore, sono responsabile dell'istruzione dei miei figli, e voglio continuare a provarci.


03 maggio 2019

Escursionismo e internet

Da ragazzo amavo fare le camminate in montagna; organizzavamo le uscite con i miei amici in base alla stagione, ai mezzi di trasporto e alle cartine dei sentieri.

Anche oggi amo fare le passeggiate in montagna, e internet e mappe online ci hanno cambiato la vita. Spesso riesco a cavarmela anche senza cartina! Però oggi ho esigenze diverse e devo avere una buona idea del grado di impegno richiesto, per sapere chi tra amici e familiari è in grado di completare il percorso.

Vorrei segnalarvi alcune risorse che ho utilizzato, che non hanno la pretesa di essere perfette o di coprire ogni esigenza, ma hanno funzionato bene per me che vivo in Lombardia, e faccio soprattutto uscite in giornata.

Un portale comunitario che raccoglie percorsi, testimonianze, segnalazioni e un forum per scambiarsi informazioni è gulliver.it. Molto efficace e rapido nella consultazione, è uno dei primi posti dove vado a cercare cosa c'è in una certa zona.

Altro punto di riferimento, specifico per il Nord Italia, è Zaino in Spalla di Fabrizio Bellucci, detto Bicio, che raccoglie centinaia di schede molto dettagliate di passeggiate ed escursioni.

Internet è una miniera d'oro per i cercatori, e sono sicuro che ci sono altre fonti utili. 
Aspetto vostre segnalazioni.

Intanto, buon cammino! 

25 aprile 2019

GSE e burocrazia borbonica


La mia banca ha completato una operazione di fusione/acquisizione e di conseguenza ha cambiato il codice IBAN del mio conto, per la terza volta in dieci anni.

E' stata gentile a cercare di minimizzare l'impatto sulle mie transazioni economiche, ma su alcune realtà è necessario intervenire a manina.

In particolare il Gestore dei Servizi Energetici (GSE), che mi riconosce dei soldi in cambio della corrente elettrica che genero attraverso l'impianto fotovoltaico, ha una storia di burocrazia borbonica che trovo paragonabile solo a certi uffici comunali, o alla giustizia italiana.

Le istruzioni

Nelle pagine di assistenza tecnica del GSE si trovano le istruzioni, abbastanza dettagliate per il vero, in cui si spiega che l'unico modo per modificare le coordinate bancarie è attraverso le funzionalità dell'area clienti.



Qui inizia il calvario.

Il sito web GSE è in realtà una collezione di siti diversi, realizzati da agenzie e imprese diverse, senza alcuna continuità tecnologica, logica o grafica.

Lo screenshot sopra è preso dal sito pubblico.
Vi risparmio le schermate di login.

Area Clienti GSE

Superati tutti gli avvisi di Firefox sulla sicurezza del sito, dovuto ad un certificato SSL interno che non punta ad una autorità di certificazione pubblicamente riconosciuta, accettando tutti i rischi, si arriva all'area clienti, o meglio a quella di più alto livello. 
(per i meno tecnologici, stiamo parlando di quel triangolo arancio sul lucchetto nell'indirizzo del sito)

Da qui si possono modificare alcune informazioni dell'anagrafica, ma non l'IBAN. Troppo facile.
È necessario addentrarsi nei vari contratti stipulati con il GSE, e per ognuno seguire le istruzioni di cui sopra.

Area Fotovoltaico

Come sopra, bisogna di nuovo superare tutti gli avvisi di sicurezza del browser, perché il server è diverso, e i consensi dati prima non valgono.
Ah! E ricordatevi di controllare sempre in alto il blocco dei pop-up! Ad ogni nuova schermata bisogna dare un nuovo consenso ai pop-up.
Accedendo all'area Fotovoltaico ci troviamo davanti ad una vasta pagina bianca, generata da un sito aspx, in grigio e azzurrino, con una grossa freccia verde, da cui accedere ai sottolivelli successivi.
Se non ve lo ricordate a memoria, dovete andare a controllare quale conto energia avete sottoscritto, cinque, dieci o quindici anni prima, per poi addentrarvi nella sezione relativa.

Se seguite fedelmente le istruzioni, vi troverete un pop-up che vi propone di:
  • inserire il nuovo IBAN
  • scaricare il pdf con la richiesta, 
    • stampare 
    • firmare
    • scansionare
  • caricare il pdf stampato, firmato e scansionato
  • caricare il documento di identità

Scambio sul posto

Come sopra, bisogna di nuovo superare tutti gli avvisi di sicurezza del browser, perché il server è diverso, e i consensi dati prima non valgono.
Ah! E ricordatevi di controllare sempre in alto il blocco dei pop-up! Ad ogni nuova schermata bisogna dare un nuovo consenso ai pop-up. (Ve l'avevo già detto?)
Altro sito aspx, questa volta in verde e grigio, con un menù orizzontale sotto il logo. 
Se seguite fedelmente le istruzioni, vi troverete un pop-up che vi propone di:
  • inserire il nuovo IBAN
  • scaricare il pdf con la richiesta, 
    • stampare 
    • firmare
    • scansionare
  • caricare il pdf stampato, firmato e scansionato
  • caricare il documento di identità
Direte, ma come, non le avevo appena inserite? Troppo semplice.
Nossignore, si tratta di un secondo contratto, e bisogna fare tutto daccapo.

Tutto qui?

A questo punto, sempre che non sia arrivata prima l'ora di pranzo, cena, dormire, e che nessuno vi abbia interrotto nella vostra navigazione della burocrazia, dovete solo aspettare 60 giorni per vedere che tutto sia andato in porto.
Internet? Dematerializzazione? Semplificazione amministrativa?
Tutte queste cose hanno il loro prezzo e i loro tempi. 
Tu ci hai messo due ore circa, loro hanno sessanta giorni.

01 aprile 2019

Sostituire i raggi della bici: cose da sapere prima di cominciare

Ho una vecchia Touring by Bianchi che funziona bene come bici da città.

La ruota posteriore però ha iniziato a cedere, un raggio alla volta.

Il mio aggiusta-bici ci ha messo una pezza, sostituendo il raggio con il cosidetto "gancio", una volta, poi due... Alla terza, la ruota iniziava ad essere storta e non si riusciva a raddrizzare, e la mia officina di fiducia ha detto che per loro era spacciata.

La ruota, una Radaelli in acciaio, 28x1 5/8, mozzo Ofmega, a mio modesto parere, non era da buttare, ma la strada per sostituire i raggi era ignota e in salita.

Oggi ho terminato il lavoro, e vi racconto alcune cose che bisogna sapere prima di cominciare un lavoro del genere.

Tiraraggi

Se non sapete cos'è un tiraraggi non partite nemmeno. Ci vuole una certa pratica con i raggi e il tiraraggi per raddrizzare la ruota dopo la sostituzione.

Dima di centratura

Una volta montati i raggi, la ruota sarà molto storta. Idealmente ci vuole un sistema di riferimento a banco, ma ci si può arrangiare con un sistema artigianale o montando la ruota sulla bicicletta. Serve un gessetto o un listello rigido da far strusciare sul lato della ruota per trovare le zone bombate.

Rimozione del pacco pignoni

Solo per i raggi lato pignoni. Bisogna capire il modello di pignoni, risalire all'attrezzo/chiave specifico per quel gruppo di pignoni, acquistare la chiave e riuscire a rimuovere il pacco pignoni.
La rimozione può essere molto impegnativa. Nel mio caso due officine hanno provato e rinunciato. Io ci sono riuscito utilizzando una chiave della Park Tool, parecchio WD40, una morsa e una leva lunga un paio di metri. :-)

Raggi

Recuperare i raggi non è semplice. Innanzitutto bisogna capire esattamente la misura dei raggi utilizzati. La cosa più semplice potrebbe essere di smontarne uno e portarlo all'officina per farla misurare.

Il fai da te può riservare sorprese. Armarsi di calibro per il diametro e di un sistema di misura dedicato per la lunghezza. La misura della lunghezza include la filettatura e arriva al raggio di curvatura interno. I miei raggi, lato pignoni, misurano 300mm, inclusi 7mm di filettatura, e hanno un diametro di 2mm.

Secondo John Allen, il partner del mitico Sheldon Brown, è ammessa una tolleranza di 2-3mm, ma le conseguenze del montaggio di una misura sbagliata sono piuttosto gravi: infatti un raggio lungo non tira, e un raggio corto rischia di rompersi nella zona della filettatura.

Poi bisogna trovare un fornitore. Il primo posto dove cercare è sempre l'officina di fiducia. Nel mio caso, sono stato davvero fortunato: il mio meccanico le ha trovate identiche e me le ha regalate, dicendo era materiale vecchio di cui doveva disfarsi! Ci sono fornitori online che offrono una gamma molto ampia di misure e materiali.

Se si ha intenzione di sostituire tutti i raggi, si può optare per un diametro maggiore, ma bisogna mettere in conto anche la sostituzione dei nipli (teste) e di conseguenza anche della banda copriraggi interna al cerchio.

Quanti raggi servono? La mia ruota ne ha 18 per lato. Una volta che cominciano a rompersi per "vecchiaia" è meglio cambiarli tutti, o almeno tutti da un lato. Anche perché il lavoro per cambiarne uno non è molto diverso dal lavoro necessario per cambiarne 18.

Segnatura dei raggi. Una volta che si comincia a sostituirli, conviene sapere quali sono quelli nuovi e quali quelli vecchi. Si può usare un pennarello indelebile, o del nastro adesivo.

Istruzioni per la centratura

Una volta sostituiti i raggi manca solo la parte più lunga e delicata, la centratura o allineamento della ruota. Dovete trovare delle istruzioni per la centratura, ma come detto all'inizio, se non avete un minimo di confidenza con il tiraraggi, cercate di fare pratica, prima di avventurarvi.

Su Park Tool trovate alcune indicazioni, che riassumo per semplicità qui.

1. Il primo allineamento da cercare è quello laterale. La ruota non deve strusciare sui freni o forcella. Allentare o stringere i raggi nella zona bombata. Allentare dal lato della sporgenza, o tirare dal lato dell'incavo.
2. Centratura radiale: la ruota deve assomigliare ad un cerchio. Se la ruota è ovalizzata, stringere o allentare in modo che il cerchio abbia la stessa distanza dal mozzo in tutti i punti.
3. Centratura rispetto al mozzo. Non entro in merito.

Conclusione

Per sistemare una ruota anteriore o posteriore lato libero, le cose si semplificano un po', ma sappiate che dovete armarvi di attrezzi specifici e tanta pazienza per poter portare a termine il lavoro.

Buon fai da te!

09 marzo 2019

CD Audio: copia FLAC


I CD hanno vita limitata, e forse ancora di più i lettori CD.

Come conservare la musica faticosamente accumulata negli anni?

Molti di voi mi risponderanno: "Non la conserviamo: la scarichiamo direttamente da internet."

Ma capita di avere dei CD che non si trovano su internet, o non trovare i siti da cui scaricare i file audio, o semplicemente non voler entrare su siti di dubbia reputazione, che potrebbero mettere a rischio il mio computer.

A questo punto ci armiamo di pazienza, di computer con lettore CD e ci organizziamo per copiare le tracce su un computer o disco esterno, in formato MP3.

Ma se vogliamo conservare la qualità dell'audio?

Utilizziamo il formato FLAC, un codec audio libero con compressione dati lossless, cioè senza perdita di qualità

E chi ci aiuta in questo mestiere?

Entra in scena Exact Audio Copy.

Riferimenti in italiano:
* dal sito di Salvatore Noschese, un articolo di @kuronekos: https://www.laltroweb.it/eac-exact-audio-copy-come-impostarlo-e-come-eseguire-rip-in-flac-r144/
* dal sito ilsoftware.it: https://www.ilsoftware.it/forum/viewtopic.php?t=88820

Riferimenti in inglese:
* https://www.techradar.com/how-to/how-to-rip-your-cds-to-flac

27 febbraio 2019

Raspberry Pi: avviare un servizio all'accensione

Un appunto veloce per spiegare la soluzione che ho scelto per avviare un servizio all'avvio del Raspberry, soprattutto pensando ai miei lettori italiani, che non hanno sempre voglia di tradurre o farsi tradurre le pagine in inglese.

L'obiettivo: far partire uno script in Python che funziona da servizio, cioè parte in automatico e gira all'infinito o fin quando non viene interrotto manualmente. Nel mio caso si tratta di un programma scritto da me che per ora non ha neanche una interfaccia grafica, e forse non l'avrà mai.

Cinque soluzioni

Ci sono diversi modi per arrivare al risultato, come ho potuto verificare nelle mie ricerche.
In un articolo del sito Dexter Industries, vengono elencati 5, dico cinque modi diversi:
  • rc.local
  • .bashrc
  • init.d
  • systemd
  • crontab

rc.local

Ho provato il metodo rc.local, ma ho trovato subito delle difficoltà perché lo script in Python non trovava le librerie (import) e neanche i file locali che doveva aprire.

Per vedere gli errori ho eseguito da terminale il comando inserito nel file rc.local:

sudo python /home/pi/sample.py 

In pratica il sistema operativo non aveva finito di caricare l'ambiente, o io non ero stato in grado di dargli il contesto corretto in cui far girare lo script.

init.d

Il metodo init.d perché, nell'articolo citato, mi proponeva di copiare il programma nella cartella init.d.

sudo cp /home/pi/sample.py /etc/init.d/ 

A me questo metodo non piace, perché sto facendo lo sviluppo nella mia home, e vorrei lasciare tutto lì. Non vorrei cartelle duplicate e programmi duplicati.

systemd

Questo metodo sembra un po' più lungo e complesso, perché richiede
  1. di scrivere un file di istruzioni, detto "Unit File" o "Service File" e 
  2. di inserirlo tra i servizi di sistema
In realtà è proprio il sito del Raspberry a fornire delle indicazioni dettagliate corredate da un esempio per creare il file e i comandi necessari per avviare il servizio.

Queste istruzioni hanno funzionato per me al primo colpo ed è stato il metodo che ho preferito, per diverse ragioni:
  1. ho un file di descrizione del servizio separato dallo script/programma/servizio vero e proprio
  2. la granularità del controllo, o in parole semplici, la possibilità di definire diversi parametri come la "Working Directory"e definire eventuali dipendenze (es. avvia solo dopo aver avviato la rete)
  3. poter continuare a sviluppare e fare i test in una directory a piacimento,
  4. poter arrestare e riavviare il servizio con i comandi standard di Linux (systemctl)
Buon divertimento con il Raspberry!