Vagrant and Ansible (part 1)

I am used to have a complete LAMP stack on my development machine, so that I can test my sites on a browser directly while writing code.

It’s probably an old-school way to develop, but it has worked well until recently.

Now I am working on two projects. One is a completely new project, but it needs to run on a Ubuntu 12.04 server but could be tested without problems on a more recent Linux config; the other is some legacy PHP4 code that runs fine on Ubuntu 12.04 with PHP 5.3 but it’s a mess to adapt to PHP 5.5.

I thus decided to give Vagrant a try and install an Ubuntu 12.04 image on Virtualbox. I found a Vagrantfile on the Internet and, allons-y!, everything works.

Then I thought: what would happen if I misconfigured the Vagrantfile, or the server config, or, worse, deleted the wrong file? Let’s study some devops tools!

Some months ago I read a book on Puppet and did some tests, but I found it quite complicated, and I heard Chef is similar. The new kid on the block is Ansible, and, from what I read on the Internet, it looked nice. Of course I tested it.

And then, keeping a terminal window open on the old VM’s Vagrant directory, it happened: a vagrant destroy in the wrong directory.

So I had to rush my Ansible study. :)

Continue reading

Sleep()ing Android

I recently restarted developing on Android, after (too many) years. I had to catch up with all the updates in the framework, as I was using Android 1.6/2.0 at the time, but all in all, I found out it was easier than I thought.

I decided to create a small game-like app to get back in shape before engaging all the new things in Android 4.

And I found I needed to sleep() for a bit after a user action.
Continue reading

Testing framework-backed APIs with PHP’s internal web server

Recently I had to prepare functional tests for a set of (RESTish) APIs in a Silex-backed application. The problem is that I couldn’t test POST, PUT and DELETE methods on the development environment or (worse) on the staging server.

So I came up with the idea of using the PHP integrated webserver, started from the PHPUnit bootstrap, and a couple of rules in the app bootstrap to redirect all storage calls to a temporary database.

Continue reading

Rebirth

As nobody notices, I am working on bringing this blog back to life.

And, given that I moved to the UK, I am going to (try to) write everything in english.

The old posts will remain in italian, as they could contain useful informations.

See you soon! :)

contentEditable e i suoi demoni

Nell’ultimo anno, prima per lavoro e in questo periodo per esperimenti personali, mi sto addentrando nella programmazione Javascript, e l’ho fatto scalando la parete più ripida della montagna: contentEditable.

Ho deciso quindi di riassumere qui le varie idosincrasie che ho trovato, sperando che mi servano in futuro per evitare di sbattere di nuovo la testa a sangue contro il muro. Per tutti gli esperimenti ho usato Firefox (tra la 8 e la 10, più o meno)

Preparare l’ambiente

Ci sono due modi per usare contentEditable: definire tutto il documento contentEditable (di solito si usa con un iframe), o definire solo un elemento (la strada che ho seguito io). Nel primo caso basta, da Javascript:

document.contentEditable = true;

Nel secondo basta creare un elemento HTML con la proprietà contenteditable:

<article contenteditable="true"></article>

Fatto questo, io personalmente imposto tre proprietà:

document.execCommand("useCSS", false, true);
document.execCommand("styleWithCSS", false, false);
document.execCommand("enableObjectResizing", false, false);

La prima serve a usare <B> e <I> per fare grassetto e corsivo in Firefox, mentre Explorer (da quel che leggo) usa <STRONG> e <EM>. Se non la si specifica, Firefox riesce a fare peggio che non seguire la semantica di HTML: usa <span style=”font-weight: bold;”></span> e <span style=”font-style: italic;”></span>

La seconda fa la stessa cosa, ma una delle due è deprecata. Per compatibilità io le uso entrambi.

La terza serve ad evitare che, se ci sono oggetti come <img> o simili, l’utente possa ridimensionarli trascinandoli. Si può anche non specificarla, ma io preferisco controllare cosa fa l’utente tramite plugin jQuery che controllano gli spostamenti e i ridimensionamenti.

La cosa importante da notare è che TUTTI i comandi dati tramite execCommand() vanno eseguiti DOPO che c’è un elemento con contentEditable presente e visibile nel DOM. Se state creando l’elemento da Javascript, e fate (con jQuery)

var $el = $('<article />').attr('contenteditable', true');
document.execCommand("useCSS", false, true);
$('body').append($el);

Riceverete una bella eccezione nella console di Firefox. Basta spostare l’execCommand dopo l’append.

Non basta un contentEditable vuoto

Naturalmente non basta un <article contenteditable=”true”></article>, perché, come tutti gli elementi senza contenuto, le sue dimensioni sono 0x0, quindi è invisibile e soprattutto “incliccabile”, e perciò non c’è modo di scriverci dentro. Basta aggiungerci un figlio. Alcuni ci mettono un <br />, ma io preferisco un <p>, che però ha gli stessi problemi, quindi la sintassi completa è:

<article contenteditable="true">
  <p>
    <br />
  </p>
</article>

Perché questa tiritera? Perché Firefox, se state scrivendo dentro un <p>, quando premete Invio chiuderà automaticamente il <p> e ne aprirà un altro identico. In qualsiasi punto siate. Se siete fuori da un <p>, inserirà semplicemente un <br />, con buona pace della semantica (e per la gioia dei cialtroni che fanno spaziature verticali premendo Invio n volte).

Ma ancora non basta! Ma cosa vuole??

Se avete predisposto tutto il suddetto, e avere fatto la vostra toolbar (magari in un prossimo articolo vedremo come) con la possibilità di inserire grassetti, corsivi, liste, ecc., vi scontrerete con un problema assurdo: Se tentate di rendere “lista” il primo elemento del contentEditable, Firefox solleva un’eccezione. Bold e Italic funzionano perfettamente, solo le liste (e gli allineamenti, e forse qualcos’altro che non ho ancora scoperto) danno errore. E` un bug di Firefox, presente fin dalla 2.0, pare. Io l’ho aggirato così:

<article contenteditable="true">
  <p></p>
  <p>
    <br />
  </p>
</article>
Con un <p> vuoto (quindi dimensioni 0x0, quindi incliccabile) prima del contenuto vero. Brutto, ma funziona. Poi il codice si ripulisce lato server, perché ha TANTO bisogno di essere ripulito.

Recensione: PHP and MongoDB Web Development (di Rubayeet Islam – Packt Publishing)

Disclaimer: ho ricevuto il libro per la recensione da Packt Publishing stessa.
Ho cercato comunque di fare una recensione obiettiva.

Recensione generale

In una parola: ottimo. Anche se migliorabile.

A memoria credo sia il primo a trattare l’integrazione tra PHP e MongoDB.
Lo stile è molto scorrevole. I concetti sono spiegati in modo chiaro nella maggior parte dei casi. Fanno eccezione i concetti di programmazione funzionale nel capitolo dedicato a map-reduce, che avrebbero beneficiato di un maggiore approfondimento.
Ogni capitolo presenta diversi esempi di codice per gli argomenti trattati.
I quiz di cui è costellato aiutano a richiamare i concetti appena appresi e a capire se sia il caso di rileggere quanto appena studiato. Peccato che non siano molto numerosi. Le soluzioni ai quiz si trovano alla fine del libro.

Vengono presentati anche alcuni “compiti per casa” (di cui non viene data soluzione, naturalmente) che invitano ad implementare soluzioni diverse da quelle presentate o software che utilizzando i concetti esposti li espandano per creare software più complessi.

La caratteristica che ho apprezzato di più è la presentazione degli esempi: prima viene esposto il codice completo di tutti gli script, e in seguito, durante la spiegazione, vengono riportati i frammenti di codice. Questo consente di avere una visione globale e di poterla studiare da soli. Molti altri testi spezzano i sorgenti rendendoli illeggibili, o integrano la spiegazione in commenti lunghissimi che, senza colorazione della sintassi, li rendono altrettanto illeggibili.

Lo stile adottato sembra distaccarsi un po’ dal classico dei manuali tecnici, per tendere a quello dei testi universitari.

In alcuni casi si ha la sensazione che ci sia molto di più dietro (e spesso a ragione), e che il libro copra solo l’uso base di alcune caratteristiche.
In altri casi è scritto chiaramente (con relativo link) che per approfondire si possono consultare fonti online.

Alcuni piccoli errori tipografici come campi di array separati da :  (come in javascript) invece che da => in PHP, o virgolette dimenticate  nelle chiavi di accesso agli array sono facilmente individuabili e non pregiudicano la qualità del libro.

Continue reading

Pogoplug, altra delusione…

Continuo coi miei rant, spero di non sembrare troppo disfattista. Magari nei prossimi giorni parlo un po’ del Galaxy S2, di cui invece sono soddisfattissimo. :)

Circa un anno fa l’agenzia dove lavoro ha comprato un Pogoplug Business. L’esigenza principale era di avere un “file server” semplice da usare, con interfaccia sia web (da dare ai clienti) che “locale” (per montare le condivisioni sui PC della LAN). Era essenziale la multiutenza, in modo da dare, per esempio, una cartella ad ogni utente locale, e una ad ogni cliente, dove potesse caricare i file da mandarci e scaricare quelli preparati da noi.

Per questo siamo andati sulla versione Business, la più costosa, pubblicizzata proprio con queste caratteristiche.

Come funziona

Spiego brevemente come funziona il Pogoplug.

Continue reading

Gnome 3, mezzo disastro

L’ho visto in experimental, l’ho tenuto d’occhio per un po’ e finalmente una decina di giorni fa ho deciso di installarlo. Ma me ne sto pentendo.

L’ambiente è stato completamente rivoluzionato. Per alcune cose (poche) in meglio, per altre (molte) in peggio. In generale si nota una spiccatissima tendenze ad assomigliare più possibile a OSX. Per non dire che lo stanno copiando a man bassa. Continue reading

Eclipse: Helios, un satellite coi buchi?

Ieri Eclipse (Galileo) ha iniziato a dare di matto.

Già da un po’ avevo notato rallentamenti quando scrivevo un “uguale” (=), ma dopo 3-4 secondi mi mostrava l’autocomplete e mi lasciava continuare a scrivere, salvo perdermi uno spazio ogni tanto. Ho provato a disabilitare l’autocomplete durante la scrittura (lo voglio solo quando premo ctrl-space), ma non ci sono riuscito.

Eclipse bugsMa ieri quei 3-4 secondi sono diventati più di 10 minuti. Non so quanto, e non so se si sarebbe mai ripreso. L’ho killato dopo un buon gelato. E ho iniziato a cercare soluzioni in Internet.

Sembrava un problema legato al fatto di avere troppi file nel progetto, e infatti linkando lo Zend Framework questo numero superava abbondantemente i 1000. Pur perplesso dal fatto (alcuni miei progetti si avvicinano a quella cifra, non oso pensare progetti più importanti), disattivo lo ZF, chiudo tutti gli altri progetti, e continuo a programmare per un po’, finché non si ripresenta il problema anche con “miseri” 150-200 file nel progetto.

Allora cancello il workspace e tutte le config di Eclipse e riprendo, pensando a una config corrotta. Dopo aver riscaricato tutti i plugin. Illuso. Dopo 2 ore per ripristinare tutto si ripresenta lo stesso errore. Decido quindi di aggiornare Eclipse, cosa che non avevo fatto perché sembra che la nuova versione abbia problemi con l’SDK Android.

Helios

Ho quindi scaricato la nuova versione (Helios), direttamente con PDT integrato, e ho (re)iniziato a configurare e scaricare plugin.

Ma i plugin non funzionavano.

Apparivano nella finestra dei moduli installati, se tentavo l’update mi diceva che non c’erano aggiornamenti, non potevo abilitarli o disabilitarli, solo rimuoverli. Ma non facevano niente. Niente nuove perspective, niente nuovi progetti, niente finestre aggiuntive.

Scavando (per ore) tra le configurazioni e su Internet non ho trovato niente di risolutivo, finché, alle 9 di sera, ho deciso di insospettirmi del fatto che Helios (Eclipse 3.6) creasse una cartella di nome .eclipse/org.eclipse.platform-3.5.0 nella mia home, e ho messo questo in Google, trovando finalmente il bug report nel tracker di Eclipse.

A quanto pare il nuovo Eclipse vuole scrivere nella directory di installazione quando si installano nuovi plugin. Controllando, infatti, si trova un permesso rws sul gruppo in diverse sottodirectory.

A questo punto ho semplicemente fatto un

chown -R root.adm /usr/local/eclipse-3.6

e ho assegnato il mio utente al gruppo adm (lo era già, in realtà). Tutto ha ripreso a funzionare senza problemi. Mi riservo di valutare i rischi di questa operazione, ma a una prima occhiata sembrano abbastanza limitati (un plugin può spattumare Eclipse, ma nel caso lo reinstallo, e lo poteva fare già prima).

Android

Lo so, sono masochista.

Sul sito di Android è scritto chiaramente di NON usare Helios perché ci sono dei bug irrisolti. Ma io ho la testa dura. E comunque ho tenuto la vecchia versione di Eclipse installata, giusto in caso…

Con Helios ho provato a creare un nuovo progetto di test, con target Android 2.2 e minSdk 3 (Android 1.5). Lo crea e mi dà subito errore dicendo di non trovare la package “android”. Lo aggiungo a mano tra le Referenced Libraries del progetto, e gli errori spariscono, ma ora mi dà errore di conversione da Java a Dalvik. Indagherò nelle prossime ore/giorni.

Io pensavo che i problemi si limitassero a un bug già segnalato, peraltro correggibile in modo abbastanza semplice (Window->Preferences, XML->XML Files->Editor, togliere la spunta a “Use inferred grammar…”).

Update 10:10

Il problema con il package android si risolve semplicemente: Window->Preferences, quindi General->Workspace->Linked Resources, attivare la spunta su “Enable Linked Resources”. Bisogna farlo prima di creare o scaricare qualsiasi progetto Android, altrimenti non ho idea di come aggiungerlo in seguito. :)