TiNoleggio & Partners
Posted by Davide | Filed under PHP, Work
Non allarmatevi, non mi riferisco ad una manifestazione con cantante lirico e ospiti internazionali, nè ad una società di revisione conti, ma all’ultimo progetto che sto seguendo.
Parlo di www.tinoleggio.it, portale di ricerca comparata per il noleggio di mezzi di trasporto, dall’automobile alla barca, creazione di una giovane start-up milanese che nel suo arsenale web annovera anche www.tiprovo.it e altri diversi progetti interessanti ancora in cantiere. TiNoleggio permette di trovare le tariffe (teoricamente) più basse sul mercato grazie alle numerose partnership intrecciate con società di noleggio o altri aggregatori di prezzi. Queste partnership commerciali devono naturalmente essere tradotte in software: e qui arriviamo al perchè sono stato chiamato 15 giorni fa a dare il mio contributo al progetto (se ve lo state chiedendo: sì, è squillato il telefono rosso che tengo nascosto dietro il quadro di Rembrandt)
Ci sono due problemi da risolvere. Il primo è che le modalità di accesso ai dati forniti dai partner, tramite le quali effettuare le ricerche, sono abbastanza variegate: database, API, siti web sui quali lanciare spider. Il secondo è che, all’aumentare dei partner, aumenta anche il tempo computazionale di ricerca, ed è fondamentale evitare di raggiungere il famigerato TAU (Traguardo di Assopimento Utente).
Uniformare i partner
La soluzione al primo problema è semplice: incapsuliamo i partner e i loro meccanismi di ricerca all’interno di una serie di classi polimorfe. Abbiamo quindi diverse classi Partner, contenenti definizioni e dettagli relativi ai partner, e PartnerSearchEngine, che incorporano la logica di ricerca sui dati del partner. In questo modo viene definita una linea guida per creare un futuro partner, in modo totalmente indolore, in quanto il motore di ricerca di TiNoleggio non dovrà essere riadattato per gestire la nuova integrazione: saprà già quali metodi chiamare per ottenere ciò che gli serve.

Parallelizzare le ricerche
Anche qui non parliamo di rocket science: se 3 processi ci mettono 3, 5 e 7 secondi ad eseguirsi, e vogliamo che il tempo di esecuzione totale sia sotto i 15 secondi, dovremo eseguirli in parallelo. Il tempo di esecuzione totale sarà quello di esecuzione del processo più lento (in linea teorica; bisogna tenere in considerazione l’overhead e il maggior consumo di risorse hardware).
In PHP, abbiamo due modi per eseguire processi paralleli: l’utilizzo delle fork e la chiamata di script lanciati in background (su Unix, in questo caso) Dato che le fork sono assolutamente sconsigliate in ambiente Apache, si ricade forzatamente sulla seconda opzione. Ci sono diverse funzioni che permettono di eseguire script in background: io ho utilizzato proc_open, flessibile e potente.

Oltre alla parallelizzazione dei processi di ricerca dei partner, è stato implementato un ulteriore livello di parallelizzazione: quello delle richieste HTTP, nel caso in cui la ricerca preveda l’utilizzo di chiamate ad API del partner o spidering del loro sito. Tutto ciò è stato ottenuto utilizzando la libreria cURL (modulo PHP da installare a parte), della quale ho incapsulato le funzinoalità in un paio di classi, per facilitarne l’utilizzo.
;+execute()]+->[Curl].jpg)
Come sempre, consigli e commenti sono sempre ben accetti!
La potenza degli iteratori in PHP
Posted by Davide | Filed under PHP
Il titolo è forse un po’ troppo ad effetto, però se siete arrivati a leggere fin qui è proprio perchè incuriositi dalla roboanza. Ora siete imprigionati in questo post e userete iteratori vita natural durante.
Ma cosa sono gli iteratori? Sono l’implementazione di un design pattern – l’Iterator, appunto – che ha come scopo quello di risolvere un problema: manipolare collezioni di dati in maniera semplice, utilizzando un’interfaccia uniforme e comune a tutti gli iteratori.
Vi capitasse di fare un giro sulla documentazione della Standard PHP Library vi si potrebbe aprire un mondo; per chi ha fretta, invece, ecco una serie di slide con un po’ di applicazioni pratiche. Codice più uniforme, meno ripetizioni, meno errori.
Certificazione, mission accomplished
Posted by Davide | Filed under PHP
Non siete stati abbastanza veloci nel rispondere al post precedente, così ho fatto (stranamente) di testa mia e, dopo ben mezz’ora di studio e inenarrabili lotte per trovare parcheggio vicino alla sede d’esame, da stamane sono un (orgoglioso?) possessore di una Zend PHP 5 Certification, uno dei 60 in Italia (280 in UK, 400 in Germania).
Ah, fosse stato così anche all’università!
PHP Zend Certification, prenderla o no?
Posted by Davide | Filed under PHP
Sono sempre stato scettico sulla certificazione PHP proposta dalla Zend: a volte basta davvero una chiacchierata, o un occhio ai lavori svolti, per testare l’effettiva competenza di una persona. Inoltre, il certificato certifica (appunto) quanto uno sviluppatore sa di PHP e delle problematiche che ruotano intorno a lui, ma non prende in considerazione logiche di programmazione e best practices.
Sto però iniziando ad avere qualche dubbio.
Poco tempo fa ho trovato un’offerta di lavoro della Nintendo in cui si specificava che la certificazione sarebbe stata titolo gradito; senza contare che in qualità di web developer ho sviluppato i miei progetti più grossi perchè girassero su intranet, e che quindi non ho un portfolio da portare in dote ad un eventuale colloquio di lavoro.
Oggi ho provato il test di certificazione online, acquistabile sul sito Zend: passato senza troppi patemi, ma l’impressione è che chi non ha una vasta esperienza con PHP possa avere difficoltà. E che quindi la certificazione possa essere una discriminante tra chi usa PHP come linguaggio tutto fare e chi lo usa per applicazioni complesse.
Insomma, che dite: mi iscrivo ad una sessione di esame?
Netbeans, IDE per PHP
Posted by Davide | Filed under PHP
Si dice che l’IDE sia estensione stessa dello sviluppatore: se ne trova uno che abbia le funzionalità che ci servono e si impara ad usarlo in maniera veloce e produttiva.
Nella notte dei tempi usavo Homesite di Adobe, buono per creare pagine HTML tempestate di codice PHP (e viceversa) ma davvero poco per lo sviluppo serio (infatti l’hanno dismesso). Poi c’è stato Eclipse PDT, completo ma davvero troppo pesante e dal crash facile su Ubuntu. Mi sono quindi buttato su cose più leggere: Kate e GEdit (con le modifiche trendy & cool per farlo assomigliare a TextMate).
Infine, eccoci qua: Netbeans. Non l’avevo mai considerato perché non pensavo avesse un’estensione per PHP, e invece non solo ce l’ha ma, con sorpresa, gestisce tutto quello che mi può servire: debugging, unit testing (con PHPUnit), integrazione con Symfony. E quelle funzionalità base, come l’auto completamento del codice e la navigazione dei sorgenti, sviluppate in maniera intuitiva e che non richiedono troppi smanettamenti nella configurazione.
Installare un progetto Symfony su Aruba
Posted by Davide | Filed under Web Development
Ultimamente mi e’ capitato di sviluppare un paio di siti utilizzando Symfony come framework di sviluppo e Aruba come hosting provider.
Come risaputo, a fronte di un costo davvero concorrenziale, Aruba non è certo la soluzione ideale per chi sviluppa, con i suoi pochi margini di configurazione (devo dire comunque molto ampliati, rispetto a qualche anno fa).
Installare un progetto Symfony su Aruba non è semplice, ma comunque possibile. Ecco quindi come feci l’impresa. Molti spunti sono presi dalla guida per installare Symfony su OVH, un hosting provider francese.
Test della configurazione
Scaricate lo script per testare la configurazione del server, uploadatelo su Aruba e puntatelo con browser
Nel mio caso, ritorna
******************************** * * * symfony requirements check * * * ******************************** php.ini used by PHP: /etc/apache/phpini/php5/php.ini ** Mandatory requirements ** OK PHP version is at least 5.2.4 OK php.ini has zend.ze1_compatibility_mode set to off ** Optional checks ** OK PDO is installed OK PDO has some drivers installed: sqlite2, sqlite, mysql OK PHP-XML module is installed OK XSL module is installed OK The token_get_all() function is available OK The mb_strlen() function is available OK The iconv() function is available OK The utf8_decode() is available [[WARNING]] A PHP accelerator is installed: FAILED *** Install a PHP accelerator like APC (highly recommended) *** [[WARNING]] php.ini has short_open_tag set to off: FAILED *** Set it to off in php.ini *** [[WARNING]] php.ini has magic_quotes_gpc set to off: FAILED *** Set it to off in php.ini *** [[WARNING]] php.ini has register_globals set to off: FAILED *** Set it to off in php.ini *** OK php.ini has session.auto_start set to off
Tutto più o meno OK, ma dobbiamo gestire i magic_quotes e register_global (vanno settati ad off)
Potete entrare nel pannello di configurazione di Aruba e selezionare un php.ini adeguato, oppure più semplicemente aggiungere un file project/config/php.yml per fixare il problema, scrivendo
check: magic_quotes_gpc: on register_globals: on
Struttura delle directory
L’aspetto sicuramente più noioso è quello che la struttura delle directory di Symfony non è adatta a quella della document root di Aruba.
Se in Symfony abbiamo, ad esempio
mySite /project /web /css /index.php
su Aruba dobbiamo avere
www.mysite.it /project /css index.php
Quindi: spostiamo la directory project in web.
Modificate poi il file index.php in modo che punti correttamente a web/project/config
Modificate config/ProjectConfiguration, aggiungendo
$this->setWebDir($this->getRootDir().'/..');
Congeliamo il progetto
Adesso è necessario incorporare le librerie di Symfony all’interno del nostro progetto.
Rimuovere quindi la directory web/sf e lanciate
symfony freeze <data_dir>
(nel mio caso, <data_dir> è /usr/share/php/symfony, su Linux)
Lanciate
symfony cc
per eliminare la cache, e uploadate il progetto sul server.
Ultimi accorgimenti
Per ultimo, date i permessi 777 alle directory project/cache, project/log e upload su Aruba. E ricordate che ogni volta che copiate nuovi file sul server, bisogna cancellare il contenuto della directory project/cache.
In caso riceviate Internal Server Error 500, provate a rimuovere option follow symlink da .htaccess.
E attenzione ad utilizzare la protezione password da admin: cancella il file .htaccess.
phpDay 2009
Posted by Davide | Filed under PHP
Vi ricordate il post in cui affermavo di andare al Wordcamp? Beh – scordatelo, non ci andrò più, visto che sarò in Sardegna per una sessione di lavoro! (e no, non è un villaggio turistico)
In compenso, durante il weekend appena trascorso, ho avuto il piacere di partecipare al phpDay 2009, evento organizzato dal GrUSP, la community italiana su PHP appunto.
I talk, tranne qualche – soporifero – caso, sono stati interessanti; evito di tediarvi con i verbali, ecco comunque le keyword che maggiormente mi sono rimaste impresse, o perchè ho avuto il riscontro della loro validità, o perchè sicuramente avrò voglia di approfondire:
Salta niente all’occhio? A me sì: nessuna di queste keyword è strettamente legata a PHP
Mi sono iscritto al WordCamp 2009!
Posted by Davide | Filed under Wordpress
A Milano, il 22 e 23 maggio, si svolgerà il WordCamp 2009, un barcamp incentrato su Wordpress e quello che gli gira intorno: blog, tecnologie, metodi, usabilità e quant’altro.
Io ci sarò, in qualità di curioso. Se qualcuno ha intenzione di andarci, come sempre, mi faccia un fischio!
Funzioni anonime e closures in PHP 5.3
Posted by Davide | Filed under Programmazione
Fino ad oggi in PHP era possibile creare funzioni anonime (lambda) utilizzando la funzione create_function, ma il suo utilizzo non mi ha mai convinto, sapeva troppo di eval. Essendo abituato a Javascript, e a jQuery, trovo questa sintassi molto più funzionale:
var a = 5;
var myFunc = function (b) {
return a + b;
};
a = 10;
alert( myFunc(2) ); //print 7
L’utilizzo di a all’interno di myFunc è chiamata closure: il valore di a viene bindato (legato) nello scope di myFunc, e rimarrà invariato nel tempo.
Dalla prossima versione di PHP, la 5.3, sarà possibile fare qualcosa del tutto simile. Ecco come:
$a = 5;
$myFunc = function ( $b ) use ( $a ) {
return $a + $b;
};
$a = 10;
echo $myFunc( 2 ); // print 7
Notare che in PHP le closures vanno dichiarate esplicitamente con l’utilizzo del comando use.
Per quanto sia contento di questa nuova feature, rimango perplesso sulla linea con cui viene sviluppato ed aggiornato PHP: si prosegue con la mancanza di convenzioni, e a volte, come in questo caso, funzionalità nuove sanno più di patch che di improvement.
Sul sito di PHP trovate maggiori info, mentre in questo PDF sono elencate tutte le nuove features di PHP 5.3
Via: Zaemis
Debugging con PHP e XDebug
Posted by Davide | Filed under PHP
Diciamolo: a (quasi) tutti piace PHP per la propria facilità d’uso. Semplice da installare e configurare, altrettanto da programmare. Ma quando il gioco si fa duro, ecco che si sente la mancanza di quegli strumenti che rendono un linguaggio di programmazione solido. Nello specifico, di un debugger.
Ok lo ammetto, per anni anche io mi sono districato tra echo e print_r inseriti nelle pagine per andare alla ricerca degli errori. Naturalmente la musica è cambiata non appena ho perso quell’oretta necessaria ad installare e configurare un debugger PHP. Vediamo come.
Per prima cosa, installiamo Xdebug.
Xdebug è un modulo PHP, probabilmente già disponibile attraverso il vostro pacchettizzatore di fiducia sotto Linux. Altrimenti, sorgente compilabile o modulo per Windows sono disponibili sul sito ufficiale.
Il modulo va copiato nella extension_dir di PHP (verificarne la locazione nel php.ini).
Sempre nel php.ini, vanno aggiunti alcuni parametri di configurazione. Nel mio caso, ne sono stati necessari solo alcuni, ma controllate la documentazione in caso fosse necessario specificarne di diversi:
[XDebug]
zend_extension = "path/to/xdebug.so"
xdebug.remote_enable = On
xdebug.remote_log = "/path/to/logs/xdebug.log"
Riavviate quindi Apache e verificate la corretta installazione del modulo tramite il classico phpinfo().
Ora che disponete del motore, passiamo all’abitacolo: il client. La lista è lunga, io ho fatto in tempo a testarne positivamente un paio, ovvero VIM e Eclipse. Eclipse in particolare, nella forma del PHP Development Tools, permette un debugging completo, con breakpoints, watch e tutto il necessaire. La configurazione sotto Eclipse dovrebbe essere piuttosto semplice: basta settare XDebug come debugger principale, al posto dello Zend, gli altri parametri dovrebbero essere già a posto.
Un’altra funzionalità della quale non riesco più a fare a meno è quella del profiling. Tramite questo processo siamo in grado di individuare quali parti del nostro programma impiegano la maggior percentuale del tempo totale di esecuzione, permettendoci di risolvere eventuali colli di bottiglia.
Per abilitare il profiling, è necessario tornare sul php.ini e aggiungere queste righe:
xdebug.profiler_enable = On
xdebug.profiler_output_dir = "/path/to/profiles/"
Il profiler non necessita di un client; è sufficiente aggiungere il parametro XDEBUG_PROFILE=1 alla nostra pagina web per avviarlo (es. http://localhost/test.php?XDEBUG_PROFILE=1).
In quella che avete settato come directory di xdebug.profiler_output_dir, verranno creati dei file del formato cachegrind.out.xxxx; apriteli con kcachegrind (Linux) o wincachegrind (Windows) per vedere come si è comportato il vostro script.