Usare Jquery per gestire tabelle e altri elementi con overflow su dispositivi mobili

Qualche tempo fa mi stavo occupando di rendere un sito web mobile-friendly e mi sono trovato di fronte alla necessità di gestire delle tabelle molto larghe. Purtroppo non era possibile pretendere che le tabelle fossero tutte quante di larghezza ridotta o con poche colonne, perciò era necessario usare l’overflow orizzontale con il CSS.

Oltre alle tabelle, ci sarebbero state anche delle formule visualizzate con Mathjax che — se molto lunghe — avrebbero “sfondato” la pagina. Ho avuto modo di accorgermi ben presto che la soluzione è leggermente meno semplice di quanto si possa pensare.

Nonostante le ultime versioni di Android e di iOS per iPhone/iPad supportino lo scorrimento di parti di pagina affette da overflow, le versioni vecchie di Android non permettono di scorrere correttamente con il dito, mentre quelle di iOS richiedono due dita e ciò è poco intuitivo.

Fortunatamente, ho trovato una soluzione interessante in Javascript sul blog di Chris Barr. Leggendo i commenti, ho anche scoperto con piacere che un lettore (Jeff) ne aveva fornito una versione Jquery, mentre un altro (Cormac) suggeriva l’utilizzo del metodo .live() per consentirne un corretto utilizzo anche su elementi caricati nel DOM in un momento successivo.

Ho deciso di unire i due approcci ed è venuto fuori il seguente risultato, che potete includere all’interno della pagina:

function isTouchDevice() {
	try {
		document.createEvent("TouchEvent");
			return true;
	}
	catch(e) {
		return false;
	}
}

function touchScroll(selector) {
    if (isTouchDevice()) {
        var scrollStartPosY=0;
        var scrollStartPosX=0;
        $("body").delegate(selector, 'touchstart', function(e) {
            scrollStartPosY=this.scrollTop+e.originalEvent.touches[0].pageY;
            scrollStartPosX=this.scrollLeft+e.originalEvent.touches[0].pageX;
        });
        $("body").delegate(selector, 'touchmove', function(e) {
            if ((this.scrollTop < this.scrollHeight-this.offsetHeight &&
                this.scrollTop+e.originalEvent.touches[0].pageY < scrollStartPosY-5) ||                  (this.scrollTop != 0 && this.scrollTop+e.originalEvent.touches[0].pageY > scrollStartPosY+5))
                    e.preventDefault();
            if ((this.scrollLeft < this.scrollWidth-this.offsetWidth &&
                this.scrollLeft+e.originalEvent.touches[0].pageX < scrollStartPosX-5) ||                  (this.scrollLeft != 0 && this.scrollLeft+e.originalEvent.touches[0].pageX > scrollStartPosX+5))
                    e.preventDefault();
            this.scrollTop=scrollStartPosY-e.originalEvent.touches[0].pageY;
            this.scrollLeft=scrollStartPosX-e.originalEvent.touches[0].pageX;
        });
    }
}

La cosa interessante della soluzione proposta da Jeff (e che ho riutilizzato) è quella di permettere il corretto funzionamento dei link contenuti nell’elemento che scorre.

Come potete intuire dal codice, la prima funzione controlla se il dispositivo è dotato di touchscreen oppure no, mentre la seconda accetta un selettore Jquery e associa un evento che viene azionato quando l’utente scorre con il dito sopra gli elementi corrispondenti.

Per applicare lo scorrimento alle tabelle, è necessario racchiuderle con un contenitore (in questo caso un <div>) in modo da applicare l’overflow, che con le tabelle non funziona in modo convenzionale.

La funzione deve essere richiamata dentro a $(document).ready(), e può essere utilizzata così, tenendo presente il trucco per le tabelle:

$(document).ready(function() {
    touchScroll(".MathJax_Display");
    $("table").wrap('<div class="table-scroll"></div>');
    $(".table-scroll").css('overflow', 'auto');
    touchScroll(".table-scroll");
});

La prima chiamata a touchScroll() si occupa delle formule prodotte da MathJax, i cui elementi compaiono nel DOM in un momento successivo ma sono catturati ugualmente grazie all’uso di .delegate(). Le seguenti righe si occupano invece di racchiudere le tabelle con un contenitore di classe table-scroll e applicano la funzionalità di scorrimento usando il selettore adeguato.

Questo è quanto! Come avete visto, una volta predisposta la funzione di Chris Barr modificata da Jeff, Cormac e me è sufficiente usare una chiamata per applicare l’overflow agli elementi desiderati. Nel caso delle tabelle, è necessario inserire un contenitore addizionale, ma questo si può fare con Jquery, in modo da evitare di introdurre modifiche al markup della pagina.

Più copie della stessa persona in una foto — Tutorial per Gimp e Hugin

Questo post è nato da un topic aperto su Gimp Italia da Francesco, uno degli utenti con un particolare interesse verso la fotografia, come potete vedere dal suo Flickr. Il topic aveva come oggetto un tutorial di MeetTheGimp per creare una foto della stessa scena in cui una persona compare in più copie.

Il tutorial nella sua forma originaria richiede che le foto vengano scattate con il cavalletto e che la fotocamera sia perfettamente immobile, per evitare disallineamenti. Il risultato di Francesco aveva alcuni problemi sotto questo punto di vista.

Come lui stesso ha poi spiegato:

L’errore è stato quello di sopravvalutare la stabilità del cavalletto, in effetti la pressione del pulsante ha determinato dei disallineamenti.

Ho quindi proposto l’utilizzo di Hugin, un software normalmente usato per creare panorami, per effettuare l’allineamento preciso delle fotografie (anche dal punto di vista dell’esposizione) e poi Gimp per effettuarne l’unione vera e propria. La correzione dell’allineamento consente di lavorare persino con foto scattate “a mano libera”, a patto che il fotografo non si sposti troppo tra i vari scatti. Con ciò intendo che dovrebbe stare sempre in piedi nello stesso punto, per evitare problemi di prospettiva.

Francesco è stato così gentile da fornirmi le foto e quindi riporto qui la mia versione del tutorial. Il risultato ottenuto è mostrato qui di seguito. I colori sono diversi perché ho elaborato la foto finale in modo diverso.

Risultato finale del tutorial, con allineamento preciso delle foto
Risultato finale del tutorial, con allineamento preciso delle foto

Le istruzioni sono divise in due parti e richiedono che abbiate installato Hugin e Gimp.

Allineamento delle foto

Salvate in una cartella le foto che volete utilizzare, meglio se con un numero progressivo per evitare confusione. Nel seguito assumerò che la foto iniziale (numero 0) includa l’inquadratura corretta, mentre le altre foto saranno allineate in funzione della prima.

Aprite Hugin e controllate di avere l’interfaccia impostata nella modalità corretta. Per fare ciò, andate su Interfaccia » Avanzato. Fatto ciò, trascinate le fotografie nell’area bianca centrale della scheda Foto. Proseguite quindi aprendo la scheda Punti di controllo.

Vedrete visualizzate a sinistra e a destra la stessa immagine (numero 0). Sulla destra, dal menu a tendina, scegliete la foto numero 1.

La foto di riferimento (a sinistra) e la prima foto da allineare (a destra)
La foto di riferimento (a sinistra) e la prima foto da allineare (a destra)

A questo punto dovete cominciare a definire dei punti di controllo sull’immagine, vale a dire cliccare lo stesso punto in entrambe le foto. Facendo clic sulla foto a sinistra, aumenterà lo zoom. La visuale mostrerà un quadrato contenente un forte ingrandimento del punto che avete scelto, e vi permetterà di muoverlo cliccando di nuovo o trascinando il cursore.

Per il primo punto che cliccherete, dovrete fare clic anche a destra, in modo “approssimativo”. Ci penserà Hugin a trovare il punto giusto cercandolo vicino a dove avete cliccato!

Definizione del primo punto di controllo
Definizione del primo punto di controllo

Quando siete soddisfatti del risultato, cliccate col destro per tornare alla visuale delle due foto intere. Dovete quindi ripetere l’operazione, definendo altri punti di controllo: cliccate sulla foto numero 0 e rilasciate il clic quando vi siete posizionati nel punto desiderato. Nell’immagine a destra il punto verrà messo automaticamente.

Per ottenere dei buoni risultati seguite queste indicazioni:

  • scegliete solo spigoli o piccole macchie con caratteristiche chiare, non zone uniformi
  • non utilizzate punti dove in una o nell’altra foto c’è la persona che si sposta
  • predisponete come minimo 10-12 coppie di punti di controllo, mai meno di 8
  • molti punti migliorano il risultato, io ne ho usati 15-18 per ciascuna foto da unire
  • se un oggetto è stato leggermente spostato (es. il cuscino), non piazzateci sopra dei punti
  • se avete creato una coppia di punti errata, trovate il pulsante Cancella in basso

Una volta finito di lavorare sulla foto numero 1, vi troverete davanti a qualcosa di simile a questo:

Le coppie di punti di controllo usate per allineare l'immagine numero 1
Le coppie di punti di controllo usate per allineare l’immagine numero 1

A questo punto, dovete ripetere il processo aprendo l’immagine numero 2 a destra, e così via. Lasciate sempre la foto numero 0 a sinistra. Una volta finito, tornate alla scheda Foto e in basso troverete due pulsanti per ottimizzare il risultato:

Le funzioni di ottimizzazione
Le funzioni di ottimizzazione

Fate clic sul primo pulsante Calcola, confermando il risultato, e poi sul secondo, sempre applicando le modifiche proposte.

Ora è il momento di esportare le foto: aprite la scheda Assemblatore, impostate la proiezione Rettilineare e poi cliccate il pulsante Calcola dimensione ottimale. C’è da poi da selezionare la spunta soltanto per le immagini singole, come mostrato di seguito:

Opzioni per la finestra dell'assemblatore
Opzioni per la finestra dell’assemblatore

Infine premete il pulsante Assembla e il programma vi chiederà in quale cartella salvare il progetto e di conseguenza anche le immagini elaborate. Non resta altro che spostarsi su Gimp! 🙂

Fusione degli scatti

Hugin salva le immagini corrette in formato TIFF con trasparenza. Aprite quella di riferimento (la numero 0) con Gimp e poi fate File » Apri come livelli e scegliete l’immagine successiva. Ora invertite i colori del livello appena importato (cioè quello in alto) tramite il menu Colori » Inverti e sul pannello dei livelli impostate l’opacità al 50%. Otterrete una foto grigia in cui si vedono i bordi degli oggetti:

Evidenziazione delle differenze tra i due livelli
Evidenziazione delle differenze tra i due livelli

Questo trucco funziona in modo molto semplice: se io duplico una foto, e quindi la sovrappongo al 50% con l’inverso, ottengo un grigio completamente uniforme, in quanto i colori “si annullano” col proprio opposto.

Se però uso due foto abbastanza simili ma leggermente non allineate, ottengo un risultato grigio più o meno dappertutto, che però evidenzia i bordi e le differenze. Questa spiegazione è un po’ approssimativa però spero che renda l’idea. 😛

Una volta visualizzata la situazione, bisogna utilizzare lo strumento di spostamento per muovere il livello superiore fino a che i bordi sono più allineati possibile, con particolare attenzione alle aree vicine alla persona (altrove non è necessaria troppa precisione):

Allineamento dei bordi, con particolare attenzione alle aree vicine alla persona fotografata
Allineamento dei bordi, con particolare attenzione alle aree vicine alla persona fotografata

A questo punto è necessario usare una selezione abbastanza approssimativa intorno alla persona nella sua nuova posizione e anche agli oggetti che si sono mossi, come ad esempio il cuscino del divano che si è abbassato leggermente. Create questa selezione con lo strumento di selezione lazo, poi fate Ctrl+I per invertire la selezione e premete il tasto Canc:

Primo ritaglio approssimativo
Primo ritaglio approssimativo

Ora deselezionate (premendo Shift+Ctrl+A) e usate lo strumento gomma per “ammorbidire” il bordo. Dovrete scegliere un pennello sfumato e cancellare piano piano quanto basta per ottenere una fusione omogenea. Una volta rifinito il bordo con la gomma, otterrete qualcosa del genere:

Ritaglio rifinito e sfumato
Ritaglio rifinito e sfumato

Nel caso in cui ci siano delle sovrapposizioni tra le persone (in questo caso le ginocchia), selezionate la parte che deve rimanere visibile, aiutandovi con lo zoom:

Selezione delle zone di sovrapposizione
Selezione delle zone di sovrapposizione

Una volta selezionata la zona, ed eventualmente sfocata leggermente tramite Selezione » Sfumata (dipende da caso a caso), premete Canc e poi ripristinate l’opacità del livello superiore al 100%. Infine, invertite nuovamente i colori e otterrete il risultato della prima fusione:

Risultato della prima fusione
Risultato della prima fusione

Ora dovete ripetere il processo per le altre immagini, una alla volta. Alla fine, unite tutti i livelli selezionando Immagine » Appiattisci immagine e usate lo strumento taglierino per ritagliare le parti trasparenti di troppo sui bordi.

A questo punto avete finito! Poi volendo potete applicare tutti gli effetti che desiderate. Se siete curiosi, nel mio caso ho utilizzato G’MIC per accentuare un po’ i colori. Prima di tutto ho usato l’affilatura con Sharpen (inverse diffusion) e ho duplicato il livello. Sulla copia ho usato Local normalization, giocando un po’ coi parametri e infine ho ridotto l’opacità di quest’ultimo livello al 30%. Poi ne ho aumentato parecchio la saturazione e ho fuso il tutto.

Il risultato è quello che ho inserito all’inizio dell’articolo. Spero che questo tutorial mi abbia consentito di raccontarvi un utilizzo “poco convenzionale” di Hugin, fatemi sapere se avete applicato questo effetto e se vi è stato utile. Buon Gimp! 😉

Script per Rai Replay: rilasciata la versione 6.0

Ieri ho sviluppato un importante aggiornamento allo script per guardare e scaricare i video da Rai.tv e Rai Replay, grazie anche alla segnalazione e al supporto di Domenico, un lettore che mi domandava come scaricare la prima parte del film su Olivetti.

Infatti la Rai ha pubblicato entrambe le parti, andate in onda il 28 e 29 ottobre, sul servizio Rai Replay, tuttavia la prima parte è stata resa disponibile solo tramite Silverlight (noi pinguini non possiamo nemmeno guardarla) e nella versione per cellulari e tablet. Nessun file MP4 per le Smart TV.

Come avrete già letto qui sul blog, il mio script usava proprio la versione Smart TV per servirvi un file MP4 ad alta qualità. Questo comportava anche il fatto che i video non disponibili per la televisione intelligente risultassero non cliccabili, oltre che non scaricabili.

Da oggi, con la versione 6.0 potete vedere e scaricare anche la versione per tablet. 😀 Questo è necessario solo quando non è disponibile un file MP4, infatti lo script seleziona automaticamente il video migliore e vi fornisce il link per scaricarlo, oppure la linea di comando necessaria.

Infatti se siete costretti a servirvi della versione per tablet, potete usare Gnome Mplayer oppure VLC media player per visualizzare lo stream in formato M3U8 e il software FFmpeg per effettuare il download. Il mio script si occupa di estrarre automaticamente la qualità più alta per voi e genera da solo la linea di comando adeguata.

Output della nuova versione dello script, che consente di scaricare anche i video disponibili solo per dispositivi mobili
Output della nuova versione dello script, che consente di scaricare anche i video disponibili solo per dispositivi mobili

Se avete già lo script l’aggiornamento dovrebbe essere automatico. Se volete aggiornare manualmente oppure se volete installarlo da zero, trovate tutti i dettagli nel mio post apposito, assieme alle istruzioni dettagliate per usare la nuova funzionalità. 😉

Intervento su Gimp all’Open Source Day 2013 (30 Novembre)

Banner dell'evento

Il 30 Novembre a Udine si terrà l’Open Source Day 2013, una importante «manifestazione organizzata annualmente da AsCI ed IGLU Gruppo Linux Udine con lo scopo di divulgare, tramite talk, workshop e molto altro, i programmi e la filosofia Open Source». Quest’anno sono stato invitato a partecipare come relatore e terrò una conferenza su Gimp, la quale è stata inclusa all’interno del percorso Multimedia:

Percorso Multimedia (Aula 1)

Gli altri percorsi della manifestazione sono Embedded, Professional, Security e Forensics. È superfluo dire che approfitterò dell’occasione per seguire quanti più interventi possibile relativi all’informatica forense. 😉 Per maggiori informazioni vi rimando al programma ufficiale linkato qui sotto.

Ci vediamo a Udine!

Via Conferenze Open Source Day 2013.

Aggiornata la guida all’installazione dei codec di Ubuntu

Data la recente chiusura del repository Medibuntu, ho aggiornato la mia guida all’installazione dei codec, la quale rimane attualmente uno degli articoli più consultati su questo blog. Le indicazioni sono valide anche per le versioni precedenti di Ubuntu (almeno dalla 12.04 in poi). 😉

Nel caso in cui abbiate ancora attivato il repository di Medibuntu, vi consiglio di disattivarlo al fine di non ricevere errori durante gli aggiornamenti.

Avviso importante: nuovo server per il download da Video Mediaset

Come avrete notato non ho scritto molto quest’estate, inoltre ho tenuto in sospeso un paio di articoli addirittura dal tardo 2012. Questo è successo per una signora molto dispotica chiamata “tesi di laurea”, la quale tuttavia oggi è stata gentilmente salutata e non disturberà più. 😀 Nel frattempo ho provveduto anche ad aggiornare questo strumento (lo script) messo a disposizione sul blog, e se lo utilizzate è importante che leggiate di seguito.

I miei script per salvare i video dai siti di Rai, Mediaset e La7 hanno riscosso un successo notevole e vengono utilizzati quotidianamente da molte persone. Questo mi fa molto piacere, tuttavia recentemente ci sono stati alcuni problemi con lo script per video.mediaset.it.

I più tecnici tra di voi avranno infatti già notato che il mio script per Greasemonkey e Tampermonkey, installato dagli utenti, si interfaccia con un server intermedio per ottenere i link ai video. La situazione è illustrata meglio in figura e di seguito è spiegato passo-passo.

Schema di funzionamento dello script per il download da Video Mediaset
Schema di funzionamento dello script per il download da Video Mediaset

Procedimento:

  • l’utente scarica Greasemonkey o Tampermonkey e poi installa il mio script
  • lo script chiede al server pubblico (in verde) gli indirizzi dei file corrispondenti al video visualizzato dall’utente
  • il server pubblico interroga il server segreto (in rosso) richiedendogli di scovare i link
  • quest’ultimo trova i link sul sito di Mediaset e li rimanda indietro
  • il mio script mostra in un riquadro i video e l’utente li visualizza

Il server pubblico era (ed è) una pagina ospitata su uno dei tanti servizi di free hosting statunitensi. Si tratta del sito il cui indirizzo è incluso nel codice sorgente del mio script. Tale pagina ha lo scopo di interfacciarsi e mascherare il vero server (quello “segreto”) che si occupa di trovare i link per voi. Quest’ultimo è ubicato in Italia e si maschera sia da PC che da telefono cellulare. Non è opportuno che io fornisca ulteriori dettagli in merito. 😉

Gli scopi sono due:

  1. estrarre anche i link in formato MP4 per cellulari, cosa non possibile su Chrome senza interventi manuali e tediosi da parte dell’utente
  2. permettere anche a chi risiede all’estero di vedere le trasmissioni

Veniamo al problema: il tremendo successo dello script, unito ad alcuni problemi ricorrenti al precedente servizio di hosting, hanno fatto sì che per alcuni giorni i link non comparissero, in quanto il sito veniva disattivato perché sovraccarico. Questo inoltre è successo più di una volta ed è risultato per me nel ricevere numerosi commenti, tweet e messaggi via email chiedendo lumi, oppure suggerendo che lo script dovesse essere aggiornato.

Non sarebbe stato un problema anche se ero in tesi, ad eccezione del fatto che voi utenti avreste dovuto attendere qualche giorno. Tuttavia il fatto che non dipendesse da me rendeva impossibile risolvere la situazione rapidamente, a meno di non cambiare completamente le cose.

È quello che ho fatto.

Ho attuato lo spostamento del server pubblico (di fatto un “collo di bottiglia”) su un altro hosting, che uso già per il mio blog secondario. Ho usato, con un po’ di simpatia, l’indirizzo http://video.lazza.dk (non si vede granché perché non è un sito con contenuti, ha il solo lo scopo di servire il mio script). 😀

Oltre a questo, mi sono premurato di proteggere il sito dal “troppo successo”: ora il dominio viene gestito tramite CloudFlare, un servizio che fa da CDN e DNS. Senza entrare nei dettagli, diciamo che tiene a disposizione delle copie degli indirizzi dei video più cliccati, così spesso il server pubblico non viene neppure “toccato” e l’utente riceve subito una risposta. Inoltre protegge da attacchi informatici di vario genere.

Questo riduce il carico e aumenta drasticamente l’affidabilità del servizio. Per questo è importantissimo che controlliate di avere lo script aggiornato. Da stasera, coloro i quali saranno rimasti alla versione vecchia per qualche motivo, vedranno un video “di avvertimento” che li invita ad aggiornare.

Per aggiornare lo script recarsi nell’apposito articolo e seguire le istruzioni per installarlo. La versione aggiornata sostituirà quella precedente.

Ricordo che se utilizzate già una versione non troppo vecchia dello script l’aggiornamento dovrebbe essere automatico e sarà già avvenuto mentre state navigando. 😉 Mi spiace per aver richiesto la vostra attenzione per il tempo necessario a leggere questo post, tuttavia lo script viene acceduto in media da 250 visitatori unici ogni giorno, con picchi di 1000 richieste di video quotidiane, perciò è necessario prendere le misure necessarie affinché tutto funzioni bene. 🙂

Buona visione!

Linux Day 2013 a Bassano del Grappa (VI)

Con grande piacere vi annuncio che anche quest’anno GrappaLUG si occupa di organizzare il Linux Day a Bassano del Grappa. La data che vi dovete segnare in calendario è il 26 ottobre 2013. Per chi ancora non lo sapesse, il Linux Day è una giornata culturale sul software libero. Cito dal volantino:

Il Linux Day è una giornata nazionale dedicata alla divulgazione della cultura informatica, in particolare quella legata al software libero. Durante l’evento si svolgono diversi interventi a tema, è aperto un laboratorio per tutto il giorno dove si possono provare le applicazioni libere e i membri di GrappaLUG sono a disposizione del pubblico per domande o dubbi.

Si tratta di un evento ad accesso libero e gratuito che interessa a tutti perché tutti siamo utenti di software libero, direttamente o indirettamente. Google (incluso Youtube) e Facebook usano molto software libero per fornire i loro servizi, e Linux è anche la base di Android e delle Smart TV. Se usate uno qualsiasi di questi prodotti, potete goderveli perché esiste il software libero, quindi perché non scoprirne di più? 😉

Quest’anno il focus di GrappaLUG è quello di realizzare un volantino completo in digitale, tant’è vero che non abbiamo ancora stampato nulla di cartaceo ed è probabile che non lo faremo o sarà in tiratura molto limitata. Perciò eccone qui un’anteprima, cliccate e potrete leggere il programma completo e gli orari. Vi aspettiamo! 🙂

Volantino digitale del Linux Day 2013 a Bassano del Grappa
Volantino digitale del Linux Day 2013 a Bassano del Grappa

Uno script in Bash per visualizzare le dirette Rai con Linux

Nei meandri della rete a volte si nascondono delle vere e proprie gemme. Un lettore mi ha recentemente segnalato questa, indicata nel blog di Andrea Ferroni in un articolo anche un po’ vecchiotto, eppure bella e funzionante. Cito testualmente:

Installate, se non li avete già, i pacchetti mplayer e xmlstarlet. Scaricate questo script sul vostro computer, rendetelo eseguibile e rinominatelo da “rai.txt” a “rai”. A questo punto eseguitelo da console e vi comparirà l’elenco dei canali. La procedura, per chi ha Ubuntu, Debian o derivate, è:

sudo apt-get install mplayer xmlstarlet
wget -O rai http://fabrizio.zellini.org/magick/rai.txt
chmod +x rai

Per vedere RAI1, ad esempio, è sufficiente lanciarlo come ./rai 1, per RAI Sport ./rai sport.

Aggiungo anche che se non lo avete dovete installare pure curl, come mi è stato segnalato nei commenti. Lo script è stato realizzato da Fabrizio Zellini e nella sua semplicità è geniale: usa gli stream della Rai indicando gli header necessari a convincere il server che “va tutto bene” e quindi si visualizzano le dirette con Mplayer. Il risultato è una aggiunta perfetta al mio script che consente invece di vedere i video on demand del medesimo sito.

Una mia nota personale: se nel codice dello script cambiate il comando da mplayer a gnome-mplayer (posto che abbiate installato quest’ultimo) avrete la possibilità di usare una GUI un po’ più ricca e che consente di impostare il rapporto di aspetto e cose simili. 😉

È anche questo il bello del software libero: l’unione fa la forza!

Via Visualizzare gli stream delle trasmissioni RAI senza Silverlight « Informatiche {bubbakk}.

Usare Sage per risparmiare sulla “bolletta” del telefonino

Se state pensando che Sage sia “solo” un software open source per fare matematica siete un pochino riduttivi. Certo, è un software — o meglio una distribuzione software con un’interfaccia Python unificata — progettato per dare del filo da torcere a strumenti commerciali come Mathematica e Matlab, tuttavia nulla vi dice che lo potete usare solo per studiare matematica o fare delle ricerche scientifiche.

Ho deciso di scrivere questo post tanto per mostrare un uso “simpatico” e insolito di questo software libero, ovvero quello di risparmiare nella scelta del piano telefonico. Di recente sono tornato dalla Danimarca, perciò era il momento di passare a TIM, dato che è l’unica ad avere offerte decenti per l’utilizzo che ne faccio io e più o meno l’80% delle persone tra i 16 e i 24 anni in Italia, in particolare parlo di TIM Young.

Il “problema” quando si sceglie un operatore è che molti, se non tutti, decidono (a parte le possibili opzioni) di usare il classico piano tariffario di base che costa un buon prezzo al minuto, ma ha lo scatto alla risposta e viene tariffato a scatti anticipati di 30 secondi. Tuttavia spesso esiste anche un piano senza scatto alla risposta e tariffato al secondo, anche se il prezzo al minuto è più alto. Nel caso di TIM i piani che ho valutato sono:

Piani base di TIM presi in considerazione
Piani base di TIM presi in considerazione

Ebbene, vi mostrerò come usare Sage per dimostrare che TIM ZeroScatti è più conveniente di TIM 12 e che gli operatori si fanno una valanga di soldi con lo scatto alla risposta.

Partiamo dal principio: per gli SMS si vede subito che costano meno, ma quello poco importa visto che TIM Young dà 1000 SMS al mese inclusi nel prezzo, quindi ci interessano le chiamate. La prima cosa da fare è definire due funzioni per rappresentare le tariffe. Sage ci permette di definire e rappresentare su un grafico funzioni completamente arbitrarie, ma non solo cose del tipo 3x²+sin(x), bensì vere e proprie funzioni programmate in Python (anzi, nel linguaggio esteso di Sage). Ecco il codice per i due piani:

def tim_12(s):
    s = floor(s)
    while (s % 30 != 0):
        s += 1
    return 18 + 12*(s/60)

def tim_zeroscatti(s):
    s = floor(s)
    return ceil(s*20/60)

La prima è più complicata perché oltre ad arrotondare i secondi a un numero intero, ovviamente, bisogna anche incrementarli fino ad un multiplo di 30, poi sommare lo scatto. A questo punto, è sufficiente usare le funzionalità grafiche di Sage per creare in pochi semplici comandi un grafico molto chiaro:

(
    plot(tim_12, (x, 0, 240), color='blue') +
    plot(tim_zeroscatti, (x, 0, 240), color='red')
).show(axes_labels=['secondi','costo (cent)'])
Risultato finale con in rosso la tariffa ZeroScatti
Risultato finale con in rosso la tariffa ZeroScatti

Il risultato finale è che possiamo vedere a colpo d’occhio com’è la situazione. Se anche voi come me siete persone che non stanno sempre 30 minuti al telefono ad ogni chiamata, ma anzi solitamente le vostre chiamate durano meno di 2 minuti e 40 secondi allora significa che vi conviene notevolmente usare un piano tariffario senza scatto.

Detto questo, ovviamente ci vogliono pochi minuti a cambiare il codice per adattarlo alle tariffe di altri operatori e fare diverse prove in modo da scegliere la migliore, l’importante è che prima di cambiare operatore conosciate tutti i piani tariffari che potete scegliere, perché al negozio solitamente evitano di dirveli adducendo scuse cretine (ho sentito di persona frasi come “ah sì ci sarebbe anche quello che dice, però sono 20 cent al minuto”). Se non volete installare subito Sage potete provare e modificare il mio codice direttamente online sul Sage Cell Server.

Buona portabilità!

OCR dei PDF con Linux [Wine]

L’Optical Character Recognition è il famoso processo per cui un software analizza una immagine di un testo (solitamente stampato) e tenta di effettuarne la conversione in un documento modificabile. Questo può essere sia un semplice file di testo che una pagina formattata, dipende dal software. Sotto piattaforma Linux esistono diversi strumenti molto validi per questo “lavoro”, a cui si aggiungono alcuni siti web che svolgono questo compito. Tuttavia, io desideravo in particolare effettuare una operazione che sta diventando sempre più popolare, ovvero il cosiddetto PDF sandwich. Ci possono essere due situazioni in cui potete trovarvi ad avere questa necessità:

  1. Possedete un PDF di pagine scansionate, magari a partire da immagini belle pulite e ottimizzate con ScanTailor.
  2. Avete un PDF di un articolo scientifico compilato con LaTeX, quindi sembra che ci sia il “testo vero” ma in realtà se provate a fare copia incolla (o una ricerca) tutto quello che viene fuori sono caratteri apparentemente privi di senso. Un esempio è questo paper, tra quelli che devo leggere per la mia tesi.

In entrambi i casi, il vostro scopo è ottenere un documento il cui aspetto esteriore sia lo stesso (quindi mantenendo le immagini) ma che sia ricercabile. Ciò viene realizzato da software appositi che creano un livello trasparente con del “vero testo” usando le tecniche OCR. Il risultato non sempre è perfetto, ma sicuramente è molto meglio di avere documenti totalmente non ricercabili. Ci sono alcune guide e script in merito, nonché un live CD nato per fare solo questo.

Tuttavia sono tutte tecniche basate sullo stesso principio: usano Tesseract oppure Cuneiform per creare un file hocr e poi hocr2pdf per creare il risultato finale. Io ho provato personalmente numerosi tutorial e programmi ma il problema è sempre lo stesso: il testo sovraimposto è spesso di dimensioni sbagliate, un po’ a casaccio, e a volte è completamente spostato rispetto alle parole visualizzate. Insomma, il risultato è indegno.

La soluzione funzionante

Alla fine mi sono arreso e ho optato per un software per Windows tramite Wine, in particolare PDF-Xchange Viewer. È un programma che nella versione a pagamento fa un sacco di cose che a me non servono, ma la versione gratuita ha un motore OCR niente male che allinea il testo precisamente e riconosce le colonne abbastanza bene.

Finestra OCR del programma
Finestra OCR del programma

La finestra di riconoscimento è molto semplice da usare e consente di scegliere la lingua e il tipo di PDF. Se il vostro PDF contiene già immagini scegliete la prima voce, ovvero Preserva contenuto originale & aggiungi livello testo. Se invece è un PDF con “falso testo” l’altra opzione vi consente di convertirlo in immagini e poi effettuare il riconoscimento. Se lo fate, vi consiglio una risoluzione di 200, che va bene anche per la stampa. A mio avviso 300 è esagerato, e crea file molto grandi. Alla fine vi basta salvare il documento PDF.

Note di installazione

Il programma si installa molto facilmente con Wine e nelle preferenze è possibile impostarlo in italiano e disattivare le voci PRO dal menu. Per effettuare l’OCR in italiano vi servirà il pacchetto di lingua addizionale, che trovate in questa pagina. L’unico problema è che a volte, con alcune versioni di Wine e (pare) di più nei sistemi a 64bit, il programma crasha quando si salva (seppure di solito il file viene salvato lo stesso). Per questo io vi consiglio di provare a installarlo con PlayOnLinux, nel quale potete testare diverse versioni di Wine e trovare un setup che per voi sia perfetto, anche se comunque non è obbligatorio farlo.

Se il vostro sistema operativo è a 64bit, potete anche risparmiare tempo e scaricare questo file .polApp [62 MB] che ho creato esportandolo da PlayOnLinux. Potete importarlo dal menu del programma, alla voce Plugins » PlayOnLinux Vault » Avanti » Restore an application. Contiene il programma impostato in italiano, i dizionari europei per l’OCR e il tema wooden per un aspetto migliore. A me funziona senza crashare, avendo impostato una versione vecchia di Wine (1.5.28).

Se invece usate Linux a 32bit e sperimentate i crash, provate anche la versione portable, alcuni asseriscono che funzioni meglio. Fatemi sapere se vi funziona e che ne pensate del programma!