Author: Michele Bologna

  • Curiosità: fare manutenzione di codice non documentato può portare a…

    … alla scomparsa del gioco “Pinball”, che da Windows Vista in poi non è stato più incluso in Windows, per motivazioni pratiche:

    • doveva essere portato da 32-bit a 64-bit e non c’era documentazione;
    • il codice non era di proprietà di Microsoft;
    • non era una priorità;

    Windows_Pinball

    Why was Pinball removed from Windows Vista? – The Old New Thing – Site Home – MSDN Blogs.

     

  • IIS e Office: come risolvere il problema COMException (0x80004005)

    Ultimamente mi è capitato un problema a runtime durante l’utilizzo di un’applicazione .NET che accedeva ad Office (più in particolare a PowerPoint).

    L’applicazione genera, server side, un file PowerPoint. Tuttavia il processo si blocca durante l’invocazione di PowerPoint con un errore poco parlante (“PowerPoint could not open the file“), nonostante il file PowerPoint da utilizzare come base di partenza sia effettivamente presente nella directory indicata nel source code:

    System.Runtime.InteropServices.COMException (0x80004005): PowerPoint could not open the file. at Microsoft.Office.Interop.PowerPoint.Presentations.Open(String FileName, MsoTriState ReadOnly, MsoTriState Untitled, MsoTriState WithWindow) at

    Dopo un po’ di ricerca, per risolvere questo problema si deve creare una directory vuota (provare per credere) in questa posizione, in base al sistema operativo su cui gira IIS:

    Windows 2008 Server x64 - C:\Windows\SysWOW64\config\systemprofile\Desktop
    Windows 2008 Server x86 - C:\Windows\System32\config\systemprofile\Desktop

    Riavviate IIS, e non otterrete più l’errore indicato.

  • Gli showcases di GitHub: un link da bookmarkare!

    Oggi ho trovato un link molto interessante su GitHub: gli showcases.

    Github showcasesSi tratta di una pagina ospitata dal famoso sito di social coding che permette di conoscere ed esplorare alcuni progetti software opensource e – perché no – prendere spunti di organizzazione e metodologie di un progetto.
    I progetti sono catalogati per topic per una più facile consultazione, ed è molto ben fatto ed organizzato.

    Ad esempio, grazie a questa pagina ho scoperto Rubocop, un linter per Ruby che si è rivelato molto utile in più di una occasione.
    Ho inserito il link nel mio toolbox per lo sviluppo software, sicuramente sarà utile in futuro per trovare qualche progetto/tool che mi aiuterà nello sviluppo software.

  • OSX: Eclipse e Java 7 (senza Java 6)

    Ok, avete installato OSX Mavericks e avete notato che il vostro sistema operativo è sprovvisto di una JVM (finalmente OSX non shippa più con la JVM fornita da Apple).

    Nessuna paura, le istruzioni per installare la JVM/JDK di Oracle sono ancora valide. Ma adesso volete utilizzare Eclipse, che vuole che installiate la vecchia JDK 6 (quella fornita da Apple per intenderci).

    eclipse_java6_install_osx

    Non avrebbe senso installare la JDK 6, abbiamo già la JDK 7. Tutto quello che dobbiamo fare è adattare la JDK 7 in modo che sia “compatibile” con Eclipse.

    Modificate (da root) il file

    /Library/Java/JavaVirtualMachines/jdk.1.7.<…>/Contents/Info.plist

    Sostituite:

    <key>JVMCapabilities</key>
     <array>
      <string>CommandLine</string>
     </array>

    Con:

    <key>JVMCapabilities</key>
     <array>
      <string>JNI</string>
      <string>BundledApp</string>
      <string>WebStart</string>
      <string>Applets</string>
      <string>CommandLine</string>
     </array>

    Logout/Login ed Eclipse userà la nuova JDK 7.

  • SQLite3, NFS e FreeBSD: risolviamo il problema di locking dell’I/O error

    Ho recentemente risolto un problema con FreeBSD, SQLite3  e un file-system montato via NFS.

    Veniamo ai dettagli: FreeBSD 9.2-RELEASE (“xray“) monta un file-system condiviso via NFS da un server Linux (“zulu“), già condiviso con altre macchine, e con cui non si presentano problemi particolari.

    Il comportamento particolare di FreeBSD si manifesta quando tento di aprire un database SQLite3 direttamente sul file-system condiviso:

    xray # mount -t nfs -o udp, nfsv3 zulu:/exportnfs /nfs
    xray /nfs % sqlite3 test.sqlite3
    SQLite version 3.8.2 2013-12-06 14:53:30
    Enter ".help" for instructions
    Enter SQL statements terminated with a ";"
    sqlite> .schema
    Error: disk I/O error

    Dopo varie prove, e constatando che il problema si verifica solo con FreeBSD, mi imbatto nell’interessante articolo sullo strato più basso di SQLite, quello a contatto con il sistema operativo, ovvero il VFS.
    Scopro che, passando l’opzione -vfs unix-dotfiles riesco ad evitare il problema di I/O error.

    Capisco quindi che il problema è tra le opzioni di locking del client NFS di FreeBSD. Soluzione? Leggo il man di mount_nfs e trovo l’opzione nolockd. Faccio un remount ed il problema è risolto!

  • git-flow: il modello di git workflow che utilizzo

    Dopo aver letto l’interessante presentazione “How GitHub uses GitHub to build GitHub“, ho deciso di dare un’occhiata al modello di workflow chiamato git-flow [che si basa, ovviamente, sull’utilizzo di git].
    In sintesi:

    • Ci sono due branch sempre presenti: master e develop:
      • master contiene tutti i commit per cui il repo è deployabile in produzione [production ready].
      • develop contiene il codice di integrazione. Va da sé che una volta che il codice di integrazione è pronto, viene fatto un merge verso master.
    • Ci sono alcuni branch che vengono creati/distrutti all’occorrenza: feature, release e hotfix:
      • feature è un branch di develop che contiene, appunto, alcune features“locali” al brach di sviluppo di cui verrà fatto il merge verso develop
      • release: una volta che il branch develop ha abbastanza features per una release, si crea un branch di develop per prepararsi ad un ciclo di rilascio. Nessuna nuova feature può essere introdotta a partire da questo branch. Una volta pronto, il branch release viene merge-ato al branch master [e successivamente al branch develop].
      • hotfix contiene, come dice il nome, delle fix urgenti che hanno origine nel branch di produzione, e di cui verrà fatto il merge nella prossima release di produzione [e che saranno riflesse, di conseguenza, anche in develop].

    Può sembrare complicato: ecco un grafico che spiega in forma grafica quello che ho illustrato a parole:

    Se volete saperne di più, sul sito di dell’ideatore è presente una descrizione più dettagliata di git flow.
    Bonus: su GitHub è presente un’estensione per utilizzare git-flow direttamente da git.

    Esistono anche altri modelli di workflow per git, ma a mio avviso, git-flow rimane il più indicato [per i miei progetti].

  • OSX: come fare un reset di Launchpad

    Dopo l’installazione di Mavericks, ho deciso di fare un reset delle applicazioni presenti in Launchpad, la schermata iOS-like di OSX per il lancio di applicazioni (introdotta in Lion).

    Launchpad

    Per fare un reset di Launchpad è sufficiente cancellare il database SQLite che contiene le descrizioni di tutte le applicazioni (niente paura: il database viene rigenerato ogni volta che si riapre Launchpad):

    rm ~/Library/Application\ Support/Dock/*.db
    killall Dock
    

    Ora riaprite Launchpad e le applicazioni verranno disposte secondo il default.

  • Ruby e OSX: problemi coi certificati SSL durante l’installazione delle gem

    Nella nuova versione dell’installer di RubyGems è presente un check di sicurezza sul certificato SSL del sito da cui si scaricano le gem che si stanno per installare.
    Questo può comportare un errore durante l’installazione di una qualsiasi gem:

    ERROR: Could not find a valid gem 'rails' (= 3.2.14), here is why: Unable to download data from https://rubygems.org/ - SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
    

    Sono disponibili due strade per risolvere il problema:

    • creare un file ~/.gemrc contentente :ssl_verify_mode: 0. Questa soluzione, oltre a non essere dipendente dall’utente con cui si installano le gems, è fortemente sconsigliata: infatti, disabilita il controllo del certificato SSL del sito da cui si prelevano le gems, con immaginabili problematiche di security. Usate questa soluzione solo in ambiente di test.
    • importare il certificato system-wide:
       cert_file=$(ruby -ropenssl -e 'puts OpenSSL::X509::DEFAULT_CERT_FILE')
      security find-certificate -a -p /Library/Keychains/System.keychain > "$cert_file"
      security find-certificate -a -p /System/Library/Keychains/SystemRootCertificates.keychain >> "$cert_file"

  • Addio TIM: il mio passaggio a Wind (number portability)

    Sono stato cliente TIM fin dal mio primo cellulare; tra le varie tariffe proposte, avevo scelto la tariffa Autoricarica, che permetteva di ottenere una ricarica proporzionale ai minuti di chiamata che si ricevevano. Soddisfatto della tariffa, sono rimasto cliente TIM per diverso tempo.

    Nel corso degli anni, tuttavia, la tariffa è stata rimodulata unilateralmente da TIM. Vado a memoria: la tariffa non è stata più selezionabile dai nuovi utenti, poi il bonus accumulato doveva essere speso entro un certo periodo, poi le chiamate ricevute contribuivano alla ricarica solo se ricevute da altri operatori. Infine, pochi mesi fa, la tariffa ha perso la sua caratteristica di autoricarica e tutti i clienti sono stati migrati forzatamente alla piano tariffario Unica.

    A quel punto non avevo più ragione di rimanere cliente TIM: ho deciso di fare una ricerca di mercato. Obiettivo: trovare un operatore che mi garantisse del traffico dati al prezzo più conveniente (max 10€/mese). Ovviamente se nel pacchetto fossero compresi chiamate e SMS non avrebbe guastato, ma sarebbe stato sicuramente un plus.

    I contendenti erano Wind All Inclusive (7€/mese per 1GB di traffico/mese) e 3 (4€/mese per 1GB di traffico/mese). A parita’ di prezzo, TIM e Vodafone non garantivano la stessa offerta (in termini di chiamate/sms/traffico dati).

    Sulla base di un passaparola tra amici e conoscenti, ho scartato l’operatore 3 in quanto non offriva un’adeguata copertura nella mia zona (Bergamo) e per una scadente qualità del traffico dati. Quindi, sono passato a Wind.
    Il processo di number portability è durato 3 giorni ed è stato indolore. A titolo di cronaca: lunedì sera ho firmato il passaggio e il successivo giovedì mattina la SIM Wind era già attiva e funzionante sul mio ex-numero TIM. Durante la transizione ho continuato ad usare la mia vecchia SIM senza problemi. Il credito che avevo sulla vecchia SIM mi è stato accreditato sulla nuova SIM, a meno di 2 euro.

    Come mi trovo con il carrier Wind?
    Fino ad ora molto bene. La copertura è ottima e anche la disponibilità della rete 3G è capillare. Il prezzo è tutto sommato accettabile; tuttavia, a partire dall’8 ottobre il prezzo è stato ritoccato a 9€/mese (solo per i nuovi clienti). Si dice che l’appetito vien mangiando, ed infatti 1GB di traffico comincia a starmi stretto: potrei valutare di voler cambiare tariffa/operatore, in futuro, se il traffico venisse raddoppiato a parità di prezzo.

  • HTML5 e CSS avanzato: una guida per (re)-impararli

    Nonostante HTML5 sia ancora un release candidate al momento della scrittura di questo post, molte delle peculiarità del linguaggio sono supportate dai browser più evoluti (Chrome, Safari, Firefox, Opera ed IE10).

    Ho deciso di fare un ripasso delle principali istruzioni di typesetting (e di imparare anche i nuovi tag) presenti in HTML5 e delle principali proprietà presenti in CSS. Per questo ripasso mi sono affidato a due guide ben scritte da Shay Howe:

    • Guida base HTML/CSS (comprende anche HTML5 e CSS3). Non fatevi ingannare dalla presenza della parola “base”, perché i concetti esposti sono tutt’altro che base. Per esempio, grazie a questa guida ho ripassato il box-model e il posizionamento degli elementi in CSS [vi ricordate la differenza tra static, relative, absolute e fixed?]. Segnalo anche la presenza della guida ai gradienti CSS3, un’esauriente carrellata di tutte le lists [sapete usare una definition list?], i nuovi controlli per i form in HTML5, gli onnipresenti nuovi tag per audio/video ed infine le tabelle [sapete cos’è la property border-collapse?];
    • Guida avanzata HTML/CSS. Dopo aver assimilato i concetti presenti nella guida precedente, in questa guida segnalo alcuni concetti interessanti come gli sprite CSS, i selettori CSS composti (:nth-child), i preprocessori HTML e CSS (haml e SASS).

    Entrambe le guide sono ben fatte e ricche di consigli preziosi come la minification, l’abilitazione di mod_gzip e tante altre informazioni utili. Da salvare nei bookmark!