<?xml version="1.0" encoding="UTF-8"?> <rss
version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
><channel><title>Fullo &#187; symfony</title> <atom:link href="http://www.fullo.net/blog/tag/symfony/feed/" rel="self" type="application/rss+xml" /><link>http://www.fullo.net/blog</link> <description>nulla e&#039; impossibile per chi non lo deve fare!</description> <lastBuildDate>Mon, 12 Dec 2011 18:31:45 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.3.1</generator> <item><title>Ottimizzare symfony su DreamHost</title><link>http://www.fullo.net/blog/2009/08/04/ottimizzare-symfony-su-dreamhost/</link> <comments>http://www.fullo.net/blog/2009/08/04/ottimizzare-symfony-su-dreamhost/#comments</comments> <pubDate>Tue, 04 Aug 2009 10:08:21 +0000</pubDate> <dc:creator>fullo</dc:creator> <category><![CDATA[php]]></category> <category><![CDATA[webdev]]></category> <category><![CDATA[apache]]></category> <category><![CDATA[dreamhost]]></category> <category><![CDATA[ideato]]></category> <category><![CDATA[mod_deflate]]></category> <category><![CDATA[mod_expires]]></category> <category><![CDATA[ottimizzazione]]></category> <category><![CDATA[symfony]]></category> <category><![CDATA[yslow]]></category><guid
isPermaLink="false">http://www.fullo.net/blog/?p=2640</guid> <description><![CDATA[<p><a
href="http://www.twitornot.com"></a> Qualche giorno fa, come esperimento personale, ho aggiornato (grazie all'aiuto di <a
href="http://federicomoretti.name/">Federico</a> per il layout), <a
href="http://twitornot.com">TwitOrNot</a>. Di per sè l'applicazione è abbastanza banale, ma l'esercizio è stato fatto per testare alcune idee che da qualche tempo mi giravano per il cervello.</p><p>Innanzitutto, <a
href="http://twitornot.com">TwitOrNot</a> migra dalla versione 1.1 alla 1.2.x di [...]]]></description> <content:encoded><![CDATA[<p><a
href="http://www.twitornot.com"><img
src="http://www.fullo.net/blog/wp-content/uploads/2009/08/twitornot-symfony-on-dreamhost1.png" alt="twitornot: symfony on dreamhost optimization" title="twitornot: symfony on dreamhost optimization" width="500" height="191" class="alignleft size-full wp-image-2644" /></a> Qualche giorno fa, come esperimento personale, ho aggiornato (grazie all'aiuto di <a
href="http://federicomoretti.name/">Federico</a> per il layout), <a
href="http://twitornot.com">TwitOrNot</a>. Di per sè l'applicazione è abbastanza banale, ma l'esercizio è stato fatto per testare alcune idee che da qualche tempo mi giravano per il cervello.</p><p>Innanzitutto, <a
href="http://twitornot.com">TwitOrNot</a> migra dalla versione 1.1 alla 1.2.x di <a
href="http://symfony.it">symfony</a>, nel suo piccolo implementa l'autenticazione <a
href="http://apiwiki.twitter.com/OAuth-FAQ">oAuth</a> di <a
href="http://fullo.net/blog/search/twitter">Twitter</a> non salvando in locale le password ma gestendo tutto tramite le API di quest'ultimo. Altra miglioria è stata la sostituzione, indolore visto l'esiguo numero di tabelle, di Propel con <a
href="http://www.doctrine-project.org/">Doctrine</a>, usando per quest'ultimo <a
href="http://www.symfony-project.org/doctrine/1_2/en/07-Migrations">gli script di migrazione</a> per gestire future implementazioni.</p><p>La cosa su cui però mi sono divertito di più è stata l'ottimizzazione dell'applicazione per l'utilizzo su un hosting come <a
href="http://www.dreamhost.com/r.cgi?98914">DreamHost</a> utilizzando <a
href="http://developer.yahoo.com/yslow/">ySlow</a> come calibro del mio lavoro.</p><p>Utilizzando lo script di analisi di Yahoo!, l'applicazione, nuda e cruda, presentava un bel D (a volte E) come risultato. Successivamente portato, tramite tweak del file di default <code>.htaccess</code> di symfony ad un onestissimo B (a volte C).</p><p>Vediamo in dettaglio i passaggi fatti.</p><p><span
id="more-2640"></span></p><p>Settiamo come prima cosa nel file <code>settings.yml</code> della nostra applicazione il parametro <code>etags</code> a true proseguiamo l'opera di ottimizzazione modificando il file <code>.htaccess</code> presente nella directory web della nostra applicazione symfony così come segue.</p><p>Fortunatamente DreamHost mette a nostra disposizione i moduli <code>mod_expires</code>, <code>mod_headers</code> e <code>mod_deflate</code> per Apache già abilitati, altrimenti se state usando un vostro server darò per scontato che siano stati abilitati. Inoltre <a
href="http://www.dreamhost.com/r.cgi?98914">DreamHost</a> utilizza FastCGI, purtroppo però con APC disabilitato (anche se è possibile, <a
href="http://www.ercoppa.org/blog-PHP-53--Xdebug--APC-install-script-per-Dreamhost.htm">con qualche trick</a>, abilitarlo).</p><div
class="igBar"><span
id="lcode-6"><a
href="#" onclick="javascript:showCodeTxt('code-6'); return false;">PLAIN TEXT</a></span></div><div
class="syntax_hilite"><span
class="langName">CODE:</span><div
id="code-6"><div
class="code"><ol><li
style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">Options +FollowSymLinks +ExecCGI</div></li><li
style="font-weight: bold;color:#26536A;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li
style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&lt;IfModule mod_expires.<span
style="">c</span>&gt;</div></li><li
style="font-weight: bold;color:#26536A;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; FileETag None</div></li><li
style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li
style="font-weight: bold;color:#26536A;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; ExpiresActive On</div></li><li
style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; ExpiresDefault <span
style="color:#CC0000;">"access plus 300 seconds"</span></div></li><li
style="font-weight: bold;color:#26536A;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; ExpiresByType text/html <span
style="color:#CC0000;">"access plus 1 day"</span></div></li><li
style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; ExpiresByType text/css <span
style="color:#CC0000;">"access plus 10 day"</span></div></li><li
style="font-weight: bold;color:#26536A;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; ExpiresByType text/javascript <span
style="color:#CC0000;">"access plus 10 day"</span></div></li><li
style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; ExpiresByType image/gif <span
style="color:#CC0000;">"access plus 10 day"</span></div></li><li
style="font-weight: bold;color:#26536A;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; ExpiresByType image/jpg <span
style="color:#CC0000;">"access plus 10 day"</span></div></li><li
style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; ExpiresByType image/png <span
style="color:#CC0000;">"access plus 10 day"</span></div></li><li
style="font-weight: bold;color:#26536A;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; ExpiresByType image/x-icon <span
style="color:#CC0000;">"access plus 90 day"</span></div></li><li
style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&lt;/IfModule&gt;</div></li><li
style="font-weight: bold;color:#26536A;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li
style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&lt;IfModule mod_deflate.<span
style="">c</span>&gt;</div></li><li
style="font-weight: bold;color:#26536A;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; AddOutputFilterByType DEFLATE text/html text/plain text/xml text/javascript text/css application/javascript</div></li><li
style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&lt;/IfModule&gt;</div></li><li
style="font-weight: bold;color:#26536A;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li
style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">#il restante .<span
style="">htaccess</span> ufficiale</div></li></ol></div></div></div><p></p><p>Vediamo punto per punto quello che è stato fatto.</p><div
class="igBar"><span
id="lcode-7"><a
href="#" onclick="javascript:showCodeTxt('code-7'); return false;">PLAIN TEXT</a></span></div><div
class="syntax_hilite"><span
class="langName">CODE:</span><div
id="code-7"><div
class="code"><ol><li
style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&lt;IfModule mod_expires.<span
style="">c</span>&gt;</div></li><li
style="font-weight: bold;color:#26536A;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; FileETag None</div></li></ol></div></div></div><p></p><p>Innanzitutto, dopo aver controllato che il modulo <a
href="http://httpd.apache.org/docs/2.0/mod/mod_expires.html">mod_expires</a> sia stato attivato, disabilito la generazione degli <a
href="http://httpd.apache.org/docs/2.2/mod/core.html#fileetag">ETAG di Apache</a> in modo da forzare il browser a credere agli header che saranno passati dal server senza controllare nella sua cache. Altra conseguenza del disabilitare gli ETAG è che, se la nostra applicazione prevede l'accesso a molti file contemporaneamente (non è il caso di TwitOrNot) <strong>viene ridotto il carico di lavoro di I/O</strong> in quanto non vengono controllate, ad ogni richiesta, le informazioni sulle risorse richieste.</p><div
class="igBar"><span
id="lcode-8"><a
href="#" onclick="javascript:showCodeTxt('code-8'); return false;">PLAIN TEXT</a></span></div><div
class="syntax_hilite"><span
class="langName">CODE:</span><div
id="code-8"><div
class="code"><ol><li
style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">ExpiresActive On</div></li><li
style="font-weight: bold;color:#26536A;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; ExpiresDefault <span
style="color:#CC0000;">"access plus 300 seconds"</span></div></li><li
style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; ExpiresByType text/html <span
style="color:#CC0000;">"access plus 1 day"</span></div></li><li
style="font-weight: bold;color:#26536A;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; ExpiresByType text/css <span
style="color:#CC0000;">"access plus 10 day"</span></div></li><li
style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; ExpiresByType text/javascript <span
style="color:#CC0000;">"access plus 10 day"</span></div></li><li
style="font-weight: bold;color:#26536A;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; ExpiresByType image/gif <span
style="color:#CC0000;">"access plus 10 day"</span></div></li><li
style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; ExpiresByType image/jpg <span
style="color:#CC0000;">"access plus 10 day"</span></div></li><li
style="font-weight: bold;color:#26536A;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; ExpiresByType image/png <span
style="color:#CC0000;">"access plus 10 day"</span></div></li><li
style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; ExpiresByType image/x-icon <span
style="color:#CC0000;">"access plus 90 day"</span></div></li></ol></div></div></div><p></p><p>Ecco quindi che inviamo gli header modificati in modo che il browser sappia cosa, e come, mettere in cache. E' molto importante fare un attento tuning degli expire header da configurare. Infatti se è abbastanza sensato far si che la favicon sia salvata in cache per lunghi periodi di tempo ( <code>ExpiresByType image/x-icon "access plus 90 day"</code> ) lo è un pò di meno per i file html che potrebbero essere modificati anche più volte al giorno. Nel caso specifico di TwitOrNot ho preferito configurare l'expire ad 1 giorno, ma avrei potuto benissimo abbassare la soglia a qualche ora, così come avrei potuto alzare la soglia di javascript e css a valori più alti.</p><p>Sconsiglio di usare <code>Modified</code> come metodo di default di expire, in quanto se non modificate le immagini per lunghi periodi di tempo i browser cercheranno di riscaricarle ogni volta.</p><div
class="igBar"><span
id="lcode-9"><a
href="#" onclick="javascript:showCodeTxt('code-9'); return false;">PLAIN TEXT</a></span></div><div
class="syntax_hilite"><span
class="langName">CODE:</span><div
id="code-9"><div
class="code"><ol><li
style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&lt;IfModule mod_deflate.<span
style="">c</span>&gt;</div></li><li
style="font-weight: bold;color:#26536A;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; AddOutputFilterByType DEFLATE text/html text/plain text/xml text/javascript text/css application/javascript</div></li><li
style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&lt;/IfModule&gt;</div></li></ol></div></div></div><p></p><p>Dopo aver modificato gli header e gli expire, in modo da ottimizzare la cache del browser, è tempo di concentrarsi sulla riduzione della banda utilizzata. Per farlo ho usato <a
href="http://httpd.apache.org/docs/2.2/mod/mod_deflate.html">mod_deflate</a>, ottima alternativa al vecchio <a
href="http://sourceforge.net/projects/mod-gzip/">mod_gzip</a> e (cosa importante) supportato pienamente anche su sistemi non LAMP. La configurazione proposta per il metodo è abbastanza banale, forzo che tutti i file di testo serviti dal server siano compressi. Se pensate che da 140kb di prototype (puro) si può passare a meno di 30k la soluzione è più che soddisfacente.</p><p>Usare <code>mod_deflate</code> è sicuramente un'ottima soluzione se la vostra applicazione offre delle API JSON, o genera un gran numero di pagine HTML di cui volete ridurre il bandwidth footprint. Se però avete solo qualche file javascript potreste limitarvi al solo <a
href="http://developer.yahoo.com/yui/compressor/">YUI compressor</a> per ridurre voi stessi le dimensioni degli stessi, piuttosto che andare ad incidere sulla CPU della vostra macchina.</p><p>Un altro trucchetto, da usare con symfony, consiste nell'inserire all'interno di una action particolarmente pesante, e che non deve essere aggiornata troppo di frequente il seguente comando:</p><div
class="igBar"><span
id="lcode-10"><a
href="#" onclick="javascript:showCodeTxt('code-10'); return false;">PLAIN TEXT</a></span></div><div
class="syntax_hilite"><span
class="langName">CODE:</span><div
id="code-10"><div
class="code"><ol><li
style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">$this-&gt;<span
style="">getResponse</span><span
style="color:#006600; font-weight:bold;">&#40;</span><span
style="color:#006600; font-weight:bold;">&#41;</span>-&gt;<span
style="">setHttpHeader</span><span
style="color:#006600; font-weight:bold;">&#40;</span><span
style="color:#CC0000;">'Last-Modified'</span>, $this-&gt;<span
style="">getResponse</span><span
style="color:#006600; font-weight:bold;">&#40;</span><span
style="color:#006600; font-weight:bold;">&#41;</span>-&gt;<span
style="">getDate</span><span
style="color:#006600; font-weight:bold;">&#40;</span>$timestamp<span
style="color:#006600; font-weight:bold;">&#41;</span><span
style="color:#006600; font-weight:bold;">&#41;</span>;</div></li></ol></div></div></div><p></p><p>questo forzerà all'interno dell'output di symfony l'inserimento di un header con valore <code>Last-Modified</code> uguale al <code>$timestamp</code> dichiarato. Se ad esempio la vostra action invoca un oggetto che ha l'attributo <em>automagico</em> <code>updated_at</code>, potreste usare quest'ultimo come valore del timestamp da applicare all'header.</p><p>Come ultimi approfondimenti, lato <a
href="http://www.symfony.it">symfony</a>, vi suggerisco di leggere il <a
href="http://www.symfony-project.org/book/1_2/18-Performance">capitolo 18 della guida definitiva a symfony</a> ed a dare un occhio alla documentazione di <a
href="http://pecl.php.net/package/memcached">memcached</a> (a cui, forse, dedicherò un post in futuro).</p><p>ciuaz</p> ]]></content:encoded> <wfw:commentRss>http://www.fullo.net/blog/2009/08/04/ottimizzare-symfony-su-dreamhost/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Twit Or Not, ovvero scrivere applicazioni durante un barcamp</title><link>http://www.fullo.net/blog/2009/01/22/twit-or-not-ovvero-scrivere-applicazioni-durante-un-barcamp/</link> <comments>http://www.fullo.net/blog/2009/01/22/twit-or-not-ovvero-scrivere-applicazioni-durante-un-barcamp/#comments</comments> <pubDate>Thu, 22 Jan 2009 21:36:10 +0000</pubDate> <dc:creator>fullo</dc:creator> <category><![CDATA[php]]></category> <category><![CDATA[tecnologia]]></category> <category><![CDATA[webdev]]></category> <category><![CDATA[agilecamp]]></category> <category><![CDATA[api]]></category> <category><![CDATA[grusp]]></category> <category><![CDATA[hotornot]]></category> <category><![CDATA[ideato]]></category> <category><![CDATA[mashup]]></category> <category><![CDATA[symfony]]></category> <category><![CDATA[twitornot]]></category> <category><![CDATA[twitter]]></category><guid
isPermaLink="false">http://www.fullo.net/blog/?p=2568</guid> <description><![CDATA[<p>Sabato scorso ho partecipato all'<a
href="http://barcamp.org/AgileCamp2009">AgileCamp</a> organizzato dai ragazzi di <a
href="http://www.sketchin.ch">Sketchin</a>. L'evento è stato molto piacevole e mi ha permesso, oltre che a sentire talk molto interessanti, di rivedere un po' di quei contatti con cui si dice sempre "un giorno faremo qualcosa insieme".</p><p>Con <a
href="http://garakkio.altervista.org/">Massimiliano</a> c'è già qualcosa in ballo (e che [...]]]></description> <content:encoded><![CDATA[<p>Sabato scorso ho partecipato all'<a
href="http://barcamp.org/AgileCamp2009">AgileCamp</a> organizzato dai ragazzi di <a
href="http://www.sketchin.ch">Sketchin</a>. L'evento è stato molto piacevole e mi ha permesso, oltre che a sentire talk molto interessanti, di rivedere un po' di quei contatti con cui si dice sempre "<em>un giorno faremo qualcosa insieme</em>".</p><p>Con <a
href="http://garakkio.altervista.org/">Massimiliano</a> c'è già qualcosa in ballo (e che presto vedrete online) ma li per li è venuta l'idea di non sprecare l'occasione "agile" per fare un po' di <a
href="http://en.wikipedia.org/wiki/Pair_programming">pair programming</a> e tirar fuori un'applicazioncina stupida in meno di un'oretta a cui pensavo da qualche settimana.</p><p>Ovvero <a
href="http://www.twitornot.com">Twit Or Not</a>.</p><p><span
id="more-2568"></span></p><p>Questa applicazione, scritta in <a
href="http://www.symfony.it">Symfony</a>, non fa altro che mimare i classici "<em>hot or not</em>" per valutare "<em>l'indice di noiosità</em>" di alcuni utenti di <a
href="http://twitter.com">Twitter</a> e relativi twit. In tutta onestà non avrei scommesso un soldo bucato ad un possibile utilizzo (non parlo neanche di successo) della stessa, la realtà è che in meno di 3 giorni l'applicazione ha macinato quasi mille <em>utenti noiosi</em> ed un discreto numero di voti e che mi ha portato ad aggiungere qualche nuova feature, indispensabile, come la visualizzazione degli avatar.</p><p>La cosa interessante è che ora, galvanizzato ed in piena fase creativa, sto già pensando a dare discreto ritocco all'interfaccia in un'ottica più 2.0 (ammettiamolo, sembra quasi che abbia tirato fuori il layout da un frontpage 2000) ed a come risolvere alcuni dei problemi più gravi riscontrati.</p><p>Per ora il problema principale è la <a
href="http://mashable.com/2009/01/21/twitter-api-gets-limited">limitazione degli accessi alle API di Twitter</a> da un unico server, non ho ancora raggiunto tali volumi ma vorrei evitare di trovarmi il sito bloccato per problemi esterni. Inoltre ho riscontrato in più occasioni una inconsistenza delle API stesse dovendo implementare rudimentali sistemi di degradazione del codice (non avevo tanta voglia di impazzirci sopra).</p><p>Insomma mi si è aperto un piccolo mondo di possibilità per divertirmi, come non facevo da tempo, per risolvere problemi autoindotti e per migliorare le attuali soluzioni già implementate (come la classe per Symfony per <a
href="http://www.symfony-project.org/plugins/idTwitterClientPlugin">accedere alle API di Twitter</a> che sarà probabilmente interamente rifattorizzata per supportare caching delle chiamate ).</p><p>Ah già.. se vi chiedete se gli adsense sul <a
href="http://www.twitornot.com">sito</a> fruttino... beh... finora hanno totalizzato 10.000 visite ed un incasso di 0,01 cent... direi di no! :)</p><p>Ah, già... ringrazio tutti i miei fans che mi stanno votando come l'utente più noioso di Twitter! :D</p><p>ciauz</p> ]]></content:encoded> <wfw:commentRss>http://www.fullo.net/blog/2009/01/22/twit-or-not-ovvero-scrivere-applicazioni-durante-un-barcamp/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Twitto, un framework PHP da 140 caratteri</title><link>http://www.fullo.net/blog/2009/01/12/twitto-un-framework-php-da-140-caratteri/</link> <comments>http://www.fullo.net/blog/2009/01/12/twitto-un-framework-php-da-140-caratteri/#comments</comments> <pubDate>Mon, 12 Jan 2009 19:30:12 +0000</pubDate> <dc:creator>fullo</dc:creator> <category><![CDATA[open source]]></category> <category><![CDATA[php]]></category> <category><![CDATA[tecnologia]]></category> <category><![CDATA[framework]]></category> <category><![CDATA[php5.3]]></category> <category><![CDATA[symfony]]></category> <category><![CDATA[twitter]]></category> <category><![CDATA[twitto]]></category><guid
isPermaLink="false">http://www.fullo.net/blog/archives/2009/01/12/twitto-un-framework-php-da-140-caratteri/</guid> <description><![CDATA[<p>Ad opera di <a
href="http://www.aide-de-camp.org/">Fabien Potencier</a>, già autore di <a
href="http://www.symfony.it">Symfony</a>, ecco l'ennesimo framework per PHP. Si chiama <a
href="http://twitto.org/">Twitto</a> ed ha la peculiarità  di essere scritto in soli 140 caratteri! :)</p> <a
href="#" onclick="javascript:showCodeTxt('code-11'); return false;">PLAIN TEXT</a> CODE: require __DIR__.'/c.php';if &#40;!is_callable&#40;$c = @$_GET&#91;'c'&#93; ?: function&#40;&#41; &#123; echo 'Woah!'; &#125;&#41;&#41; throw new Exception&#40;'Error'&#41;;$c&#40;&#41;;<p></p><p>Da [...]]]></description> <content:encoded><![CDATA[<p>Ad opera di <a
href="http://www.aide-de-camp.org/">Fabien Potencier</a>, già autore di <a
href="http://www.symfony.it">Symfony</a>, ecco l'ennesimo framework per PHP. Si chiama <a
href="http://twitto.org/">Twitto</a> ed ha la peculiarità  di essere scritto in soli 140 caratteri! :)</p><div
class="igBar"><span
id="lcode-12"><a
href="#" onclick="javascript:showCodeTxt('code-12'); return false;">PLAIN TEXT</a></span></div><div
class="syntax_hilite"><span
class="langName">CODE:</span><div
id="code-12"><div
class="code"><ol><li
style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">require __DIR__.<span
style="color:#CC0000;">'/c.php'</span>;if <span
style="color:#006600; font-weight:bold;">&#40;</span>!is_callable<span
style="color:#006600; font-weight:bold;">&#40;</span>$c = @$_GET<span
style="color:#006600; font-weight:bold;">&#91;</span><span
style="color:#CC0000;">'c'</span><span
style="color:#006600; font-weight:bold;">&#93;</span> ?: function<span
style="color:#006600; font-weight:bold;">&#40;</span><span
style="color:#006600; font-weight:bold;">&#41;</span> <span
style="color:#006600; font-weight:bold;">&#123;</span> echo <span
style="color:#CC0000;">'Woah!'</span>; <span
style="color:#006600; font-weight:bold;">&#125;</span><span
style="color:#006600; font-weight:bold;">&#41;</span><span
style="color:#006600; font-weight:bold;">&#41;</span> throw new Exception<span
style="color:#006600; font-weight:bold;">&#40;</span><span
style="color:#CC0000;">'Error'</span><span
style="color:#006600; font-weight:bold;">&#41;</span>;$c<span
style="color:#006600; font-weight:bold;">&#40;</span><span
style="color:#006600; font-weight:bold;">&#41;</span>;</div></li></ol></div></div></div><p></p><p>Da notare che il framework in questione sfrutta al suo interno tutte le <a
href="http://www.ibm.com/developerworks/opensource/library/os-php-5.3new1/index.html">nuove</a> <a
href="http://www.ibm.com/developerworks/opensource/library/os-php-5.3new2/index.html">potenzialità </a> dell'imminente php 5.3</p> ]]></content:encoded> <wfw:commentRss>http://www.fullo.net/blog/2009/01/12/twitto-un-framework-php-da-140-caratteri/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>SymfonyCamp sto arrivando!</title><link>http://www.fullo.net/blog/2008/09/11/symfonycamp-sto-arrivando/</link> <comments>http://www.fullo.net/blog/2008/09/11/symfonycamp-sto-arrivando/#comments</comments> <pubDate>Thu, 11 Sep 2008 07:30:41 +0000</pubDate> <dc:creator>fullo</dc:creator> <category><![CDATA[eventi]]></category> <category><![CDATA[php]]></category> <category><![CDATA[conferenze]]></category> <category><![CDATA[ideato]]></category> <category><![CDATA[lavoro]]></category> <category><![CDATA[symfony]]></category> <category><![CDATA[symfonycamp]]></category> <category><![CDATA[viaggi]]></category><guid
isPermaLink="false">http://www.fullo.net/blog/?p=2478</guid> <description><![CDATA[<p>Il 2008 si può annoverare come uno dei più geek mai passati, ho potuto partecipare a molti eventi per webduepuntoisti, smanettoni e nerd e parteciperò ad altrettanti nei prossimi 3 mesi.</p><p>Questo weekend, snobbando la <a
href="http://www.blogfest.it/">blogsfera italiana</a> (anche se la cosa mi dispiace un bel po', ma ormai sono avvezzo ad <a
href="http://www.fullo.net/blog/search/onnipresenza">eventi tutti [...]]]></description> <content:encoded><![CDATA[<p><a
href="http://www.symfonycamp.com/"><img
src="http://www.fullo.net/blog/wp-content/uploads/2008/09/symfonycamp_logo.png" alt="symfony camp" title="symfonycamp_logo" width="450" height="66" class="size-full wp-image-2479" /></a><br
/> Il 2008 si può annoverare come uno dei più geek mai passati, ho potuto partecipare a molti eventi per webduepuntoisti, smanettoni e nerd e parteciperò ad altrettanti nei prossimi 3 mesi.</p><p>Questo weekend, <em>snobbando</em> la <a
href="http://www.blogfest.it/">blogsfera italiana</a> (anche se la cosa mi dispiace un bel po', ma ormai sono avvezzo ad <a
href="http://www.fullo.net/blog/search/onnipresenza">eventi tutti nello stesso giorno</a>), andrò al <a
href="http://www.symfonycamp.com/">SymfonyCamp</a> in Olanda.</p><p><a
href="http://www.symfony.it">Symfony</a> è ormai uno dei framework da me più usati per lavoro grazie alla sua versatilità e predisposizione a progetti non banali. Conoscere tutti i principali sviluppatori,  magari per iniziarne a far parte, non potrà che far bene a me ed ai ragazzi di <a
href="http://www.ideato.it">Ideato</a>. ;)</p><p>ciuaz</p> ]]></content:encoded> <wfw:commentRss>http://www.fullo.net/blog/2008/09/11/symfonycamp-sto-arrivando/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Twitter su Symfony 1.1</title><link>http://www.fullo.net/blog/2008/07/30/twitter-su-symfony-11/</link> <comments>http://www.fullo.net/blog/2008/07/30/twitter-su-symfony-11/#comments</comments> <pubDate>Wed, 30 Jul 2008 16:54:56 +0000</pubDate> <dc:creator>fullo</dc:creator> <category><![CDATA[php]]></category> <category><![CDATA[webdev]]></category> <category><![CDATA[api]]></category> <category><![CDATA[plugin]]></category> <category><![CDATA[symfony]]></category> <category><![CDATA[twitter]]></category><guid
isPermaLink="false">http://www.fullo.net/blog/?p=2456</guid> <description><![CDATA[<p>Ho appena rilasciato la prima versione del plugin per <a
href="http://www.symfony.it">Symfony 1.1</a> che permette di utilizzare tutte le api di <a
href="http://www.twitter.com">Twitter</a>, comprese le nuove relative al motore di ricerca.</p><p>Il plugin, chiamato con tanta fantasia <a
href="http://trac.symfony-project.org/wiki/idTwitterClientPlugin">idTwitterClientPlugin</a>, permette quindi di modificare il proprio status, scaricare nei formati disponibili le varie timeline messe a disposizione [...]]]></description> <content:encoded><![CDATA[<p>Ho appena rilasciato la prima versione del plugin per <a
href="http://www.symfony.it">Symfony 1.1</a> che permette di utilizzare tutte le api di <a
href="http://www.twitter.com">Twitter</a>, comprese le nuove relative al motore di ricerca.</p><p>Il plugin, chiamato con tanta fantasia <a
href="http://trac.symfony-project.org/wiki/idTwitterClientPlugin">idTwitterClientPlugin</a>, permette quindi di modificare il proprio status, scaricare nei formati disponibili le varie timeline messe a disposizione da Twitter (pubblico, proprio, followers, messaggi privati, etc) e di usare i nuovi <a
href="http://search.twitter.com/operators">operatori di ricerca</a> di <a
href="http://search.twitter.com/operators">Summize</a>.</p><p>ciuaz</p> ]]></content:encoded> <wfw:commentRss>http://www.fullo.net/blog/2008/07/30/twitter-su-symfony-11/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>phpDay 2008, un bell&#8217;evento&#8230; a metà</title><link>http://www.fullo.net/blog/2008/05/29/phpday-2008-un-bellevento-a-meta/</link> <comments>http://www.fullo.net/blog/2008/05/29/phpday-2008-un-bellevento-a-meta/#comments</comments> <pubDate>Thu, 29 May 2008 22:42:46 +0000</pubDate> <dc:creator>fullo</dc:creator> <category><![CDATA[eventi]]></category> <category><![CDATA[php]]></category> <category><![CDATA[conferenze]]></category> <category><![CDATA[grusp]]></category> <category><![CDATA[phpday]]></category> <category><![CDATA[phpday2008]]></category> <category><![CDATA[rimini]]></category> <category><![CDATA[symfony]]></category><guid
isPermaLink="false">http://www.fullo.net/blog/?p=2433</guid> <description><![CDATA[<p><a
href="http://www.flickr.com/photos/fullo/2531636469/" title="Microsoft Staff di fullo, su Flickr"></a> Finalmente trovo una serata da dedicare al blog ed a scrivere qualche commento sull'edizione 2008 del <a
href="http://www.phpday.it">phpDay</a> che si è tenuta a Rimini la scorsa settimana.</p><p>L'evento è piaciuto, è indiscutibile.</p><p>Con i ragazzi del <a
href="http://www.grusp.it">GrUSP</a> ormai l'organizzazione è sempre più semplice da gestire [...]]]></description> <content:encoded><![CDATA[<p><a
href="http://www.flickr.com/photos/fullo/2531636469/" title="Microsoft Staff di fullo, su Flickr"><img
src="http://farm3.static.flickr.com/2195/2531636469_1868a2ac52_m.jpg" width="240" height="180" alt="Microsoft Staff" align="left" class="immagine" border="0" /></a> Finalmente trovo una serata da dedicare al blog ed a scrivere qualche commento sull'edizione 2008 del <a
href="http://www.phpday.it">phpDay</a> che si è tenuta a Rimini la scorsa settimana.</p><p>L'evento è piaciuto, è indiscutibile.</p><p>Con i ragazzi del <a
href="http://www.grusp.it">GrUSP</a> ormai l'organizzazione è sempre <em>più semplice</em> da gestire (sfighe permettendo) e la qualità degli interventi aumenta di anno in anno.</p><p>Anche la nuova formula del secondo giorno dedicato ai workshop è stata particolarmente apprezzata, sono stati trattati temi di difficile approfondimento in una sola ora di talk e soprattutto è stato coinvolta la platea rendendola partecipe (ed in <a
href="http://www.phpday.it/site/phpday-2008/calendario-conferenze/workshop/1430-1730-sviluppo-agile-ed-extreme-programming/">alcuni casi protagonista</a>) del workshop stesso.</p><p>I relatori inoltre sono stati decisamente ispirati, il <a
href="http://www.phpday.it/site/phpday-2008/calendario-conferenze/canale-developers/">canale developer</a> ha visto (rispetto agli altri anni) talk di integrazione di php con altri ambienti (<a
href="http://www.phpday.it/site/phpday-2008/calendario-conferenze/canale-developers/php-e-java/">java</a>, <a
href="http://www.phpday.it/site/phpday-2008/calendario-conferenze/canale-developers/la-piattaforma-microsoft-e-php-5/">silverlight</a> e webservices) e di nuove metodologie di sviluppo "agnostiche" e/o importate da altri linguaggi/piattaforme. Segnale questo che lo <em>sviluppatore php occasionale</em> sta, negli ultimi anni, diventando sempre più un professionista attento a tutto ciò che lo circonda ed aperto a nuovi stimoli. Decisamente un segnale positivo.</p><p>Anche la presenza di <a
href="http://www.phpday.it/site/phpday-2008/calendario-conferenze/workshop/introduzione-a-symfony-11/">Fabien Potencier</a>, papà di <a
href="http://www.symfony.it">Symfony</a>, con un workshop di ben 4 ore sulle novità della futura versione 1.1 del framework, attualmente, più maturo per il mondo PHP ha destato sicuramente un certo interesse, facendoci raccogliere adesioni ben oltre le nostre aspettative per questo workshop.</p><p>Ma non sono tutte rose e fiori.</p><p><span
id="more-2433"></span></p><p>Quest'anno l'organizzazione di due giorni ha portato al risicato staff di quattro persone un bel po' di grattacapi.</p><p>La difficoltà riscontrata per soddisfare i problemi di logistica per ospitare oltre 300 persone (si erano iscritti 400 / 160 visitatori, e se ne sono presentati 180 / 150 rispettivamente nelle due giornate), la mancanza di sponsor "<em>facoltosi</em>" che ogni anno si fanno sempre più radi (aumentando comunque le nostre spese) e la nostra disorganizzazione (un <em>mea culpa</em> ci vuole tutto) per la gestione delle notifiche via email ci hanno portato a riflettere per il futuro di questo evento.</p><p>Vogliamo mantenere il phpDay gratuito ed aperto a tutti (nonostante da più parti ci viene chiesto il contrario), ma per farlo dobbiamo avere certezze e purtroppo l'indice di drop-off di una conferenza gratuita non è ben calcolabile (finora ci siamo sempre attestati ad un onesto 30% e mai avremmo immaginato il 60% di quest'anno).</p><p>Stiamo quindi valutando se aprire iscrizioni a pagamento per il prossimo anno, con rimborso in caso di partecipazione... chessò un 6 € di preiscrizione e 5 € di rimborso se ci si presenta (tenendo 1 € per ripagare le transazioni bancarie). Oppure di organizzare parallelamente un canale workshop a pagamento per "ingolosire" le aziende che pensano che una manifestazione <em>gratis</em> non sia di qualità e contemporaneamente rimpinguare le magre risorse dell'associazione... non saprei... ma di tempo per decidere ce ne sarà... :)</p><p>Infine qualche ringraziamento.</p><p>Innanzitutto all'eroe ufficiale del phpDay 2008: <a
href="http://gggeek.altervista.org/">Gaetano Giunta</a>.</p><p>Quest'uomo è riuscito a fare un <a
href="http://www.phpday.it/site/phpday-2008/calendario-conferenze/canale-enterprise/ez-systems-php-inside/">talk</a> ed un <a
href="http://www.phpday.it/site/phpday-2008/calendario-conferenze/workshop/introduzione-agli-ez-component/">workshop</a> arrivando a Rimini da Parigi nonostante scioperi di treni ed aerei, attacchi intestinali, mancanza cronica di mezzi pubblici ed alberghi posizionati dalla parte opposta (di qualsiasi cosa).</p><p>Poi vorrei ringraziare gli sponsor: <a
href="http://www.flickr.com/photos/fullo/2531636469/in/pool-phpday2008">Microsoft</a>, <a
href="http://www.flickr.com/photos/fullo/2535107928/">Zend</a> e CodeGear ormai pilastri dell'evento ed a Teleperformance (nell'incarnazione di <a
href="http://gattolino.blogspot.com/">Morten</a>) e <a
href="http://www.openx.org/">OpenX</a> che ci hanno salvato le chiappette in corner.</p><p>Se venerdì avete sbevacchiato qualcosa tra un talk e l'altro è merito loro!</p><p>Vorrei ringraziare lo staff di Claudia di Yahoo che ha coinvolto <a
href="http://lerdorf.com/bio.php">Rasmus</a> per inviarci un video con il keynote (purtroppo non pubblicabile al di fuori dell'evento) ed <a
href="http://www.delymyth.net">Elena</a> che ci ha fornito il supporto video e tecnico per tutto il venerdì.</p><p>Un grazie anche agli altri 3 dell'avemaria... <a
href="http://blog.tassoman.com">Tassoman</a>, <a
href="http://www.cesaredamico.com/">Cesare</a> e <a
href="http://www.beccati.com">Matteo</a>. A tutti gli altri relatori, ai soci GrUSP ed a chi è venuto a mangiare a spese dell'organizzazione alla cena di venerdì ed al pranzo del sabato (ma vi siete <a
href="http://www.grusp.it/essere-socio/">iscritti</a>?!).</p><p>E come finale di questo lunghissimo post qualche risorsa utile:</p><ul><li>I <a
href="http://www.ictv.it/speciali/start/10/php-day-2008/">video su ICTV.it</a> di HTML.it</li><li>I video sui canali UStream dei talk <a
href="http://www.ustream.tv/channel/phpday2008">Developer</a> ed <a
href="http://http://www.ustream.tv/channel/phpday2008-ent">Enterprise</a></li><li>Il gruppo fotografico su <a
href="http://www.flickr.com/groups/phpday2008/pool/">Flickr</a></li><li>I video pubblicati da <a
href="http://video.google.com/videosearch?q=delymyth+phpday&#038;sitesearch=#">Elena</a></li></ul><p>ciuaz</p> ]]></content:encoded> <wfw:commentRss>http://www.fullo.net/blog/2008/05/29/phpday-2008-un-bellevento-a-meta/feed/</wfw:commentRss> <slash:comments>5</slash:comments> </item> <item><title>phpDay alle porte!</title><link>http://www.fullo.net/blog/2008/05/18/phpday-alle-porte/</link> <comments>http://www.fullo.net/blog/2008/05/18/phpday-alle-porte/#comments</comments> <pubDate>Sun, 18 May 2008 00:57:25 +0000</pubDate> <dc:creator>fullo</dc:creator> <category><![CDATA[eventi]]></category> <category><![CDATA[php]]></category> <category><![CDATA[phpday]]></category> <category><![CDATA[phpday08]]></category> <category><![CDATA[rimini]]></category> <category><![CDATA[symfony]]></category> <category><![CDATA[zend]]></category><guid
isPermaLink="false">http://www.fullo.net/blog/?p=2430</guid> <description><![CDATA[<p>Si preannuncia una settimana di inferno, a parte gli impegni lavorativi sempre più pressanti, tra il 22 ed il 24 Maggio sarò infatti in quel di Rimini al <a
href="http://www.phpday.it">phpDay</a> organizzato dal <a
href="http://www.grusp.it">GrUSP</a> di cui sono presidente.</p><p>Giusto per farvi venire un po' di acquolina vi cito i numeri di quest'anno:</p> due giornate di [...]]]></description> <content:encoded><![CDATA[<p>Si preannuncia una settimana di inferno, a parte gli impegni lavorativi sempre più pressanti, tra il 22 ed il 24 Maggio sarò infatti in quel di Rimini al <a
href="http://www.phpday.it">phpDay</a> organizzato dal <a
href="http://www.grusp.it">GrUSP</a> di cui sono presidente.</p><p>Giusto per farvi venire un po' di acquolina vi cito i numeri di quest'anno:</p><ul><li>due giornate di evento, una classica ed una caratterizzata da workshop di 4 ore l'uno</li><li>oltre 14 interventi tra talk e workshop</li><li>ospiti internazionali e presentazione dei principali framework sul mercato</li><li>circa 300 iscritti per la giornata di venerdì e 200 per i workshop di sabato</li></ul><p>E se questo non vi bastasse vi ricordo che l'evento è gratuito e che si sta cercando, tempo e mezzi permettendo, di organizzare una festa in spiaggia per sabato sera.</p><p>Speriamo che vada tutto bene!</p><p>ciuaz</p> ]]></content:encoded> <wfw:commentRss>http://www.fullo.net/blog/2008/05/18/phpday-alle-porte/feed/</wfw:commentRss> <slash:comments>6</slash:comments> </item> <item><title>Symfony 1.0 ed Ajax</title><link>http://www.fullo.net/blog/2007/03/01/symfony-10-ed-ajax/</link> <comments>http://www.fullo.net/blog/2007/03/01/symfony-10-ed-ajax/#comments</comments> <pubDate>Thu, 01 Mar 2007 14:03:04 +0000</pubDate> <dc:creator>fullo</dc:creator> <category><![CDATA[ajax]]></category> <category><![CDATA[php]]></category> <category><![CDATA[webdev]]></category> <category><![CDATA[php 5]]></category> <category><![CDATA[prototype]]></category> <category><![CDATA[symfony]]></category> <category><![CDATA[tips]]></category><guid
isPermaLink="false">http://www.fullo.net/blog/archives/2007/03/01/symfony-10-ed-ajax/</guid> <description><![CDATA[<p>E' finalmente stata rilasciata la prima versione stabile di <a
href="http://www.symfony-project.com">Symfony</a> 1.0. Noto application framework per PHP 5 di cui <a
href="http://www.fullo.net/blog/search/symfony">ho già discusso</a> più volte e che ho iniziato ad usare attivamente nell'ultimo mese e mezzo grazie ad un lavoro con <a
href="http://www.cphp.it">Ciccio</a> (mio guru sull'argomento).</p><p>Tra le magie di questa versione, perchè alcune [...]]]></description> <content:encoded><![CDATA[<p>E' finalmente stata rilasciata la prima versione stabile di <a
href="http://www.symfony-project.com">Symfony</a> 1.0. Noto application framework per PHP 5 di cui <a
href="http://www.fullo.net/blog/search/symfony">ho già discusso</a> più volte e che ho iniziato ad usare attivamente nell'ultimo mese e mezzo grazie ad un lavoro con <a
href="http://www.cphp.it">Ciccio</a> (mio guru sull'argomento).</p><p>Tra le magie di questa versione, perchè alcune cose ancora non me le spiego, ieri mi sono imbattuto nella gestione degli script con ajax. Symfony <a
href="http://www.symfony-project.com/book/trunk/11-Ajax-Integration">integra al suo interno Prototype</a> (più o meno come fa anche Ruby) dando allo sviluppatore alcuni <code>helper</code> per attivarne le funzionalità.</p><p>La cosa stupenda è che il sistema sa se il metodo che è invocato è ajax o meno e gestisce di conseguenza il relativo templating. Cosa utilissima per non dover riscrivere due volte lo stesso codice e soprattutto per permetterne un certo livello di degradazione.</p><p><span
id="more-2226"></span></p><p>Unica piccola pecca, a mio vedere, è che <a
href="http://www.prototypejs.org/api/ajax/updater">alcuni metodi di Prototype</a> hanno subito un renaming. Quindi ad esempio al posto di <code>Parameter</code> dovrete in Symfony usare il parametro <code>with</code>. Non molto intuitiva per chi conosce già la libreria js...</p><p>Comunque sia per darvi un assaggio delle potenzialità e semplicità di utilizzo per ottenere:</p><div
class="igBar"><span
id="lcode-15"><a
href="#" onclick="javascript:showCodeTxt('code-15'); return false;">PLAIN TEXT</a></span></div><div
class="syntax_hilite"><span
class="langName">CODE:</span><div
id="code-15"><div
class="code"><ol><li
style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&lt;a href=<span
style="color:#CC0000;">"#"</span> onclick=<span
style="color:#CC0000;">"new Ajax.Updater('ajaxid', '/webapp/aggiorna', {asynchronous:true, evalScripts:true, onComplete:function(request, json){new Effect.Appear('ajaxid', {});}, parameters:'param1='+ $('param1').value + '&amp;param2='+$('param2').value }); return false;"</span>&gt;</div></li><li
style="font-weight: bold;color:#26536A;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">click me to update</div></li><li
style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&lt;/a&gt;</div></li><li
style="font-weight: bold;color:#26536A;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&lt;div id=<span
style="color:#CC0000;">"ajaxid"</span> style=<span
style="color:#CC0000;">"display: none;"</span>&gt;&lt;/div&gt;</div></li></ol></div></div></div><p></p><p>bisognerà in symfony usare il seguente codice:</p><div
class="igBar"><span
id="lphp-16"><a
href="#" onclick="javascript:showCodeTxt('php-16'); return false;">PLAIN TEXT</a></span></div><div
class="syntax_hilite"><span
class="langName">PHP:</span><div
id="php-16"><div
class="php"><ol><li
style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&lt;div <span
style="color:#000000; font-weight:bold;">class</span>=<span
style="color:#FF0000;">"ajax_button"</span>&gt;</div></li><li
style="font-weight: bold;color:#26536A;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span
style="color:#000000; font-weight:bold;">&lt;?php</span></div></li><li
style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp;<a
href="http://www.php.net/echo"><span
style="color:#000066;">echo</span></a> link_to_remote<span
style="color:#006600; font-weight:bold;">&#40;</span></div></li><li
style="font-weight: bold;color:#26536A;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span
style="color:#FF0000;">'analizza informazioni'</span>, <a
href="http://www.php.net/array"><span
style="color:#000066;">array</span></a><span
style="color:#006600; font-weight:bold;">&#40;</span>&nbsp; &nbsp;<span
style="color:#FF0000;">'script'</span> =&gt; <span
style="color:#FF0000;">'true'</span>,</div></li><li
style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span
style="color:#FF0000;">'url'</span> =&gt; <span
style="color:#FF0000;">'webapp/aggiorna,</span></div></li><li
style="font-weight: bold;color:#26536A;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span
style="color:#FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'</span>with<span
style="color:#FF0000;">' =&gt; &quot;'</span>param1=<span
style="color:#FF0000;">'+ $('</span>param1<span
style="color:#FF0000;">').value +&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span></div></li><li
style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span
style="color:#FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'</span>&amp;param2=<span
style="color:#FF0000;">'+$('</span>param2<span
style="color:#FF0000;">').value &quot;</span></div></li><li
style="font-weight: bold;color:#26536A;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span
style="color:#FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'</span>update<span
style="color:#FF0000;">'=&gt;'</span>ajaxid<span
style="color:#FF0000;">',</span></div></li><li
style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span
style="color:#FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'</span>complete<span
style="color:#FF0000;">' =&gt; visual_effect('</span>appear<span
style="color:#FF0000;">', '</span>ajaxid<span
style="color:#FF0000;">')</span></div></li><li
style="font-weight: bold;color:#26536A;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span
style="color:#FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; )</span></div></li><li
style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span
style="color:#FF0000;">&nbsp; &nbsp; &nbsp;); </span></div></li><li
style="font-weight: bold;color:#26536A;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span
style="color:#FF0000;">?&gt;</span></div></li><li
style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span
style="color:#FF0000;">&lt;div id=&quot;ajaxid&quot; style=&quot;display: none&quot;&gt;&lt;/div&gt;</span></div></li><li
style="font-weight: bold;color:#26536A;"><div
style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span
style="color:#FF0000;">&lt;/div&gt; </span></div></li></ol></div></div></div><p></p><p>con una sola riga di php viene quindi generato lo script ajax che permette di caricare dinamicamente dei contenuti in un div preimpostato e di mostrarli usando un effetto di fade-in. Veramente non male! :D</p><p>ciuaz</p> ]]></content:encoded> <wfw:commentRss>http://www.fullo.net/blog/2007/03/01/symfony-10-ed-ajax/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>P.I.M. gestire le fatture con symfony</title><link>http://www.fullo.net/blog/2006/03/16/pim-gestire-le-fatture-con-symfony/</link> <comments>http://www.fullo.net/blog/2006/03/16/pim-gestire-le-fatture-con-symfony/#comments</comments> <pubDate>Thu, 16 Mar 2006 16:40:55 +0000</pubDate> <dc:creator>fullo</dc:creator> <category><![CDATA[open source]]></category> <category><![CDATA[php]]></category> <category><![CDATA[application]]></category> <category><![CDATA[bsd]]></category> <category><![CDATA[cphp]]></category> <category><![CDATA[fatture]]></category> <category><![CDATA[framework]]></category> <category><![CDATA[invoice]]></category> <category><![CDATA[opensource]]></category> <category><![CDATA[pim]]></category> <category><![CDATA[symfony]]></category> <category><![CDATA[web2.0]]></category><guid
isPermaLink="false">http://www.fullo.net/blog/archives/2006/03/16/pim-gestire-le-fatture-con-symfony/</guid> <description><![CDATA[<p>Ciccio ha finalmente <a
href="http://blog.cphp.it/2006/03/16/pim-10-personal-invoice-manager/">rilasciato la prima versione di P.I.M.</a> un softwarillo scritto in php usando il framework Symfony (di cui <a
href="http://www.fullo.net/blog/search/symfony">ho già parlato</a> in diverse occasioni) per la gestione delle fatture. Il progetto è nato perchè il soggetto in questione (diventato da poco libero professionista e mio esperto <a
href="http://ez.cphp.it">eZ publish</a> di fiducia) [...]]]></description> <content:encoded><![CDATA[<p>Ciccio ha finalmente <a
href="http://blog.cphp.it/2006/03/16/pim-10-personal-invoice-manager/">rilasciato la prima versione di P.I.M.</a> un softwarillo scritto in php usando il framework Symfony (di cui <a
href="http://www.fullo.net/blog/search/symfony">ho già parlato</a> in diverse occasioni) per la gestione delle fatture. Il progetto è nato perchè il soggetto in questione (diventato da poco libero professionista e mio esperto <a
href="http://ez.cphp.it">eZ publish</a> di fiducia) non sapeva più dove sbattere la testa per gestire decentemente i propri clienti [<em>quanto lo capisco ;) </em>].</p><p><a
href="http://pim.cphp.it/">PIM</a>, che è sotto licenza Open Source (BSD se non erro), ha come principali caratteristiche:</p><ul><li>gestione dei singoli clienti</li><li>gestione singole fatture con esiti di pagamento</li><li>gestione dei pagamenti IVA da fare</li><li>statistiche fatturato, iva da pagare e stato fatture</li><li>esportazione in PDF delle fatture</li></ul><p>il tutto accedibile tramite autenticazione e con quel pizzico di web 2.0 che non fa mai male ;)</p><p>Inoltre molto presto il <em>coraggioso programmatore</em> mi ha promesso di attivare un wiki dove si potranno discutere nuove features (sei spacciato).</p><p>Intanto vi avviso che appena tornerò da Dublino verrà hostata sul mio account di <a
href="http://www.dreamhost.com/r.cgi?fullo">Dreamhost con PHP5</a> una demo dell'applicazione :)</p><p>ciuaz</p> ]]></content:encoded> <wfw:commentRss>http://www.fullo.net/blog/2006/03/16/pim-gestire-le-fatture-con-symfony/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Symfony lessons</title><link>http://www.fullo.net/blog/2005/12/09/symfony-lessons/</link> <comments>http://www.fullo.net/blog/2005/12/09/symfony-lessons/#comments</comments> <pubDate>Fri, 09 Dec 2005 07:51:16 +0000</pubDate> <dc:creator>fullo</dc:creator> <category><![CDATA[ajax]]></category> <category><![CDATA[php]]></category> <category><![CDATA[framework]]></category> <category><![CDATA[php5]]></category> <category><![CDATA[symfony]]></category> <category><![CDATA[tutorial]]></category> <category><![CDATA[web2.0]]></category><guid
isPermaLink="false">http://www.fullo.net/blog/archives/2005/12/09/symfony-lessons/</guid> <description><![CDATA[<p>Il <a
href="http://www.symfony-project.com/">framework symfony</a> per php 5.x ha adesso anche un tutorial del tipo "qualcosa in n giorni". Il <a
href="http://www.symfony-project.com/askeet">primo ciclo di lezioni</a>, che dura 8 giorni, è già online e copre lo startup dell'applicazione, la spiegazione del modello MVC e l'uso delle form.</p><p>ciuaz</p>]]></description> <content:encoded><![CDATA[<p>Il <a
href="http://www.symfony-project.com/">framework symfony</a> per php 5.x ha adesso anche un tutorial del tipo "<em>qualcosa in n giorni</em>". Il <a
href="http://www.symfony-project.com/askeet">primo ciclo di lezioni</a>, che dura 8 giorni, è già online e copre lo startup dell'applicazione,   la spiegazione del modello MVC e l'uso delle form.</p><p>ciuaz</p> ]]></content:encoded> <wfw:commentRss>http://www.fullo.net/blog/2005/12/09/symfony-lessons/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> </channel> </rss>
<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using apc
Page Caching using apc
Database Caching 1/53 queries in 0.143 seconds using apc
Object Caching 896/1048 objects using apc

Served from: www.fullo.net @ 2012-02-04 03:17:09 -->
