Blog

  • VMWare Fusion e Ubuntu: risoluzione dello schermo fissa a 1280×720. Ecco come risolvere la situazione

    Dopo aver aggiornato la macchina virtuale con Ubuntu 10.10 in VMWare Fusion, mi sono trovato impossibilitato a selezionare una risoluzione superiore a 1280×720.

    Anche dopo aver reinstallato i VMWare Tools, la risoluzione disponibile era sempre bloccata a 1280×720. Dopo aver fatto qualche ricerca nei log, ho trovato alcuni messaggi che evidenziavano il problema:
    could not apply the stored configuration for monitors
    Xserver does not support size requested
    VESA(0): Unable to estimate virtual size
    VESA(0): Not using built-in mode "2048x1536" (no mode of this name)
    VESA(0): Not using built-in mode "1920x1440" (no mode of this name)
    VESA(0): No valid modes left. Trying less strict filter...
    VESA(0): : Using hsync range of 31.50-37.90 kHz
    VESA(0): : Using vrefresh range of 50.00-70.00 Hz
    VESA(0): Unable to estimate virtual size
    VESA(0): Not using built-in mode "2048x1536" (hsync out of range)
    VESA(0): Not using built-in mode "1920x1440" (hsync out of range)
    VESA(0): Virtual size is 1280x720 (pitch 1280)

    Il problema risiede nella configurazione e nel rilevamento della risoluzione dello schermo; il pacchetto incriminato è quindi xserver-xorg-video-vmware. Per risolvere è sufficiente aprire un terminale e digitare:

    1. sudo apt-get remove xserver-xorg-video-vmware
    2. sudo apt-get install xserver-xorg-video-vmware
    3. fate un logout e un login, e la risolzione ottimale verrà ripristinata
  • 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.

  • Allenarsi nel modo giusto con il cardiofrequenzimetro

    Da qualche settimana ho iniziato ad usare il cardiofrequenzimetro durante i miei allenamenti, spinto dalla mia curiosità e su consiglio dell’istruttore di palestra.

    Cos’è un cardiofrequenzimetro?

    Il cardiofrequenzimetro è uno strumento che permette di tenere sotto controllo il numero dei battiti cardiaci in tempo reale, attraverso due componenti:

    • una fascia toracica che rileva la frequenza cardiaca in tempo reale e la invia (via onde radio) all’orologio;
    • un orologio che mostra il valore del battito cardiaco e [di solito] incorpora le funzioni di cronometro e contacalorie.

    Quanto costa?

    Il prezzo di un cardiofrequenzimetro base e di buona qualità si aggira intorno ai 30-40 €. Esistono diversi modelli di cardiofrequenzimetro, che includono ulteriori funzionalità rispetto a quelle qui elencate (ad esempio permettono di analizzare le pulsazioni sul proprio PC), o si integrano con altri strumenti (ad esempio con il contachilometri della bicicletta), ma ovviamente hanno un prezzo più alto. Sulla base della mia esperienza, i modelli prodotti da Polar e da Oregon Scientific sono i migliori sul mercato.

    Per quali sport mi serve?

    Il cardiofrequenzimetro può essere utilizzato in tutti gli sport come corsa, ciclismo e palestra, e persino anche il nuoto (esistono cardiofrequenzimetri speciali).

    Perché dovrei usare un cardiofrequenzimetro?

    Marathon's Shadow

    Negli anni Ottanta Francesco Moser portò l’idea di controllare la frequenza cardiaca nel ciclismo. Moser infatti impostò la sua preparazione sul controllo dei battiti cardiaci, e anche grazie a quest’intuizione, riuscì a vincere il Giro d’Italia nel 1984. L’intuizione che ebbe Moser è più che corretta: il battito cardiaco “misura” lo sforzo che il nostro fisico esprime a prescindere dalle sensazioni del momento, e ci permette di capire se stiamo sbagliando qualcosa nei ritmi di lavoro e di riposo.

    Frequenza cardiaca e sforzo fisico: teoria e pratica

    La frequenza cardiaca viene misurata in battiti per minuto (BPM). Se stiamo facendo attività fisica, è importante tenere a mente che a seconda dell’intensità della frequenza cardiaca di allenamento si va a migliorare un determinato sistema di produzione dell’energia. Innanzitutto dobbiamo definire la frequenza cardiaca massima (FCM), ovvero la frequenza massima che riusciamo a raggiungere sotto sforzo. Esistono varie formule per calcolare la FCM: la più famosa e semplice è quella di Cooper:

    FCM = 220-età

    Per esempio, un individuo di 22 anni, avrà una FCM pari a 198. Una volta calcolata la FCM, la fascia cardiaca da tenere in allenamento determinerà i risultati ottenuti con l’allenamento. Come scopriremo, correre alla massima velocità sul tapis roulant non vi farà bruciare grassi e dimagrire velocemente, ma non è così! Allenandosi in questo modo, il corpo umano non riesce ad utilizzare i grassi corporei (perché il fabbisogno nel tempo è troppo elevato) e quindi è costretto ad utilizzare glucosio e proteine (massa muscolare). Il corpo umano, infatti, trasforma qualsiasi risorsa energetica (proteine, carboidrati o grassi) in adenosina trifosfato, la principale fonte energetica del corpo umano. Quando l’intensità dell’esercizio cresce, i muscoli aumentano le contrazioni e l’adenosina verrà richiesta in maggior quantità; il corpo utilizza due sistemi per ottenere adenosina:

    • quando l’esercizio è di bassa intensità, verranno usati carboidrati e grassi per produrre energia, mediante il processo di metabolismo aerobico.
    • quando invece l’intensità cresce, il corpo utilizza il metabolismo anaerobico, producendo acido lattico.

    Quindi possiamo evincere che quando si vuole bruciare massa grassa, è controproducente strafare. Infatti, per perdere peso si deve rimanere nella fascia lipolitica, ovvero quella relativa ad un allenamento di bassa intensità. Sorprendente, vero?

    Ma come si calcola la fascia lipolitica? Generalizzando, possiamo calcolare a grandi linee l’intensità dello sforzo fisico monitorando i battiti cardiaci e costruendo 3 soglie diverse in base al valore di FCM calcolato poco sopra:

    Limite inferiore (bpm) Limite superiore (bpm) Nome della fascia Descrizione
    65% FCM 75% FCM Frequenza lipolitica L’allenamento sarà finalizzato all’incremento della resistenza e alla perdita della massa grassa (se l’attività viene protratta per almeno 20 minuti). In questa fase viene innescato il cosiddetto Ciclo di Krebs, che come fonte di energia principale utilizza i grassi corporei e permetterà di dimagrire senza perdere massa muscolare.
    75% FCM 85% FCM Frequenza aerobica Nella fascia aerobica si migliora la propria forma fisica, incrementando la prestazione aerobica, la resistenza, la dimensione e il numero dei vasi sanguigni; più in generale, si migliora il proprio allenamento.
    85% FCM 92% FCM Frequenza anaerobica Questa fascia è riservata ad atleti professionisti e migliora le prestazioni agonistiche. In questa fascia miglioriamo la potenza aerobica, cercando di innalzare la soglia anaerobica (il punto in cui si passa da soglia aerobica a soglia anaerobica).

    Esempio: abbiamo calcolato nell’esempio precedente che FCM = 198.

    La fascia lipolitica sarà compresa tra 0.65*198 (limite inferiore) e 0.75*198 (limite superiore), cioè tra 128.7 e 148.5. Inizialmente, raggiungere la fascia lipolitica sarà molto semplice (a seconda del vostro grado di allenamento) e verosimilmente la potrete raggiungere facendo una camminata sul tapis roulant. Man mano che proseguirete con l’allenamento, la vostra frequenza a riposo si sarà abbassata e potrete raggiungere risultati migliori (inizierete a correre) rimanendo comunque nella fascia lipolitica.

    Proprio per questi motivi, la formula di Cooper per il calcolo della FCM è piuttosto approssimativa perché non tiene conto di alcuni fattori che influenzano il valore massimo, tra cui l’età, il sesso e il grado di allenamento; un cuore allenato sviluppa meno battiti a riposo, perché riesce ad irrorare meglio i muscoli. Un cuore allenato, inoltre, aumenta molto lentamente i battiti sotto sforzo, e li riduce molto velocemente quando lo sforzo termina.

    Di conseguenza, la formula più precisa e consigliata è la formula di Karvonen, che tiene conto dell’allenamento e della frequenza a riposo del soggetto:

    FCM = 220 – età – FC a riposo

    Soglia inferiore = FC a riposo + FCM * %inferiore

    Soglia superiore = FC a riposo + FCM * %superiore

    Come si misura la FC a riposo?

    Mettetevi seduti, e assicuratevi di non avere svolto sforzo fisico nelle ultime 2 ore. Con il cardiofrequenzimetro, misurate i vostri battiti stando fermi. Il valore rilevato sarà FCR. Per quanto riguarda le percentuali (inferiore e superiore) nella formula, dobbiamo semplicemente utilizzare le percentuali indicate nella tabella soprastante.

    Esempio: supponiamo di aver monitorato la nostra frequenza a riposo (70) e di voler calcolare la soglia lipolitica utilizzando la formula di Karvonen:

    FCM = 220-20-70 = 130

    Soglia inferiore = 70 + 130 * 0.65 = 154.5 ~ 155

    Soglia superiore = 70 + 130 * 0.75 = 167.5 ~ 168

    Per semplificare i calcoli, il sito ottawarun offre un semplice calcolatore online: basta inserire la fascia a riposo, l’età, il sesso; come potete vedere dall’immagine, il programma vi restituirà una tabella con tutte le percentuali della vostra FCM, calcolate secondo la formula di Karvonen.

    Ovviamente è necessario un disclaimer: tutto quello che avete letto proviene da ricerche personali, io non sono assolutamente un medico e/o un istruttore di palestra, quindi non mi ritengo responsabile delle conseguenze derivanti dalla lettura di questo articolo. Chiedete prima al vostro medico e/o istruttore di palestra e fate gli esami cardiologici necessari.

  • Apple Mail e il bottom posting con QuoteFix

    Ci è voluto un po’ di tempo, ma alla fine anche su Apple Mail possiamo rispondere alle e-mail usando il bottom posting (la netiquette ringrazia). Per implementare il bottom posting, utilizziamo un plugin: QuoteFix.
    L’installazione è molto semplice: scarichiamo lo zip dal sito, apriamo un terminale e abilitiamo l’utilizzo dei plug-in in Apple Mail:
    defaults write com.apple.mail EnableBundles -bool true
    defaults write com.apple.mail BundleCompatibilityVersion 3

    Ora, scompattiamo il file appena scaricato e spostiamolo in ~/Library/Mail/Bundles/. Riavviamo Apple Mail e voilà, il bottom posting è servito!

  • Il curioso caso di Trenitalia: l’indennizzo si può avere solo in biglietteria?

    Devo segnalare che Trenitalia, e in particolare in Lombardia, ha un indice di performances riguardante il livello di servizio (quello che in gergo si chiama SLA, Service Level Agreement) dei propri mezzi sul territorio lombardo. In particolare, gli abbonamenti mensili/annuali vengono scontati nel caso in cui non venga rispettato lo SLA accordato tra Trenitalia e Regione Lombardia nel periodo relativo a 3 mesi prima (cioè: l’abbonamento di marzo è scontato in base alle performances di Trenitalia a dicembre dell’anno precedente). Trenitalia ha una sezione apposita del sito in cui pubblica le direttrici su cui è calcolata la performance e (di conseguenza) la disponibilità dello sconto.

    Tale sconto, però, non è richiedibile online, ma soltanto alla biglietteria della stazione. Dopo aver provato entrambe le modalità di acquisto, posso affermare che non c’è distinzione nel processo di acquisto (alla biglietteria non vengono richiesti documenti o altro), per cui il processo di acquisto non è differente: lo sconto (che in alcuni casi può arrivare al 20%) può essere ottenuto soltanto acquistando presso la biglietteria. Sfortunatamente, le biglietterie di Trenitalia sono quasi sempre molto affollate (a mio avviso, il numero dei serventi è sottodimensionato rispetto alla quantità di persone che richiedono assistenza), e di conseguenza la maggior parte delle persone finisce per non acquistare i biglietti scontati per mancanza di tempo.

    Trenitalia, se sei in ascolto: implementare la possibilità di usufruire dello sconto anche online potrebbe essere una buona mossa per aumentare il grado di soddisfazione dei tuoi clienti.

  • Facebook e la navigazione HTTPS da abilitare

    Mi sono accorto che Facebook offre un’opzione molto utile e assolutamente da abilitare. Infatti, sotto Account > Impostazioni Account > Protezione dell’Account troviamo un’opzione per abilitare la navigazione HTTPS quando possibile.

     

    Io l’ho abilitata subito, per proteggermi da sniffer indiscreti durante la mia navigazione su Facebook, e consiglio di abilitarla anche a voi. Personalmente, ho sempre percepito la necessità di un’opzione del genere: il login in plain HTTP presente su Facebook mi ha sempre lasciato un po’ perplesso.

  • Python: scriviamo un quine

    Una sfida che intriga molti programmatori è quella di scrivere un quine, ovvero quello di scrivere un programma che stampi il proprio sorgente.

    Partiamo con la definizione più semplice, e man mano aggiungiamo i vincoli necessari. Un programmatore furbo potrebbe stampare il contenuto del sorgente semplicemente aprendolo e stampando il contenuto:

    import sys
    print open(sys.argv[0],'r').read()
    

    Per agevolare il compito di confronto, usiamo diff (in modalità unified), e quindi inseriamo il Python hashbang e modifichiamo il print in modo che non vada a capo:

    #! /usr/bin/env python
    import sys
    print ''.join(open(sys.argv[0],'r').readlines()),
    

    Il confronto è presto fatto:

    $ ./quine.py | diff  -u - quine.py
    $
    

    (D’ora in poi, avendo inserito un alias nel .bashrc, assumerò di usare sempre diff unified).

    Abbiamo creato il nostro primo quine, ma abbiamo imbrogliato: leggere il file di input è considerato come barare; dobbiamo quindi ideare un metodo alternativo.

    Consideriamo quindi un programma che, data una stringa hardcoded, la stampi. Il problema non è banale, infatti ci potremmo addentrare in una ricorsione infinita se non studiamo un modo “furbo” per stampare il sorgente del programma:

    #! /usr/bin/env python
    import sys
    source = [
    "import sys" ,
    source = [ ... ] , # ricorsione infinita!
    "if __name__ == ‘__main__’:" ,
    "for i in source:" ,
    "print i"
    ]
    
    if __name__ == ‘__main__’:
    for i in source:
    print i
    

    Studiamo un metodo alternativo per stampare il sorgente: nella stringa che rappresenta il sorgente (source); il segreto è che usare un carattere speciale (es. $$) per dire al programma di stampare la stringa stessa!

    #! /usr/bin/env python
    import sys
    source = [
    "import sys" ,
    source = $$
    "if __name__ == '__main__':" ,
    "for i in source:" ,
    "print i"
    ]
    
    if __name__ == ‘__main__’:
    for i in source:
    if ‘$$’ in i:
    # stampiamo la rappresentazione della stringa che rappresenta il codice sorgente
    else:
    print i
    

    Per terminare il quine, dobbiamo espandere la sezione che manca; è importante prestare attenzione agli string literal (lettura consigliatissima!) per effettuare una stampa corretta delle stringhe nel programma (con i caratteri di escape corretti).
    Dopo aver ottenuto un primo esempio, armati di diff e di pazienza, dovremo correggere eventuali piccoli problemi (ad esempio: le “,” a fine riga per gli elementi della lista sourcecode — la virgola c’è per tutti gli elementi, tranne che per l’ultimo!).
    Volete la soluzione?

    #!/usr/bin/env python
    import string
    source = [
    '#!/usr/bin/env python' ,
    'import string' ,
    'source = $$' ,
    'if __name__ == "__main__":' ,
    'for i in source:' ,
    'if i == "source = $$":' ,
    'print i[0:i.find("$")] + "["' ,
    'for i in source:' ,
    '''if string.count(i,"'") != 0:''' ,
    '''print "'"*3 + i + "'"*3,''' ,
    'else:' ,
    '''print "'" + i + "'",''' ,
    'if source.index(i) < len(source)-1:' ,
    'print ","' ,
    'else:' ,
    'print ""' ,
    'print "]"’ ,
    ‘else:’ ,
    ‘print i’
    ]
    if __name__ == "__main__":
    for i in source:
    if i == "source = $$":
    print i[0:i.find("$")] + "["
    for i in source:
    if string.count(i,"'") != 0:
    print "'"*3 + i + "'"*3,
    else:
    print "'" + i + "'",
    if source.index(i) < len(source)-1:
    print ","
    else:
    print ""
    print "]"
    else:
    print i
    

    [notate come ho evitato alcuni problemi degli string literals tramite triple quoting (”’) e il costrutto di ripetizione (“”*3)].

    Da un rapido confronto tra l’output del programma e il sorgente, a meno di indentazioni del codice sorgente (richieste da Python), possiamo dire che dopo tanta fatica, abbiamo creato il nostro primo quine!

    Il prossimo passo sarebbe quello di ottimizzare il codice: short is better. Ma io non mi dilungherò oltre: aprite un editor e datevi da fare!

  • Post di servizio: la sidebar incorpora ora i miei social media e il mio feed Twitter

    I più attenti tra voi avranno notato alcuni cambiamenti nella sidebar del sito: in primis ho aggiunto una sezione relativa al mio account Twitter, dove verranno visualizzati i miei tweets più recenti. Ho intenzione di utilizzare Twitter come una piattaforma di microblogging, per segnalare tutte le risorse degne di nota che vorrei raccomandare ai miei lettori. Potete anche seguirmi (follow) su Twitter (@michelebologna) per interagire con me e seguire in tempo reale tutti i miei tweets.

    Inoltre, ho aggiunto una sezione “Social Media”, in cui sono presenti i link ai miei profili pubblici sui diversi servizi che utilizzo, in modo da costruire una panoramica dei social media a cui sono iscritto e a cui partecipo attivamente (ad esempio aNobii, GitHub, etc.) in modo da avere una dashboard di tutti i servizi che uso e un modo semplice per seguire le mie attività online.

    La sidebar è quindi completamente rinnovata, insieme ad una sezione che elenca i post più cliccati, gli ultimi commenti e una selezione dei siti che leggo.

  • Eclipse: impostare un template per l’inserimento di un Logger log4j

    Mi capita spesso, in Eclipse, di inserire il codice per abilitare il logging di una classe tramite log4j:

    private static Logger logger = Logger.getLogger(Klass.class);
    

    Utilizzano i templates, una funzionalità di Eclipse, possiamo evitare di riscrivere tutte le volte questa semplice istruzione. Per impostare un template, in Eclipse, è sufficiente recarsi su: Window > Preferences > Java > Editor > Templates e creiamo un nuovo template.

    Nel campo pattern inseriamo:

    private static Logger logger = Logger.getLogger( ${enclosing_type}.class );
    ${:import(org.apache.log4j.Logger)}
    

    A questo punto, per inserire il logger, è sufficiente utilizzare lo shortcut CTRL+Space per visualizzare gli autocompletamenti, e selezionare “logger” dal menu.

  • Il downtime programmato di un sito e il SEO Google: usate HTTP 503!

    A volte capita di dover gestire il downtime programmato di un sito web (per esigenze di manutenzione o altro); i possibili scenari per arginare la situazione potrebbero essere:

    • mostrare la pagina corrispondente ad un “Not Found” (HTTP 404). Questa soluzione è sconsigliatissima,perché penalizza il ranking del vostro sito sui motori di ricerca tipo Google. A mio avviso, infatti, Google assume che ci sia qualcosa di non funzionante nel sito e che questi errori non siano gestiti dal webmaster, penalizzando il sito in quanto non correttamente presidiato.
    • mostrare una pagina di cortesia, che avvisa l’utente della temporanea indisponibilità del sito, ritornando un “OK” (HTTP 200). Questa soluzione, per quanto sia preferibile alla precedente, non mette in evidenza ai motori di ricerca che la pagina ottenuta è temporanea, proprio perché risponde nello stesso modo della situazione di normale funzionamento del sito.
    • la soluzione ottimale viene descritta nell’articolo di Google, How to deal with planned site downtime: rispondere con una pagina web di “Service Unavailable” (HTTP 503), che mette in evidenza la temporaneità della situazione e indica che il normale funzionamento del sito verrà ripristinato a breve. Inoltre, come da specifica HTTP che riporto qui sotto, è possibile specificare nell’header un intervallo entro cui la pagina richiesta potrà tornare a funzionare normalmente:

      The server is currently unable to handle the request due to a temporary overloading or maintenance of the server. The implication is that this is a temporary condition which will be alleviated after some delay. If known, the length of the delay MAY be indicated in a Retry-After header. If no Retry-After is given, the client SHOULD handle the response as it would for a 500 response.

    Quindi, il mio consiglio è quello di utilizzare il codice HTTP 503 in tutti i casi temporanei di downtime ed errori nelle pagine del sito, indicando (se possibile) la data prevista di sistemazione tramite l’header Retry-After.