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 0×0, 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 0×0, 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. :)

I conti… tornano?

Quando si inizia ad avere la sensazione di vivere in paese destinato a diventare “terzo mondo”.

Stavo leggendo l’ultimo numero di Wired, quando trovo un articolo intitolato “Iran, la lunga marcia online verso la libertà”, in cui leggo:

L’Iran è online da vent’anni, e ha uno dei livelli più alti di accesso alla rete in tutto il Medio Oriente (stimato intorno al 40%), oltre al maggior tasso di aumento di utenti (passati dal milione del 2005 ai 23 milioni del 2008).

Arrivato in ufficio, più tardi, trovo una notizia su ZeusNews titolata “Crescono le internaute italiane“, in cui leggo:

Dei circa 20 milioni di italiani online, 8,3 milioni sono donne (il 32%)…

…e mi chiedo come possa un paese in cui è fortissima la censura, il controllo statale, la repressione, essere più avanti di noi (la popolazione totale è più o meno la stessa) nell’accesso a Internet.

Sarà un problema di mentalità? Di ignoranza? Di mancanza di infrastrutture? Di ostruzionismo?

Linux Day 2009 a Treviso

Nona edizione del Linux Day.

Sabato prossimo, 24 ottobre, si svolge in tutta Italia il Linux Day, manifestazione nazionale promossa da Italian Linux Society e realizzata a livello locale da oltre 100 Linux User Group.

A Treviso l’appuntamento è ormai fisso presso l’ITIS Max Planck di Lancenigo di Villorba, in via Franchini 1, dalle 10:00 alle 18:00.

Quest’anno la formula cambia leggermente, per cercare di venire incontro al meglio alle richieste del pubblico.

La mattina sarà tutta dedicata a una panoramica generale sul mondo Linux, a cosa è, a come funziona e a che software si possono utilizzare. Ampio spazio per le domande del pubblico.

Il pomeriggio prevede due percorsi possibili:

  • in aula magna tre talk da seguire: Virtualizzazione con Virtualbox, SME server e Appliance di rete con Linux
  • in aula “on demand” talk su quello che vuole il pubblico: richiedete un argomento e noi ve ne parliamo (nei limiti del possibile :) )

Per tutta la giornata i membri del TVLUG saranno a disposizione per chiacchierare, per farvi vedere cosa si può fare con Linux e per aiutarvi a installare Linux sul vostro PC o per copiarvi CD e DVD delle ultime distribuzioni uscite.

Venite a trovarci!