Category: software

  • Sondaggio per i miei lettori: how about writing in English?

    Un piccolo sondaggio che vorrei proporre ai miei lettori, nato da un’idea che mi è venuta ma che vorrei approfondire.

    Innanzitutto, la situazione corrente: questo sito è scritto in italiano per lettori italiani, e tradotto automaticamente in inglese.

    Ora, invece, mi stavo chiedendo se fosse il caso di cambiare, ovvero di scrivere i miei post in inglese, e tradurli automaticamente in italiano. La lingua principale di questo sito, praticamente, sarebbe l’inglese.

    Il cambiamento non è indolore: sia per i lettori che non masticano l’inglese, sia per il posizionamento del sito (è più facile posizionarsi nelle SERP italiane che in quelle inglesi), sia per me: non sono madrelingua inglese! Tuttavia, il cambiamento porterebbe anche alcuni vantaggi: più visibilità per il sito e quindi (sperabilmente) più visite, le possibilità di far conoscere e di interagire in modo più veloce con attori non-Italian speaking e perché no, anche un modo per migliorare il mio inglese.

    Ma prima di intraprendere questo percorso, volevo chiedere ai miei lettori: cosa ne pensate?

  • Google Correlate (Draw) e l’importanza dei QR Code

    Oggi ho provato uno strumento messo a disposizione da Google: Google Correlate Draw. Come funziona? Si disegna una curva (di funzione) su un piano dove l’asse delle ascisse è il tempo, e sulle ordinate il numero di ricerche effettuate dagli utenti su Google. Il risultato è chiaro: mostrami tutti le ricerche (negli stati uniti) che hanno seguito l’andamento che ho disegnato sul piano.

    Ci ho “giocato” per alcuni minuti, e poi ho disegnato un’iperbole equilatera (si, è un’iperbole equilatera ruotata di 90° e traslata) con il massimo nel 2011, e ho osservato i risultati.

    google_correlate_draw

    Tra i risultati ritornati con un alto coefficiente di correlazione r, troviamo che le ricerche per il termine “QR Code” hanno l’andamento desiderato: segno del fatto che i QR Code stanno sempre più prendendo piede, e molte più persone si documentano a riguardo. Il tutto con un’andamento che è quello di iperbole equilatera. Sorprendente!

    UPDATE: Google Correlate Draw è stato dismesso da Google nel dicembre 2019.

  • Applicazioni desktop vs. Applicazioni cloud

    Ultimamente si parla molto di cloud computing e in particolare di SaaS: il paradigma cloud sta guadagnando sempre più interessa da parte delle aziende perché permette di abbassare i costi, una più facile manutenzione e un utilizzo semplice per gli utenti. Ma d’altra parte ci sono tante motivazioni per mantere un applicativo nella sua versione desktop, primo fra tutti l’utilizzo della banda.

    Un semplice esempio per capire meglio di cosa parliamo. Un’applicazione desktop è un’applicazione che viene eseguita fisicamente sul vostro computer: è stata precedentemente installata e viene distribuita sotto forma di applicazione che può essere installata dall’utente. Un esempio: Skype.

    Un’applicazione, cloud, invece risiede su una nuvola (da qui ‘cloud’): viene resa fruibile attraverso la connessione ad un altro sistema (tramite Internet ad esempio). Non richiede un’installazione (l’utente di solito accede all’applicazione da un browser) ma richiede una connessione ad Internet per essere utilizzata. Un esempio: Gmail.

    Dopo aver riflettuto sui vantaggi dell’una e dell’altra soluzione, ho deciso di condividere il mio parere riguardante le due soluzioni.

    Applicazioni desktopApplicazioni cloud
    Installazione del softwareL’applicazione deve essere installata prima di essere utilizzata.Nessuna installazione è richiesta (a parte il browser se l’applicazione verrà fruita tramite browser).
    Utilizzo delle risorseL’applicazione utilizza le risorse della macchina su cui è installata. Per applicazioni che hanno un carico computazionale cospicuo sono presenti requisiti hardware ben definiti.Il carico computazionale è quasi interamente gestito dal service provider che offre il servizio, riducendo i requisiti hardware della macchina che utilizza il servizio.
    AggiornamentiL’applicazione deve essere aggiornata manualmente dall’utente o da un amministratore di sistemaL’utente accede sempre all’ultima versione del software disponibile senza dover installare nulla: l’applicativo caricato dal browser è sempre aggiornato dal service provider, nulla è a carico dell’utente.
    Indipendenza dalla piattaformaAlcune applicazioni sono disponibili solo per determinate piattaforme (es. MacOSX, Windows), lasciando scoperte altre piattaforme comunque utilizzate da alcuni utenti (Linux, FreeBSD).Dato che molte applicazioni sono fruibili tramite un browser, molte delle applicazioni cloud sono indipendenti dalla piattaforma dell’utente
    Indipendenza/Utilizzo della reteUn applicativo desktop è indipendente dalla presenza della rete (se la funzione principale non è quella di utilizzare la rete).Senza connessione di rete, un’applicazione cloud non può funzionare (a meno di meccanismi di caching previsti dal browser [es. Google Gears/HTML5 Web Storage] e/o dallo sviluppatore dell’applicazione).Inoltre, il footprint di un’applicazione cloud sulla rete è tipicamente molto forte rispetto all’equivalente di un’applicazione desktop, proprio per la maggiore quantità di dati scambiati con la controparte remota.
    Autenticazione e autorizzazioneL’autenticazione e l’autorizzazione sono demandate al sistema operativo. Dato che questa pratica è tipicamente consolidata e ben documentata, un’applicazione desktop è solitamente più sicura della controparte cloud (sia del punto di vista della security fisica che di quella logica).L’autenticazione e l’autorizzazione sono realizzate su una rete che non sicura quale Internet, che può essere manomessa e/o monitorata. L’utilizzo di soluzioni di cifratura è una soluzione d’obbligo per proteggere i dati che transitano dal service provider all’utente finale.
    BackupI dati sono solitamente memorizzati sul pc dell’utente, che deve provvedere ad effettuare un backup cadenzato dei dati (se non previsto dall’amministratore di sistema).I dati sono quasi interamente gestiti dal service provider, che, in base al SLA garantito all’utente, deve provvedere al corretto backup dei dati e al ripristino in caso di failure.Inoltre, come già detto, questo comporta un utilizzo massimo della banda per trasferire i dati dal service provider al pc dell’utente finale.

    Quindi, qual è la soluzione migliore? Il desktop o il cloud?

    Ultimamente, la tendenza è quello di portare molte applicazioni sul cloud, e di associare al cloud tutte le applicazioni che possono essere richiamate tramite un browser. Ricordo che un’applicazione cloud deve rispettare diversi aspetti per essere chiamata cloud:

    • deve essere indipendente da piattaforma e hardware utilizzati dall’utente
    • deve supportare l’accesso tramite API
    • deve essere accessibile tramite qualsiasi sistema connesso a Internet
    • deve essere trasparente per l’utente da utilizzare indipendentemente da dove l’applicazione venga installata.

    Qual è la soluzione migliore? La risposta giusta, come al solito, è dipende. Dipende da molti fattori, come possiamo vedere, e ognuna delle due soluzioni ha i suoi punti di forza e di debolezza.

  • Python: scriviamo un generatore di Fibonacci ricorsivo (e poi iterativo) ed analizziamone la complessità asintotica

    Tralasciando la parte matematica su cui potete trovare un’esauriente (ed interessante) spiegazione su Wikipedia, la serie di Fibonacci si definisce:

    F(n) = F(n-1) + F(n-2)

    per n > 1, e F(1) = 1 e F(0) = 0

    Scriviamo un generatore di questa serie in Python:

    #!/usr/bin/python
    
    # fib(n) = fib(n-1)+fib(n-2)
    # fib(0) = 0
    # fib(1) = 1
    # fib(2) = 1
    # fib(3) = 2
    # fib(4) = 3
    # fib(5) = 5
    # fib(6) = 8
    # ...
    
    def fib(n):
        if n == 0:
            return 0;
        if n == 1:
            return 1;
        else:
            return fib(n-1) + fib(n-2)
    

    Abbiamo utilizzato un’implementazione ricorsiva; il vero problema di quest’implementazione è subito chiaro: la complessità O(n^2) data dalla ricorsione e dalle tail-call sullo stack (per n molto grande).
    Decidiamo allora di scriverne una versione equivalente ma iterativa, in modo da eliminare il problema della complessità:

    def fibnr(n):
        fn1 = 1;
        fn2 = 0;
        fib = 0;
        i = 2;
        if n == 0:
             return 0;
        if n == 1:
             return 1;
    
        while (i <= n):
            fib = fn1 + fn2
            tmp = fn1
            fn1 = fib
            fn2 = tmp
            i += 1
        return fib
    

    La vera complessità questa volta, sta nella testa del programmatore: è molto importante, infatti, scrivere nel modo più preciso possibile il corpo del while. Inoltre, è necessario implementare uno swap di variabile per tenere traccia della storicità della serie (per semplicità qui non ho usato lo swap di due variabili senza una variabile temporanea che ho presentato nei post precedenti). La complessità di questa soluzione iterativa è O(n).

    Implementando una sorta di controllo automatico (tramite assert), possiamo capire che la soluzione iterativa è equivalente alla soluzione ricorsiva, ma sappiamo anche che è più veloce e lineare (grazie all’analisi asintotica che abbiamo realizzato):

    #!/usr/bin/python
    
    # fib(n) = fib(n-1)+fib(n-2)
    # fib(0) = 0
    # fib(1) = 1
    # fib(2) = 1
    # fib(3) = 2
    # fib(4) = 3
    # fib(5) = 5
    # fib(6) = 8
    # ...
    
    def fib(n):
        if n == 0:
            return 0;
        if n == 1:
            return 1;
        else:
            return fib(n-1) + fib(n-2)
    
    def fibnr(n):
        fn1 = 1;
        fn2 = 0;
        fib = 0;
        i = 2;
        if n == 0:
             return 0;
        if n == 1:
             return 1;
    
        while (i <= n):
            fib = fn1 + fn2
            tmp = fn1
            fn1 = fib
            fn2 = tmp
            i += 1
        return fib
    
    if __name__ == '__main__':
        for i in xrange(21):
            print i, ',', fib(i), '|', fibnr(i)
            assert (fib(i) == fibnr(i))
    
  • Creare un panorama “incollando” più foto tra di loro con Hugin

    Le foto ad alta risoluzione ed incollate fra loro mi hanno sempre affascinato ed incuriosito: come possono essere prodotte con una semplice fotocamera tascabile?
    Ebbene, dopo varie ricerche ed aver provato diversi software, sono arrivato allo zen della composizione di foto.
    Innanzitutto, partiamo dal prodotto finale. Quella che vedete qui sotto è una vista panoramica di quello che si può ammirare dalla torre Eiffel, a Parigi: ho ottenuto questa vista incollando tra loro 6 fotografie, ottenute con una fotocamera digitale comune, senza un treppiede e senza apparecchiatura specialistica.

    Il risultato è davvero spettacolare, per una risoluzione finale di 4122×1438. Veniamo ora alla teoria: la fotografia panoramica prevede di “incollare” tra loro più fotografie, scattate in sequenza e con angolature diverse (per esempio ruotando leggermente la posizione di scatto della fotografia). Esistono software (il migliore è Hugin) che permettono di incollare queste foto in modo semi-automatico: il punto chiave del processo, come potete immaginare, è trovare dei punti di connessione tra le foto, ovvero dei punti di controllo che rendano il processo di “incollatura” il più preciso possibile. Ovviamente, più sono i punti di controllo tra due foto, più preciso sarà il merge tra le foto scattate.

    Hugin automatizza e semplifica il processo: se non siete dei virtuosi della fotografia panoramica (come il sottoscritto), il procedimento per l’unione delle foto viene presentato con un comodo wizard che vi permette di inserire le immagini, validare i control point identificati automaticamente del programma e creare il vostro primo panorama.

    Segnalo anche alcuni utili tutorial di Hugin, che spiegano come scattare correttamente le fotografie in modo che siano pronte per creare un panorama perfetto; inoltre, i tutorial spiegano anche come fare il tuning delle varie opzioni che possiamo trovare nel programma, per creare delle foto panorama personalizzate.

    In definitiva, Hugin è davvero un ottimo programma, che permette di creare facilmente delle foto panorama sia ad utenti principianti che foto panorama personalizzate per utenti esperti.

  • Eliminare il pezzo cantato di una canzone con Audacity

    Oggi sto “giocando” con Audacity per creare una versione “Karaoke” di una canzone; dopo aver cercato un po’ di tutorial, ho trovato quest’articolo breve e chiaro su come rimuovere il pezzo cantato di una canzone: Can I remove the vocals from a recording to make a Karaoke track?.

    La teoria che sta dietro a questo “trucco” è molto semplice: ogni canzone stereo ha due tracce, left e right. Separando le due tracce, e invertendo di fase una delle due, si possono “cancellare” alcune frequenze (come ad esempio quella relativa alla voce, che se ben ricordo viaggia intorno ai 4 Khz).

    Ora, la teoria che sta dietro a questo procedimento non è precisa: con molte canzoni questo non funziona. Ho fatto alcune prove, per alcune canzoni riesce effettivamente ad eliminare la parte cantata (con un leggero degrado audio); per altre, invece, la “cancellazione” non funziona.

    Rimango in attesa di essere illuminato da un audiofilo!

  • iTunes: trovare le tracce duplicate

    Ho appena scoperto un’interessante funzionalità su iTunes: la ricerca di tracce duplicate.Per visualizzarle, è sufficiente andare nel menu File, tenere premuto Shift (su Windows) oppure Option (su Mac) e utilizzare la funzionalità “Trova duplicati esatti” per visualizzare le tracce che hanno il medesimo titolo, sono composte dallo stesso artista e fanno parte dello stesso album.

  • Come aggirare i captcha tramite OCR

    Segnalo questa serie di articoli scritti da Silvio che spiegano come aggirare i captcha, ovvero i fastidiosi test somministrati da una macchina ad un umano per sapere se il “testato” è una macchina o un umano (un test di Turing al contrario?).

    In sintesi, il processo è diviso in più attività:

    • la riduzione del rumore di fondo;
    • l’identificazione del contorno dei caratteri, la loro segmentazione (sono rimasto affascinato dall’algoritmo di flood filling) e la normalizzazione;
    • ed infine la parte più interessante: il riconoscimento dei caratteri tramite algoritmi OCR basati sulle reti neurali.

    La spiegazione di Silvio è molto accurata e semplice, e indica numerosi ed interessanti riferimenti per l’approfondimento, oltre ai link dei programmi utilizzati (rigorosamente opensource). Da leggere!

  • Google Chrome e OSX: impostare uno shortcut per la ricerca

    In tutti i browser che utilizzo (Chrome, Safari e Firefox, in ordine di frequenza di utilizzo) sono abituato a usare lo shortcut ⌘+K (o CTRL+K su Windows) per effettuare una ricerca sul motore di ricerca predefinito. Ho preso quest’abitudine grazie a Firefox, il primo vero browser che ho utilizzato; la combinazione di tasti di cui parliamo, infatti, è impostata di default su Firefox, e io ho mantenuto quest’abitudine.

    Anche Chrome mantiene lo stesso shortcut (l’usabilità ringrazia) ma soltanto su Windows: infatti, alla pressione di CTRL+K, vi accorgerete che la omnibar di Chrome vi permette di inserire il testo di ricerca preceduto da un ‘?’, che rappresenta il pattern predefinito per impostare una ricerca su Google (anziché usare il paradigma “I’m Feeling Lucky” per il testo inserito).

    Lo shortcut non è però presente su Chrome per OSX. Fortunatamente, OSX ci permette di definire una combinazione di tasti personalizzata per ogni programma, e così potremo ristabilire il comportamento da noi desiderato. Vediamo come:

    • Aprite le preferenze di sistema e andate sulle preferenze della tastiera;
    • Posizionatevi sulla scheda “Keyboard shortcuts”, selezionate “Application shortcuts” e poi premete su “+”, in modo da aggiungere uno shortcut personalizzato;
    • Selezionate l’applicazione “Google Chrome” e in “Menu Title” inserite “Search the Web…” (si, anche i 3 puntini) e come shortcut premete ⌘+K. In questo modo specifichiamo a OSX di associare l’azione del menu “Search the Web…” di Google Chrome allo shortcut ⌘+K.
    • Premte “Add” e otterrete una schermata simile a quella qui presentata (eccetto Safari).

    Il procedimento è completo! Nel mio caso è presente lo shortcut anche per Safari: con le informazioni che vi ho fornito potete procedere da soli, introducendo lo shortcut anche per Safari, in modo da capire e riutilizzare questa preziosa funzionalità di OSX anche per altri programmi.

  • Aggiornare le estensioni di Google Chrome

    Da quando ho iniziato ad utilizzare Chrome ho subito cercato la possibilità di installare estensioni, che in passato hanno reso Firefox insostituibile. Una funzionalità di Firefox (piuttosto fastidiosa, a mio avviso) era il controllo degli aggiornamenti delle estensioni in fase di avvio; Chrome non utilizza questa funzionalità, ma piuttosto lascia all’utente il controllo degli aggiornamenti per le estensioni installate.

    Vediamo come fare: dal menu di Chrome (quello con la chiave inglese):

    • selezioniamo “Strumenti” e poi “Estensioni”, o apriamo un tab su chrome://extensions
    • clicchiamo poi su “Developer mode”
    • clicchiamo su “Aggiorna estensioni”, ed il gioco è fatto!