<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2italianfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>clorophilla.blog</title>
	
	<link>http://www.clorophilla.net/blog</link>
	<description>blog goes here</description>
	<lastBuildDate>Thu, 01 Apr 2010 20:19:10 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.1</generator>
	<language>it</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<feedburner:info uri="clorophilla" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.5/</creativeCommons:license><image><link>http://creativecommons.org/licenses/by-nc-nd/2.5/</link><url>http://creativecommons.org/images/public/somerights20.gif</url><title>Some Rights Reserved</title></image><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://www.clorophilla.net/blog/?feed=rss2" /><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Fwww.clorophilla.net%2Fblog%2F%3Ffeed%3Drss2" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://www.clorophilla.net/blog/?feed=rss2" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Fwww.clorophilla.net%2Fblog%2F%3Ffeed%3Drss2" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Fwww.clorophilla.net%2Fblog%2F%3Ffeed%3Drss2" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Fwww.clorophilla.net%2Fblog%2F%3Ffeed%3Drss2" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Fwww.clorophilla.net%2Fblog%2F%3Ffeed%3Drss2" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare href="http://add.my.yahoo.com/content?lg=it&amp;url=http%3A%2F%2Fwww.clorophilla.net%2Fblog%2F%3Ffeed%3Drss2" src="http://eur.i1.yimg.com/eur.yimg.com/i/it/my/mioya1.gif">Subscribe with Mio Yahoo!</feedburner:feedFlare><item>
		<title>Succede solo il primo Aprile (reprise)</title>
		<link>http://feedproxy.google.com/~r/clorophilla/~3/TYOjWERShf8/</link>
		<comments>http://www.clorophilla.net/blog/?p=408#comments</comments>
		<pubDate>Thu, 01 Apr 2010 20:19:10 +0000</pubDate>
		<dc:creator>NRK</dc:creator>
				<category><![CDATA[Varie ed eventuali]]></category>
		<category><![CDATA[bla bla bla]]></category>
		<category><![CDATA[etc etc]]></category>
		<category><![CDATA[non ci crede nessuno]]></category>
		<category><![CDATA[non è uno scherzo]]></category>
		<category><![CDATA[primo aprile]]></category>

		<guid isPermaLink="false">http://www.clorophilla.net/blog/?p=408</guid>
		<description><![CDATA[Credevate che con il mio ultimo post, risalente esattamente a un anno fa (primo Aprile, ma del 2009 appunto), io stessi scherzando. In effetti anche io ne ero convinto, ma alla fine &#232; successo veramente: &#232; passato un anno prima di veder comparire un nuovo post su questo blog. Riproviamoci con un altro elenco puntato:

Dopo [...]]]></description>
			<content:encoded><![CDATA[<p>Credevate che con il mio ultimo post, risalente esattamente a un anno fa (primo Aprile, ma del 2009 appunto), io stessi scherzando. In effetti anche io ne ero convinto, ma alla fine &#232; successo veramente: &#232; passato un anno prima di veder comparire un nuovo post su questo blog. Riproviamoci con un altro elenco puntato:</p>
<ul>
<li>Dopo svariati anni ho cambiato completamente la pagina nella <a title="clorophilla.net" href="http://clorophilla.net/">root di questo dominio</a> pensando a qualcosa di molto semplice ma decisamente pi&#249; utile di quella precedente. </li>
<li><a title="Twitter / JoL1hAHN" href="Twitter / JoL1hAHN">Twitter</a> rules (lo ribadisco) e no, niente Facebook (ci tengo a ribadire anche questo). </li>
<li>Alla fine in Giappone ci sono stato! Circa 10 mesi fa a dire il vero. Che dire, ci vorrebbe un blog intero solo per raccontare l&#8217;esperienza. Ovviamente nei piani &#232; previsto un ritorno in pompa magna nel paese del Sol Levante, ma in un periodo non ancora definito. Posterei anche qualche fotografia, se solo avessi finito di sistemarle (sono fermo a 330 su circa 1200 foto).</li>
<li>Evviva gli EeePC. Windows 7 + Kubuntu sul disco e ArchLinux (con fluxbox) su chiave USB e posso fare praticamente tutto ovunque io sia. Tra l&#8217;altro &#232; solo qualche mese che utilizzo ArchLinux ma devo ammettere che mi sta piacendo molto come distribuzione.</li>
<li>Vorrei scrivere un blog &quot;tecnico&quot; in inglese, ma come potrei anche solamente pensarci quando non riesco ad aggiornare nemmeno quello nella mia lingua madre?</li>
<li>Tra l&#8217;altro girano leggende metropolitane tra qualche persona che conosco secondo cui un post che compare su questo blog &#232; presagio di impressionanti catastrofi, o quanto meno di tempo metereologico palesemente avverso per il fine settimana. Nel dubbio oggi &#232; caduta grandine, per il weekend staremo a vedere. </li>
<li>Ah, buona Pasqua.</li>
<li>42</li>
</ul>
<p>OK, lo ammetto, in realt&#224; era tutta una scusa per postare qualcosa dopo un anno esatto <img src='http://www.clorophilla.net/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  Mi piacerebbe ripartire, ma dovrei trovare prima il tempo e saper scegliere tra la miriade di argomenti che potrei trattare. Non sono sicuro di riuscirci, ma vedremo come andr&#224; <img src='http://www.clorophilla.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/clorophilla?a=TYOjWERShf8:UPsrpy5InlY:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/clorophilla?i=TYOjWERShf8:UPsrpy5InlY:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/clorophilla?a=TYOjWERShf8:UPsrpy5InlY:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/clorophilla?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/clorophilla?a=TYOjWERShf8:UPsrpy5InlY:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/clorophilla?d=YwkR-u9nhCs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/clorophilla?a=TYOjWERShf8:UPsrpy5InlY:ANkz6nJbUoM"><img src="http://feeds.feedburner.com/~ff/clorophilla?d=ANkz6nJbUoM" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/clorophilla?a=TYOjWERShf8:UPsrpy5InlY:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/clorophilla?i=TYOjWERShf8:UPsrpy5InlY:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/clorophilla/~4/TYOjWERShf8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.clorophilla.net/blog/?feed=rss2&amp;p=408</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.clorophilla.net/blog/?p=408</feedburner:origLink></item>
		<item>
		<title>Succede solo il primo di Aprile</title>
		<link>http://feedproxy.google.com/~r/clorophilla/~3/RlhrobtctTI/</link>
		<comments>http://www.clorophilla.net/blog/?p=405#comments</comments>
		<pubDate>Wed, 01 Apr 2009 10:58:27 +0000</pubDate>
		<dc:creator>NRK</dc:creator>
				<category><![CDATA[Varie ed eventuali]]></category>
		<category><![CDATA[etc etc]]></category>
		<category><![CDATA[giappone]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[IronRuby]]></category>
		<category><![CDATA[non è uno scherzo]]></category>
		<category><![CDATA[primo aprile]]></category>

		<guid isPermaLink="false">http://www.clorophilla.net/blog/?p=405</guid>
		<description><![CDATA[Esisto. Voglio dire, &#232; il primo di Aprile per cui quale occasione migliore per tornare a scrivere su questo blog dopo poco pi&#249; di 5 mesi dall&#8217;ultimo messaggio? Per&#242; non &#232; uno scherzo! Onestamente volevo fare cifra tonda e arrivare a 6 mesi, ma ormai credo di aver trascurato fin troppo questi lidi. Non star&#242; [...]]]></description>
			<content:encoded><![CDATA[<p>Esisto. Voglio dire, &#232; il primo di Aprile per cui quale occasione migliore per tornare a scrivere su questo blog dopo poco pi&#249; di 5 mesi dall&#8217;ultimo messaggio? Per&#242; non &#232; uno scherzo! Onestamente volevo fare cifra tonda e arrivare a 6 mesi, ma ormai credo di aver trascurato fin troppo questi lidi. Non star&#242; nemmeno a spiegarvi il perch&#233; e il percome di questa lunga pausa, anche perch&#233; onestamente credo ci sia ben poco di interessante, tuttavia nonostante impegni e riflessioni non sono stato con le mani in mano in giro per la rete:</p>
<ul>
<li>Ho iniziato a usare <a title="GitHub - Social Coding" href="https://github.com/">GitHub</a>, di conseguenza Git come DVCS, per <a title="GitHub - nrk&#39;s profile" href="http://github.com/nrk">condividere il codice su cui lavoro</a>. C&#8217;&#232; un po&#8217; di tutto: esperimenti come <a title="couchdb-lua-viewserver" href="http://github.com/nrk/couchdb-lua-viewserver/tree">couchdb-lua-viewserver</a> oppure <a title="hpricot-pure" href="http://github.com/nrk/hpricot-pure/tree">hpricot-pure</a> ma anche lavori un po&#8217; pi&#249; utili e seri come <a title="redis-lua" href="http://github.com/nrk/redis-lua/tree">redis-lua</a> oppure <a title="ironruby-hpricot" href="http://github.com/nrk/ironruby-hpricot/tree">ironruby-hpricot</a> e <a title="ironruby-json" href="http://github.com/nrk/ironruby-json/tree">ironruby-json</a>. </li>
<li>Proprio <a title="ironruby-hpricot" href="http://github.com/nrk/ironruby-hpricot/tree">ironruby-hpricot</a> e <a title="ironruby-json" href="http://github.com/nrk/ironruby-json/tree">ironruby-json</a> rappresentano i miei primi due progetti concreti per <a title="IronRuby" href="http://www.ironruby.net/">IronRuby</a> e sono i rispettivi i port delle librerie <a title="Home - hpricot - GitHub" href="http://wiki.github.com/why/hpricot">hpricot</a> e <a title="JSON implementation for Ruby" href="http://json.rubyforge.org/">json</a> (entrambe basate su <a title="Ragel State Machine Compiler" href="http://www.complang.org/ragel/">Ragel</a>) che sono disponibili per l&#8217;MRI. Ora come ora mi sto divertendo focalizzandomi principalmente sulla compatibilit&#224; di IronRuby con l&#8217;MRI, come del resto testimoniato dalla natura della decina di <a title="RubyForge: IronRuby" href="http://rubyforge.org/tracker/index.php?group_id=4359&amp;atid=16798">bug report</a> che ho aperto, ma prima o poi inizier&#242; anche con qualche progetto che si integri con il framework .NET (e ho gi&#224; qualche idea in merito, manca solo il tempo). </li>
<li>Con <a title="Daniele Alessandri (JoL1hAHN) on Twitter" href="http://twitter.com/JoL1hAHN">Twitter</a> ormai ci ho preso gusto, soprattutto negli ultimi 6 mesi. Ho potuto seguire botte-e-risposta interessanti, sono potuto entrare in contatto con gente altrettanto interessante e tecnicamente molto preparata, inoltre la velocit&#224; con cui &#232; possibile catturare notizie &#232; stupefacente. Certamente la percezione di &quot;interessante&quot; e di &quot;utile&quot; pu&#242; variare da persona a persona ed &#232; proprio per questo che, a chi fosse ancora scettico, non posso far altro che dire che solo con la prova sul campo &#232; possibile carpirne le potenzialit&#224;. Per la cronaca io stesso ero <a title="Mi mancava giusto Twitter" href="http://www.clorophilla.net/blog/?p=383">uno dei poco convinti</a>, se non addirittura uno dei suoi quasi-detrattori. Ah, per inciso non mi iscriver&#242; mai a Facebook. Si lo so, mai dire mai, ma c&#8217;&#232; sempre l&#8217;eccezione che conferma la regola. </li>
<li>Il mese scorso ho riesumato anche <a title="A tumblelog is fine too" href="http://nrk.tumblr.com/">il mio tublelog</a>, con tanto di nuovo look visto che quello vecchio faceva abbastanza schifo (il nuovo tema &#232; uno di quelli disponibili sulla galleria di temi di Tumblr ma con modifiche e adattamenti sparsi). </li>
<li>Giappone! Finalmente si sta per concretizzare un viaggio che per motivi sempre differenti sono stato costretto a rinviare pi&#249; volte negli ultimi 6 anni. In realt&#224; &#232; gi&#224; tutto pronto, manca solo la partenza <img src='http://www.clorophilla.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  OK non c&#8217;entra nulla con le mie attivit&#224; online, ma mi andava di dirlo lo stesso. </li>
</ul>
<p>Per ora chiudo qui, credo di avervi tediato abbastanza. Ora vedremo se riuscir&#242; a tener fede al fatto che questo post non vuole essere uno pesce d&#8217;Aprile, ovvero spero di riuscire a non scrivere il prossimo messaggio tra altri 5 mesi ma di dargli un seguito con qualcosa di pi&#249; interessante e tecnico entro breve.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/clorophilla?a=RlhrobtctTI:J2m1pWbgRCY:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/clorophilla?i=RlhrobtctTI:J2m1pWbgRCY:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/clorophilla?a=RlhrobtctTI:J2m1pWbgRCY:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/clorophilla?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/clorophilla?a=RlhrobtctTI:J2m1pWbgRCY:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/clorophilla?d=YwkR-u9nhCs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/clorophilla?a=RlhrobtctTI:J2m1pWbgRCY:ANkz6nJbUoM"><img src="http://feeds.feedburner.com/~ff/clorophilla?d=ANkz6nJbUoM" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/clorophilla?a=RlhrobtctTI:J2m1pWbgRCY:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/clorophilla?i=RlhrobtctTI:J2m1pWbgRCY:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/clorophilla/~4/RlhrobtctTI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.clorophilla.net/blog/?feed=rss2&amp;p=405</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.clorophilla.net/blog/?p=405</feedburner:origLink></item>
		<item>
		<title>This\is\lame\r\n … è un namespace, almeno in PHP 5.3</title>
		<link>http://feedproxy.google.com/~r/clorophilla/~3/rHxyZ7CDMZ0/</link>
		<comments>http://www.clorophilla.net/blog/?p=404#comments</comments>
		<pubDate>Sun, 26 Oct 2008 09:30:25 +0000</pubDate>
		<dc:creator>NRK</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[namespace]]></category>

		<guid isPermaLink="false">http://www.clorophilla.net/blog/?p=404</guid>
		<description><![CDATA[Finalmente la lunga saga dell&#8217;introduzione del supporto per i namespace in PHP 5.3 &#232; giunta, forse, al termine nelle ultime ore. Finalmente perch&#233; la discussione &#232; andata avanti per diversi mesi, con lunghi thread su php.internals aperti in maniera pressoch&#233; perpetua ma spesso abbastanza inconcludenti. Vi anticipo fin da subito il finale della storia, ma [...]]]></description>
			<content:encoded><![CDATA[<p>Finalmente la lunga saga dell&#8217;introduzione del supporto per i namespace in PHP 5.3 &#232; giunta, forse, al termine nelle ultime ore. <em>Finalmente</em> perch&#233; la discussione &#232; andata avanti per diversi mesi, con lunghi thread su php.internals aperti in maniera pressoch&#233; perpetua ma spesso abbastanza inconcludenti. Vi anticipo fin da subito il finale della storia, ma vi avviso che secondo me non &#232; dei migliori: &#232; stato deciso di sostituire <strong>::</strong> con il carattere <strong>\</strong> per identificare la separazione dei namespace.</p>
<p>Il problema principale della scelta di <strong>::</strong> come separatore per i namespace, secondo i core developer di PHP, risiede nel fatto che in alcuni casi pu&#242; crearsi un&#8217;ambiguit&#224; non risolvibile dall&#8217;interprete poich&#233; lo stesso <strong>::</strong> viene usato anche per accedere ai metodi di classe statici. Ecco un esempio pratico:</p>
<p>
<div class="wlWriterSmartContent" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:828eb20b-c1a1-4de0-af8c-fe4d70f03c12" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre  style="width:100%;;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #999999;"> 1</span> <span style="color: #008000;">//</span><span style="color: #008000;"> --------------------------------------
</span><span style="color: #999999;"> 2</span> <span style="color: #008000;">// primo caso: Classe::methodoStatico()</span><span style="color: #008000;">
</span><span style="color: #999999;"> 3</span> <span style="color: #008000;"></span><span style="color: #000000;">
</span><span style="color: #999999;"> 4</span> <span style="color: #000000;"></span><span style="color: #0000FF;">class</span><span style="color: #000000;"> Foo {
</span><span style="color: #999999;"> 5</span> <span style="color: #000000;">    </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> </span><span style="color: #0000FF;">function</span><span style="color: #000000;"> bar() {
</span><span style="color: #999999;"> 6</span> <span style="color: #000000;">        </span><span style="color: #0000FF;">echo</span><span style="color: #000000;"> </span><span style="color: #000000;">&quot;</span><span style="color: #000000;">Foo::bar()</span><span style="color: #000000;">&quot;</span><span style="color: #000000;">;
</span><span style="color: #999999;"> 7</span> <span style="color: #000000;">    }
</span><span style="color: #999999;"> 8</span> <span style="color: #000000;">}
</span><span style="color: #999999;"> 9</span> <span style="color: #000000;">
</span><span style="color: #999999;">10</span> <span style="color: #000000;">Foo</span><span style="color: #000000;">::</span><span style="color: #000000;">bar();
</span><span style="color: #999999;">11</span> <span style="color: #000000;">
</span><span style="color: #999999;">12</span> <span style="color: #000000;"></span><span style="color: #008000;">//</span><span style="color: #008000;"> --------------------------------------
</span><span style="color: #999999;">13</span> <span style="color: #008000;">// secondo caso: Namespace::funzione()</span><span style="color: #008000;">
</span><span style="color: #999999;">14</span> <span style="color: #008000;"></span><span style="color: #000000;">
</span><span style="color: #999999;">15</span> <span style="color: #000000;">namespace Foo;
</span><span style="color: #999999;">16</span> <span style="color: #000000;">
</span><span style="color: #999999;">17</span> <span style="color: #000000;"></span><span style="color: #0000FF;">function</span><span style="color: #000000;"> bar() {
</span><span style="color: #999999;">18</span> <span style="color: #000000;">    </span><span style="color: #0000FF;">echo</span><span style="color: #000000;"> </span><span style="color: #000000;">&quot;</span><span style="color: #000000;">Foo::bar()</span><span style="color: #000000;">&quot;</span><span style="color: #000000;">;
</span><span style="color: #999999;">19</span> <span style="color: #000000;">}
</span><span style="color: #999999;">20</span> <span style="color: #000000;">
</span><span style="color: #999999;">21</span> <span style="color: #000000;">Foo</span><span style="color: #000000;">::</span><span style="color: #000000;">bar();</span></div>
</pre>
</div>
<p>L&#8217;ambiguit&#224; delle righe 10 e 21 risulta evidente, tanto che anche l&#8217;interprete in questo caso non saprebbe come comportarsi. Per questo motivo gli sviluppatori di PHP hanno pensato di aggirare il problema cambiando appunto in <strong>\</strong> il separatore per i namespace.</p>
<p>Se doveste chiedermi cosa ne penso vi direi che, cos&#236; di primo acchito e pur non avendo da offrire soluzioni in merito alla questione, per conto mio l&#8217;idea non &#232; stata delle migliori. Senza alcun dubbio c&#8217;erano dei problemi, ma se da un lato &#232; vero che cos&#236; vengono risolte possibili ambiguit&#224;, con la scelta di <strong>\</strong> vedo l&#8217;introduzione di bug subdoli dovuti alla mancata attenzione nell&#8217;uso della quotazione singola o, in caso contrario, un errato escaping.</p>
<p><div class="wlWriterSmartContent" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:0bf2f9a5-ecd6-4d06-986d-39705a5c4910" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre  style="width:100%;;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #800080;">$singleQuote</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> ReflectionClass(</span><span style="color: #000000;">'</span><span style="color: #000000;">foo\bar\className</span><span style="color: #000000;">'</span><span style="color: #000000;">);
</span><span style="color: #800080;">$doubleQuoteWithEscape</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> ReflectionClass(</span><span style="color: #000000;">&quot;</span><span style="color: #000000;">foo\\bar\\</span><span style="color: #800080;">$classNameInVar</span><span style="color: #000000;">&quot;</span><span style="color: #000000;">);
</span></div>
</pre>
</div>
<p>Ad ogni modo vi fornisco alcuni link la cui lettura pu&#242; tornarvi utili per farvi un&#8217;opinione sulla decisione presa:</p>
<ul>
<li><a title="Use \ as namespace separator" href="http://wiki.php.net/rfc/backslashnamespaces#use_as_namespace_separator" target="_blank">Use \ as namespace separator</a> e <a title="Description of what it means to use \ as namespace separator" href="http://wiki.php.net/rfc/backslashnamespaces#description_of_what_it_means_to_use_as_namespace_separator" target="_blank">Description of what it means to use \ as namespace separator</a>. </li>
<li><a title="Request for Comments: Namespace Separators" href="http://wiki.php.net/rfc/namespaceseparator" target="_blank">Request for Comments: Namespace Separators</a></li>
<li><a title="endnamespacediscussion" href="http://news.php.net/php.internals/41374" target="_blank">Annuncio del cambiamento</a> sulla mailing list php.internals</li>
</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/clorophilla?a=1AofQB5c"><img src="http://feeds.feedburner.com/~f/clorophilla?i=1AofQB5c" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=LEqorhvQ"><img src="http://feeds.feedburner.com/~f/clorophilla?d=43" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=rDwXQc50"><img src="http://feeds.feedburner.com/~f/clorophilla?d=45" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=BakNESpr"><img src="http://feeds.feedburner.com/~f/clorophilla?d=243" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=H0IbejVu"><img src="http://feeds.feedburner.com/~f/clorophilla?i=H0IbejVu" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/clorophilla/~4/rHxyZ7CDMZ0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.clorophilla.net/blog/?feed=rss2&amp;p=404</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.clorophilla.net/blog/?p=404</feedburner:origLink></item>
		<item>
		<title>Microsoft Silverlight 2.0 RTM, support per Eclipse, port su Symbian. Poi?</title>
		<link>http://feedproxy.google.com/~r/clorophilla/~3/Jtg97bJcGgs/</link>
		<comments>http://www.clorophilla.net/blog/?p=403#comments</comments>
		<pubDate>Mon, 13 Oct 2008 17:09:53 +0000</pubDate>
		<dc:creator>NRK</dc:creator>
				<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[Varie ed eventuali]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[microsoft]]></category>
		<category><![CDATA[rtm]]></category>
		<category><![CDATA[silverlight]]></category>

		<guid isPermaLink="false">http://www.clorophilla.net/blog/?p=403</guid>
		<description><![CDATA[Ok anche questa volta penserete allo scherzo ma no, non lo &#232; nemmeno in questo caso. Scott Guthrie, oltre ad aver appena annunciato via conferenze telefonica che domani (14 ottobre 2008) vedr&#224; la luce la versione RTM di Silverlight 2.0, ha dato la notizia che la piattaforma di sviluppo offerta da Eclipse sar&#224; supportata, seppur [...]]]></description>
			<content:encoded><![CDATA[<p>Ok anche questa volta penserete allo scherzo ma no, non lo &#232; nemmeno in questo caso. Scott Guthrie, oltre ad aver appena annunciato via conferenze telefonica che domani (14 ottobre 2008) vedr&#224; la luce la versione RTM di <a title="The Official Microsoft Silverlight Site" href="http://silverlight.net/">Silverlight 2.0</a>, ha dato la notizia che la piattaforma di sviluppo offerta da <strong>Eclipse</strong> sar&#224; supportata, seppur non direttamente, <strong>per la creazione di applicazioni Silverlight</strong>:</p>
<blockquote><p><em>Microsoft announced plans to support additional tools for developing Silverlight applications by providing funding to Soyatec, a France-based IT solutions provider and Eclipse Foundation member, to lead a project to integrate advanced Silverlight development capabilities into the Eclipse IDE. Soyatec plans to release the project under the Eclipse Public License Version 1.0 on SourceForge and submit it to the Eclipse Foundation as an open Eclipse project.</em></p>
</blockquote>
<p>Potete trovare maggiori dettagli in <a title="Microsoft Releases Silverlight 2, Already Reaching One in Four Consumers Worldwide" href="http://www.microsoft.com/presspass/press/2008/oct08/10-13Silverlight2PR.mspx">questa pagina fresca di pubblicazione</a>, inoltre &#232; stato reso noto il sito <a title="Eclipse Tools for Microsoft Silverlight" href="http://www.eclipse4sl.org/">Eclipse Tools for Microsoft Silverlight</a> su cui &#232; gi&#224; online e <a title="Eclipse Tools for Microsoft Silverlight - Download" href="http://www.eclipse4sl.org/download/">disponibile per il download</a> una prima alpha del plugin per Eclipse con dettagli e istruzioni su alcune modalit&#224; di configurazione. Nella stessa pagina si pu&#242; notare anche una curiosa nota: <em>Windows XP SP2 (or above) or Windows Vista SP1 &#8211; Other OS are planned for future versions</em>. In effetti mi chiedo quanti sviluppatori .NET <u>su Windows</u> usino Eclipse, considerazione che riporta un po&#8217; tutti con i piedi per terra, per&#242; quel futuro supporto per altri sistemi operativi&#8230; mah, chiss&#224;&#8230;</p>
<p>Ad ogni modo l&#8217;altra notizia (di cui non ci sono ancora testimonianze ufficiali scritte mentre sto scrivendo) &#232; che a quanto pare Microsoft e Nokia lavoreranno per portare <strong>Silverlight su piattaforma Symbian</strong>.</p>
<p>Per ora sembrerebbe non esserci altro. E dire che il PDC 2008 &#232; tra meno di quindici giorni&#8230;</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/clorophilla?a=ixa5Q7bR"><img src="http://feeds.feedburner.com/~f/clorophilla?i=ixa5Q7bR" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=rrIQSEFm"><img src="http://feeds.feedburner.com/~f/clorophilla?d=43" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=1rgPpCai"><img src="http://feeds.feedburner.com/~f/clorophilla?d=45" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=1rHAAB36"><img src="http://feeds.feedburner.com/~f/clorophilla?d=243" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=6nNsDy0u"><img src="http://feeds.feedburner.com/~f/clorophilla?i=6nNsDy0u" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/clorophilla/~4/Jtg97bJcGgs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.clorophilla.net/blog/?feed=rss2&amp;p=403</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.clorophilla.net/blog/?p=403</feedburner:origLink></item>
		<item>
		<title>Ruby Social Club, Milano – Atto terzo: missione compiuta</title>
		<link>http://feedproxy.google.com/~r/clorophilla/~3/LSDm4-rQsps/</link>
		<comments>http://www.clorophilla.net/blog/?p=400#comments</comments>
		<pubDate>Mon, 29 Sep 2008 19:20:02 +0000</pubDate>
		<dc:creator>NRK</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Varie ed eventuali]]></category>
		<category><![CDATA[cazzeggio applicato]]></category>
		<category><![CDATA[rsc]]></category>
		<category><![CDATA[ruby social club]]></category>
		<category><![CDATA[serate]]></category>

		<guid isPermaLink="false">http://www.clorophilla.net/blog/?p=400</guid>
		<description><![CDATA[Anche se con un po&#8217; di ritardo, ci tenevo a esprimere la mia soddisfazione per la bella serata che &#232; stata organizzata mercoled&#236; scorso in quel di Milano dai ragazzi di Mikamai per il terzo Ruby Social Club. Una trentina di persone (successone), atmosfera molto informale, talk veloci ma interessanti e una transumata di massa [...]]]></description>
			<content:encoded><![CDATA[<p>Anche se con un po&#8217; di ritardo, ci tenevo a esprimere la mia soddisfazione per la bella serata che &#232; stata organizzata mercoled&#236; scorso in quel di Milano dai ragazzi di <a href="http://mikamai.com/" target="_blank">Mikamai</a> per il terzo <a title="Ruby Italia: Ruby Social Club" href="http://ruby-it.org/pages/Ruby+Social+Club" target="_blank">Ruby Social Club</a>. Una trentina di persone (successone), atmosfera molto informale, talk veloci ma interessanti e una transumata di massa al locale dove sono continuate le discussioni sugli argomenti pi&#249; disparati tra birra e qualche piatto di cibarie. Purtroppo non sono mai riuscito a partecipare alle precedenti edizioni e devo dire che questa volta &#232; valsa la pena fare di tutto per esserci. Il buon riffraff (a cui tra l&#8217;altro devo anche una birra, lo scrivo qui cos&#236; rimane fino alla prossima occasione) <a href="http://riffraff.blogsome.com/2008/09/27/note-dal-ruby-social-club-milano-3/" target="_blank">ha gi&#224; scritto qualche dettaglio sparso</a> sulla serata, per cui non mi dilungher&#242; ulteriormente. Sicuramente ci saranno altri appuntamenti in futuro, per cui&#8230; al prossimo RSC <img src='http://www.clorophilla.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/clorophilla?a=NU4uJkn5"><img src="http://feeds.feedburner.com/~f/clorophilla?i=NU4uJkn5" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=6XSoVrB3"><img src="http://feeds.feedburner.com/~f/clorophilla?d=43" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=yi86fXDH"><img src="http://feeds.feedburner.com/~f/clorophilla?d=45" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=LPuJRg9P"><img src="http://feeds.feedburner.com/~f/clorophilla?d=243" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=c3SN1ebo"><img src="http://feeds.feedburner.com/~f/clorophilla?i=c3SN1ebo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/clorophilla/~4/LSDm4-rQsps" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.clorophilla.net/blog/?feed=rss2&amp;p=400</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.clorophilla.net/blog/?p=400</feedburner:origLink></item>
		<item>
		<title>Microsoft e jQuery (sembra uno scherzo, ma non lo è)</title>
		<link>http://feedproxy.google.com/~r/clorophilla/~3/1zmJSvV24Bk/</link>
		<comments>http://www.clorophilla.net/blog/?p=399#comments</comments>
		<pubDate>Sun, 28 Sep 2008 19:35:47 +0000</pubDate>
		<dc:creator>NRK</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[Varie ed eventuali]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[microsoft]]></category>

		<guid isPermaLink="false">http://www.clorophilla.net/blog/?p=399</guid>
		<description><![CDATA[Risale a qualche minuto fa la notizia che Microsoft ha stretto una partnership con il team di jQuery non solo per supportare ufficialmente questa libreria all&#8217;interno dei suoi prodotti di sviluppo come Visual Studio 2008 e la versione free di Visual Web Developer ma anche per distribuirla in alcune sue librerie web-oriented come l&#8217;ormai prossima [...]]]></description>
			<content:encoded><![CDATA[<p>Risale a qualche minuto fa la notizia che Microsoft ha stretto una partnership con il team di <a title="jQuery: The Write Less, Do More, JavaScript Library" href="http://jquery.com/" target="_blank">jQuery</a> non solo per supportare ufficialmente questa libreria all&#8217;interno dei suoi prodotti di sviluppo come Visual Studio 2008 e la versione free di Visual Web Developer ma anche per distribuirla in alcune sue librerie web-oriented come l&#8217;ormai prossima <a title="ASP.NET MVC: The Official Microsoft ASP.NET Site" href="http://www.asp.net/mvc/" target="_blank">ASP.NET MVC</a> o AJAX Control Toolkit. Il supporto negli ambienti di sviluppo sar&#224; fornito inizialmente da un pacchetto scaricabile gratuitamente nelle prossime settimane mentre in futuro sar&#224; integrato direttamente in Visual Studio. Vorrei citare solo due passaggi, il primo dal <a title="ScottGu&#39;s Blog" href="http://weblogs.asp.net/scottgu/" target="_blank">blog di Scott Guthrie</a> che riporta l&#8217;annuncio:</p>
<blockquote><p><em>We will distribute the jQuery JavaScript library as-is, and will not be forking or changing the source from the main jQuery branch.&#160; The files will continue to use and ship under the existing jQuery MIT license.</em></p>
</blockquote>
<p>Il secondo invece arriva dal<a title="jQuery to ship with ASP.NET MVC and Visual Studio" href="http://www.hanselman.com/blog/jQueryToShipWithASPNETMVCAndVisualStudio.aspx" target="_blank"> post di Scott Hanselman</a> (e che in effetti riassume uno dei principali motivi per cui questo annuncio mi ha stupito):</p>
<blockquote><p><em>Folks have said Microsoft would never include Open Source in the platform, I&#8217;m hoping this move is representative of a bright future.</em></p>
</blockquote>
<p>Ecco i rispettivi annunci ufficiali da parte di <a title="jQuery and Microsoft" href="http://weblogs.asp.net/scottgu/archive/2008/09/28/jquery-and-microsoft.aspx">Scott Guthrie</a> e <a title="jQuery &#187; jQuery, Microsoft, and Nokia" href="http://jquery.com/blog/2008/09/28/jquery-microsoft-nokia/" target="_blank">John Resig</a> (il quale estende la notizia riportando anche la collaborazione ufficiale di jQuery con Nokia).</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/clorophilla?a=nyW2u5rk"><img src="http://feeds.feedburner.com/~f/clorophilla?i=nyW2u5rk" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=hZYdPqr7"><img src="http://feeds.feedburner.com/~f/clorophilla?d=43" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=KRXGhN14"><img src="http://feeds.feedburner.com/~f/clorophilla?d=45" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=MOuS6VB5"><img src="http://feeds.feedburner.com/~f/clorophilla?d=243" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=FTUVLt0m"><img src="http://feeds.feedburner.com/~f/clorophilla?i=FTUVLt0m" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/clorophilla/~4/1zmJSvV24Bk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.clorophilla.net/blog/?feed=rss2&amp;p=399</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.clorophilla.net/blog/?p=399</feedburner:origLink></item>
		<item>
		<title>Sinatra has taken the stage!</title>
		<link>http://feedproxy.google.com/~r/clorophilla/~3/LojrNlKqkks/</link>
		<comments>http://www.clorophilla.net/blog/?p=398#comments</comments>
		<pubDate>Fri, 12 Sep 2008 17:40:12 +0000</pubDate>
		<dc:creator>NRK</dc:creator>
				<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[haml]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[sinatra]]></category>

		<guid isPermaLink="false">http://www.clorophilla.net/blog/?p=398</guid>
		<description><![CDATA[Non si tratta del compianto Frank, ma di uno degli ultimi framework per lo sviluppo web arrivati in casa Ruby. La caratteristica principale di Sinatra &#232; la sua semplicit&#224;, ancora pi&#249; spinta rispetto a quella a volte anche un po&#8217; troppo magica di Camping: con sole 5 righe &#232; possibile ottenere una risposta dal server. [...]]]></description>
			<content:encoded><![CDATA[<p>Non si tratta del compianto Frank, ma di uno degli ultimi framework per lo sviluppo web arrivati in casa Ruby. La caratteristica principale di <a title="Sinatra" href="http://www.xnot.org/sinatra/">Sinatra</a> &#232; la sua <strong>semplicit&#224;</strong>, ancora pi&#249; spinta rispetto a quella a volte anche un po&#8217; troppo magica di <a title="Camping, a Microframework" href="http://code.whytheluckystiff.net/camping/">Camping</a>: con sole 5 righe &#232; possibile ottenere una risposta dal server. Non ci credete? Allora, dopo averlo installato usando rubygems (<code>gem install sinatra -y</code>), provate il seguente codice&#8230;</p>
<div class="wlWriterSmartContent" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:0782ee3c-4b2a-48b0-a6bf-7f9c1506a111" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre  style="width:100%;;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #008000; font-style: italic;">#</span><span style="color: #008000; font-style: italic;"> main.rb</span><span style="color: #008000; font-style: italic;">
</span><span style="color: #000000;">
</span><span style="color: #0000DD;">require</span><span style="color: #000000;"> </span><span style="color: #7F007F;">'</span><span style="color: #7F007F;">rubygems</span><span style="color: #7F007F;">'</span><span style="color: #000000;">
</span><span style="color: #0000DD;">require</span><span style="color: #000000;"> </span><span style="color: #7F007F;">'</span><span style="color: #7F007F;">sinatra</span><span style="color: #7F007F;">'</span><span style="color: #000000;">

get </span><span style="color: #7F007F;">'</span><span style="color: #7F007F;">/</span><span style="color: #7F007F;">'</span><span style="color: #000000;"> </span><span style="color: #0000DD;">do</span><span style="color: #000000;">
    </span><span style="color: #7F007F;">'</span><span style="color: #7F007F;">Cool, Sinatra is performing on the main stage!</span><span style="color: #7F007F;">'</span><span style="color: #000000;">
</span><span style="color: #0000DD;">end</span><span style="color: #000000;">
</span></div>
</pre>
</div>
<p>Usando il comando <code>ruby main.rb</code> si ottiene un&#8217;istanza di <a title="Mongrel" href="http://mongrel.rubyforge.org/">Mongrel</a> con la nostra applicazione pronta a ricevere le chiamate dal browser, mentre nella finestra del terminale si viene avvisati che <em>Sinatra has taken the stage on port 4567!</em> Non resta da far altro che verificare l&#8217;effettivo funzionamento con un semplice <code>wget -qO- http://localhost:4567/</code> (oppure <code>curl http://localhost:4567/</code> se preferite):</p>
<p><em>Cool, Sinatra is performing on the main stage!</em></p>
<p>Sinatra pu&#242; essere definito un micro-framework traverstito da <a title="Domain-specific language - Wikipedia" href="http://en.wikipedia.org/wiki/Domain-specific_programming_language">DSL</a> dotato di una grammatica ridotta, semplice e immediata. Sinatra non obbliga lo sviluppatore a strutturare la propria applicazione seguendo l&#8217;architettura <a title="Model-View-Controller - Wikipedia" href="http://it.wikipedia.org/wiki/Model-View-Controller">MVC</a> (ma &#232; comunque possibile replicarla), non &#232; legato a un particolare motore di template (ma supporta molto bene <a title="Class: ERB" href="http://www.ruby-doc.org/stdlib/libdoc/erb/rdoc/classes/ERB.html">ERB</a> e l&#8217;ottimo <a title="#haml" href="http://haml.hamptoncatlin.com/">HAML</a>), non offre la miriade di helpers inclusi nel prezzo come altri framework e inoltre &#232; assolutamente ORM-agnostico: tutto ci&#242; pu&#242; avere i suoi pro e contro, ma queste caratteristiche lo rendono indubbiamente un ottimo framework per lo sviluppo di prototipi o di applicazioni semplici ma relativamente veloci. Sinatra, per come &#232; strutturato, promuove inoltre lo sviluppo di interfacce <a title="REST - Representational State Transfer - Wikipedia" href="http://it.wikipedia.org/wiki/REST_-_Representational_State_Transfer">REST</a> per le proprie applicazioni web, rendendolo quindi uno strumento agevole per prototipizzare API.</p>
<div class="wlWriterSmartContent" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:fc10809f-bdf1-4992-91a3-abe25b68f755" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre  style="width:100%;;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #000000;">get </span><span style="color: #7F007F;">'</span><span style="color: #7F007F;">/</span><span style="color: #7F007F;">'</span><span style="color: #000000;"> </span><span style="color: #0000DD;">do</span><span style="color: #000000;">
    </span><span style="color: #008000; font-style: italic;">#</span><span style="color: #008000; font-style: italic;"> mostra risorsa</span><span style="color: #008000; font-style: italic;">
</span><span style="color: #0000DD;">end</span><span style="color: #000000;">

post </span><span style="color: #7F007F;">'</span><span style="color: #7F007F;">/</span><span style="color: #7F007F;">'</span><span style="color: #000000;"> </span><span style="color: #0000DD;">do</span><span style="color: #000000;">
    </span><span style="color: #008000; font-style: italic;">#</span><span style="color: #008000; font-style: italic;"> crea risorsa</span><span style="color: #008000; font-style: italic;">
</span><span style="color: #0000DD;">end</span><span style="color: #000000;">

put </span><span style="color: #7F007F;">'</span><span style="color: #7F007F;">/</span><span style="color: #7F007F;">'</span><span style="color: #000000;"> </span><span style="color: #0000DD;">do</span><span style="color: #000000;">
    </span><span style="color: #008000; font-style: italic;">#</span><span style="color: #008000; font-style: italic;"> aggiorna risorsa</span><span style="color: #008000; font-style: italic;">
</span><span style="color: #0000DD;">end</span><span style="color: #000000;">

delete </span><span style="color: #7F007F;">'</span><span style="color: #7F007F;">/</span><span style="color: #7F007F;">'</span><span style="color: #000000;"> </span><span style="color: #0000DD;">do</span><span style="color: #000000;">
    </span><span style="color: #008000; font-style: italic;">#</span><span style="color: #008000; font-style: italic;"> cancella risorsa</span><span style="color: #008000; font-style: italic;">
</span><span style="color: #0000DD;">end</span></div>
</pre>
</div>
<p>Viene naturale a questo punto chiedersi come vengano gestite le rotte, ma anche in questo caso &#232; tutto molto semplice e intuitivo:</p>
<div class="wlWriterSmartContent" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:4a4b1771-92ab-4e38-bb98-a04705740f85" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre  style="width:100%;;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #000000;">get </span><span style="color: #7F007F;">'</span><span style="color: #7F007F;">/hello</span><span style="color: #7F007F;">'</span><span style="color: #000000;"> </span><span style="color: #0000DD;">do</span><span style="color: #000000;">
    redirect </span><span style="color: #7F007F;">'</span><span style="color: #7F007F;">/hello/anonymous</span><span style="color: #7F007F;">'</span><span style="color: #000000;">
</span><span style="color: #0000DD;">end</span><span style="color: #000000;">

get </span><span style="color: #7F007F;">'</span><span style="color: #7F007F;">/hello/anonymous</span><span style="color: #7F007F;">'</span><span style="color: #000000;"> </span><span style="color: #0000DD;">do</span><span style="color: #000000;">
    </span><span style="color: #7F007F;">'</span><span style="color: #7F007F;">Hello Mr. Anonymous, I would be glad to know your name!</span><span style="color: #7F007F;">'</span><span style="color: #000000;">
</span><span style="color: #0000DD;">end</span><span style="color: #000000;">

get </span><span style="color: #7F007F;">'</span><span style="color: #7F007F;">/hello/:name</span><span style="color: #7F007F;">'</span><span style="color: #000000;"> </span><span style="color: #0000DD;">do</span><span style="color: #000000;">
    user </span><span style="color: #000000; font-weight: bold;">=</span><span style="color: #000000;"> params</span><span style="color: #000000; font-weight: bold;">[</span><span style="color: #000000;">:</span><span style="color: #0077FF;">name</span><span style="color: #000000; font-weight: bold;">]</span><span style="color: #000000;">
    </span><span style="color: #7F007F;">&quot;</span><span style="color: #7F007F;">Hello, #{user}!</span><span style="color: #7F007F;">&quot;</span><span style="color: #000000;">
</span><span style="color: #0000DD;">end</span><span style="color: #000000;">

</span><span style="color: #008000; font-style: italic;">#</span><span style="color: #008000; font-style: italic;"> wget -qO- </span><span style="color: #008000; font-style: italic; text-decoration: underline;">http://localhost:4567/hello</span><span style="color: #008000; font-style: italic;">
#</span><span style="color: #008000; font-style: italic;"> Hello Mr. Anonymous, I would be glad to know your name!</span><span style="color: #008000; font-style: italic;">
</span><span style="color: #000000;">
</span><span style="color: #008000; font-style: italic;">#</span><span style="color: #008000; font-style: italic;"> wget -qO- </span><span style="color: #008000; font-style: italic; text-decoration: underline;">http://localhost:4567/hello/anonymous</span><span style="color: #008000; font-style: italic;">
#</span><span style="color: #008000; font-style: italic;"> Hello Mr. Anonymous, I would be glad to know your name!</span><span style="color: #008000; font-style: italic;">
</span><span style="color: #000000;">
</span><span style="color: #008000; font-style: italic;">#</span><span style="color: #008000; font-style: italic;"> wget -qO- </span><span style="color: #008000; font-style: italic; text-decoration: underline;">http://localhost:4567/hello/NRK</span><span style="color: #008000; font-style: italic;">
#</span><span style="color: #008000; font-style: italic;"> Hello, NRK!</span></div>
</pre>
</div>
<p>Occorre solamente far notare che Sinatra effettua il lookup delle rotte nell&#8217;ordine di definizione, per questo motivo la seconda rotta <code>/hello/anonymous</code> non viene catturata dalla terza che invece specifica un pi&#249; generico <code>/hello/:name</code>. Concentrandosi appunto su quest&#8217;ultima, possiamo notare come pi&#249; in generale le variabili all&#8217;interno di una rotta possano essere definite semplicemente sfruttando la stessa sintassi utilizzata per definire un simbolo in Ruby e come esse vengano automaticamente rese disponibili nell&#8217;hash <code>params</code>.</p>
<p>Se avessimo bisogno di un approccio pi&#249; in stile MVC? Partendo dal presupposto che con Sinatra non serve creare una classe controller ma basta definire le singole azioni, a questo punto mancano solo le viste. Occorre quindi creare una directory <code>views</code> nel path della nostra applicazione, preparare il proprio template salvando il file relativo nella suddetta directory (per esempio <code>greet.haml</code> oppure <code>greet.erb</code> a seconda di quale motore di template vogliate usare) e scrivere una semplice riga di codice per la rotta:</p>
<div class="wlWriterSmartContent" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:65e5822b-af6b-4f6f-8112-4834bd00c59e" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre  style="width:100%;;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #000000;">get </span><span style="color: #7F007F;">'</span><span style="color: #7F007F;">/hello/:name</span><span style="color: #7F007F;">'</span><span style="color: #000000;"> </span><span style="color: #0000DD;">do</span><span style="color: #000000;">
    haml :</span><span style="color: #0077FF;">greet</span><span style="color: #000000;">
</span><span style="color: #0000DD;">end</span></div>
</pre>
</div>
<p>Per convenzione Sinatra effettua l&#8217;autocompletamento del nome del file della vista aggiungendo .haml o .erb, per cui basta specificarne il nome. Se avessi voluto utilizzare erb avrei scritto <code>erb :greet</code> ma dal momento che haml tutto sommato mi piace (<code>gem install haml</code>), ecco qui il codice d&#8217;esempio assolutamente minimale:</p>
<div class="wlWriterSmartContent" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:e0f8e433-73a5-46b5-9995-7c6802c55bdf" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre  style="width:100%;;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #000000;">!!!
%html
  %head
    %title Greetings!
  %body
    %span
      Hello,
      %strong= params[:name]</span></div>
</pre>
</div>
<p>A questo punto la chiamata a <code>http://localhost:4567/hello/NRK</code> produrr&#224; il seguente output:</p>
<div class="wlWriterSmartContent" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:d5371dea-44fe-4e79-9872-4e38172b2f94" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre  style="width:100%;;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #0000FF;">&lt;!</span><span style="color: #FF00FF;">DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot;
    &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
</span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">html</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
  </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">head</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
    </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">title</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">Greetings!</span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">title</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
  </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">head</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
  </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">body</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
    </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">span</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
      Hello,
      </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">strong</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">NRK</span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">strong</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
    </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">span</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
  </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">body</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
</span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">html</span><span style="color: #0000FF;">&gt;</span></div>
</pre>
</div>
<p>Tutto molto semplice, no? </p>
<p>Sinatra &#232; in una fase di sviluppo abbastanza attiva ma &#232; un framework gi&#224; particolarmente interessante per tutte quelle necessit&#224; in cui Ruby on Rails oppure framework similari risulterebbero soluzioni spropositate. Essendo basato su <a title="Rack: a Ruby Webserver Interface" href="http://rack.rubyforge.org/">Rack</a> &#232; possibile servire le applicazioni usando server differenti da Mongrel, come per esempio <a title="Thin - yet another web server" href="http://code.macournoyer.com/thin/">Thin</a> o <a title="Overview - Phusion Passenger (a.k.a. mod_rails / mod_rack)" href="http://www.modrails.com/">Phusion Passenger</a> via Apache. Personalmente lo sto provando nei ritagli di tempo per creare una sorta di gateway da un servizio JSON-RPC che avevo realizzato qualche tempo fa a un servizio REST-oriented con tanto di interfaccia web per la gestione delle azioni e la visualizzazione dei dati, per ora sono molto soddisfatto della sua semplicit&#224;.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/clorophilla?a=qGai7Zdj"><img src="http://feeds.feedburner.com/~f/clorophilla?i=qGai7Zdj" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=HzMZ6phd"><img src="http://feeds.feedburner.com/~f/clorophilla?d=43" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=BJnHOPcG"><img src="http://feeds.feedburner.com/~f/clorophilla?d=45" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=Cq2RrGhK"><img src="http://feeds.feedburner.com/~f/clorophilla?d=243" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=tgaQS5TN"><img src="http://feeds.feedburner.com/~f/clorophilla?i=tgaQS5TN" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/clorophilla/~4/LojrNlKqkks" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.clorophilla.net/blog/?feed=rss2&amp;p=398</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.clorophilla.net/blog/?p=398</feedburner:origLink></item>
		<item>
		<title>Ping? Pong! Spizzichi di Chrome, virtual machine, io, telecomandi e ruby</title>
		<link>http://feedproxy.google.com/~r/clorophilla/~3/A3wqhKG3IQA/</link>
		<comments>http://www.clorophilla.net/blog/?p=395#comments</comments>
		<pubDate>Fri, 05 Sep 2008 19:15:32 +0000</pubDate>
		<dc:creator>NRK</dc:creator>
				<category><![CDATA[Varie ed eventuali]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[IronRuby]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[slicehost]]></category>
		<category><![CDATA[vps]]></category>
		<category><![CDATA[win32api]]></category>
		<category><![CDATA[zoom player]]></category>

		<guid isPermaLink="false">http://www.clorophilla.net/blog/?p=395</guid>
		<description><![CDATA[Per esserci ci sono&#8230; s&#236; insomma, esisto ancora. Il fatto &#232; che non avevo alcuna voglia di scrivere sul blog e mi scuso per questo, purtroppo per&#242; non riuscir&#242; mai a rientrare nella logica blogorroica e spesso prettamente italica secondo cui l&#8217;assenza di un flusso costante di messaggi, possibilmente con cadenza giornaliera e magari anche [...]]]></description>
			<content:encoded><![CDATA[<p>Per esserci ci sono&#8230; s&#236; insomma, esisto ancora. Il fatto &#232; che non avevo alcuna voglia di scrivere sul blog e mi scuso per questo, purtroppo per&#242; non riuscir&#242; mai a rientrare nella logica blogorroica e spesso prettamente italica secondo cui l&#8217;assenza di un flusso costante di messaggi, possibilmente con cadenza giornaliera e magari anche quando da scrivere non si avrebbe proprio nulla, equivale a essere marchiati a fuoco come bloggher un po&#8217; scarsi. Oddio in effetti un po&#8217; scarso lo sono in questo senso (oso addirittura fregarmene delle statistiche!), per&#242; il fatto di non aver scritto per pi&#249; di un mese non mi stupisce troppo dal momento che periodi simili mi sono capitati anche in passato in quel di usenet, quando ci bazzicavo una decina di anni fa. Tuttavia, in passato come oggi, il risultato finale &#232; sempre lo stesso: rieccomi. <em>Ah beh, che culo!</em></p>
<p>Digressioni &amp; deliri messi da parte, ci terrei a confessarvi di avere una discreta quantit&#224; di argomenti utili e interessanti (spero) su cui scrivere, mi auguro di avere il tempo materiale per riuscire nell&#8217;impresa, prima per&#242; preferirei seguire un percorso riabilitativo al posting abbastanza dolce per cui&#8230; ecco il temibile tag &lt;ul/&gt;, una bella unordered list per voi:</p>
<ul>
<li><a title="Google Chrome" href="http://www.google.com/chrome/">Chrome</a>. Google &#232; un fenomeno del marketing, me lo fa pensare il fatto che tutti stiano andando pazzi per un browser che fondamentalmente&#8230; crasha. <em>Ehi, per&#242; crashano i singoli tab, mica tutto il browser</em>: accidenti scusate, allora &#232; tutto ok posso unirmi al delirio generalizzato! <img src='http://www.clorophilla.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Ironie e crash a parte, il browser &#232; veloce e in effetti <a title="v8 - Google Code" href="http://code.google.com/p/v8/">v8</a> &#232; una scheggia, magari non sempre sovraumana in tutte le circostanze come vorrebbero far credere con i benchmark studiati ad hoc ma si tratta comunque dell&#8217;engine ECMAScript/Javascript pi&#249; performante attualmente in circolazione, lo sta dimostrando con dei fatti. Il browser in s&#232; potrebbe non essere malvagio, ma magari ci rivedremo pi&#249; avanti quando Google l&#8217;avr&#224; sistemato ancora un po&#8217;, avr&#224; fatto uscire qualcosa di compilato anche per le altre piattaforme e magari, gi&#224; che sono in ballo, avr&#224; smesso di fare presunti pasticci con l&#8217;EULA. Per ora sulla mia macchina virtuale linux di sviluppo sono rimasti solo i sorgenti di v8 e il risultato della loro compilazione, mi interessano molto di pi&#249; di tutto il resto.</li>
<li>A proposito di macchine virtuali, ho acquistato una VPS linux con <a title="SliceHost - VPS Hosting" href="http://www.slicehost.com/">SliceHost</a> scegliendo il loro piano di base da 20$/mese. In seguito ho registrato un nuovo nome di dominio con Aruba (mi tornava comodo solo per la registrazione, infatti ho provveduto a cambiare immediatamente i nameserver autoritativi con quelli di SliceHost appena &#232; stato possibile) e infine per gestire la posta ho creato un account di <a title="Google Apps" href="http://www.google.com/a/help/intl/it/index.html">Google Apps</a> sottoscrivendo il profilo standard nonch&#233; gratuito. Livello di soddisfazione: elevato, per ora. Ho diverse idee in testa, tra le varie figura anche la migrazione di questo blog (come del resto mi ripropongo da almeno due anni), ma ogni cosa avverr&#224; a tempo debito.</li>
<li>Scusate se non ve l&#8217;ho mai detto, ma <a title="io" href="http://www.iolanguage.com/">io &#232; un linguaggio di programmazione</a> grandioso. Dinamico, basato sulla prototipizzazione degli oggetti come Javascript, interamente orientato ai messaggi, totalmente privo di keywords, dannatamente curioso e divertente da scoprire. Ok &#232; molto giovane, ci sono pochissime librerie e la documentazione non &#232; propriamente aggiornata con lo stato dello sviluppo, inoltre &#232; probabile che non sar&#224; nemmeno la next big thing in programming (anche se non si sa mai), per&#242; vi assicuro che &#232; un linguaggio molto divertente.</li>
<li>L&#8217;altro giorno ho acquistato il gadget allegato all&#8217;ultimo numero di Win Magazine (mai comprato in vita mia, sia chiaro): un telecomando IR per PC e Media Center, completo ovviamente di ricevitore USB. Semplice, sottile, 15&#8364;&#8230; ne volevo uno da tempo, ma non lo desideravo abbastanza intensamente da giustificare una spesa da 30&#8364; o pi&#249;. Peccato per&#242; che non sembri andare molto d&#8217;accordo con <a title="Inmatrix.com" href="http://www.inmatrix.com/">Zoom Player</a> (da anni il mio player video per Windows preferito) per quanto riguarda la mappatura dei comandi. Fortunatamente per&#242; ZP &#232; grande e pu&#242; essere <a title="Inmatrix.com - Zoom Player Help" href="http://www.inmatrix.com/zplayer/comm.shtml">remotato in maniera piuttosto banale</a> e documentata via TCP/IP oppure usando l&#8217;API <a title="SendMessage Function ()" href="http://msdn.microsoft.com/en-us/library/ms644950(VS.85).aspx">SendMessage</a> di Windows, per cui ho pensato: perch&#233; non sviluppare un&#8217;applicazione residente in background che ascolti i comandi provenienti dal mio bel telecomando e li traduca in comandi da inviare a ZP, mappando il tutto come diamine voglio io? Ci sto lavorando in C#, anche se il core &#232; pi&#249; lavoro di interazione con le API Win32 che altro. Qualche messaggio sull&#8217;argomento approder&#224; anche su questi lidi.</li>
<li>Dalla saga del telecomando &#232; scaturito quasi per caso un altro piccolo progetto, questa volta pi&#249; generico e potenzialmente pi&#249; utile anche ad altri. L&#8217;idea inziale per l&#8217;applicazione di cui vi ho accennato poco sopra prevedeva l&#8217;utilizzo integrale di <a title="IronRuby - IronRuby" href="http://www.ironruby.net/">IronRuby</a> per la sua realizzazione, tuttavia mi sono accorto presto che le sue capacit&#224; di interop sono ancora particolarmente limitate per diversi aspetti (ecco perch&#233; ho scelto di usare C#). In compenso il codice che ho scritto per le prove mi ha portato all&#8217;idea di effettuare un porting per IronRuby del modulo <a title="Programmin Ruby: The Pragmatic Programmer&#39;s Guide" href="http://www.rubycentral.com/pickaxe/lib_windows.html#Win32API">Win32API</a> distribuito nella standard lib dell&#8217;MRI, il tutto in onore di una sana <em>compatibility-love.</em> Dopo 3 giorni avevo gi&#224; una prima versione funzionante come <a title="Win32API.so ported to IronRuby" href="http://gist.github.com/8440">testimoniato da questo gist</a>, ora inizia il lavoro di pulizia e ottimizzazioni che si concluderanno con il rilascio del tutto su <a title="GitHub" href="http://github.com">GitHub</a> e con una serie di post sul blog dedicati all&#8217;argomento dal momento che ci sono svariate considerazioni tecniche che potrebbero risultare particolarmente interessanti.</li>
</ul>
<p>Per ora &#232; tutto. Per ora&#8230;</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/clorophilla?a=bMZvkq9b"><img src="http://feeds.feedburner.com/~f/clorophilla?i=bMZvkq9b" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=Dr2OChiG"><img src="http://feeds.feedburner.com/~f/clorophilla?d=43" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=qMP2wFl1"><img src="http://feeds.feedburner.com/~f/clorophilla?d=45" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=hIhakqSa"><img src="http://feeds.feedburner.com/~f/clorophilla?d=243" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=ChFsMU6V"><img src="http://feeds.feedburner.com/~f/clorophilla?i=ChFsMU6V" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/clorophilla/~4/A3wqhKG3IQA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.clorophilla.net/blog/?feed=rss2&amp;p=395</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.clorophilla.net/blog/?p=395</feedburner:origLink></item>
		<item>
		<title>Gist, il pastebin definitivo</title>
		<link>http://feedproxy.google.com/~r/clorophilla/~3/kvFXO3FRS_A/</link>
		<comments>http://www.clorophilla.net/blog/?p=394#comments</comments>
		<pubDate>Sun, 27 Jul 2008 19:34:43 +0000</pubDate>
		<dc:creator>NRK</dc:creator>
				<category><![CDATA[Link vari]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[Varie ed eventuali]]></category>
		<category><![CDATA[gist]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[pastebin]]></category>

		<guid isPermaLink="false">http://www.clorophilla.net/blog/?p=394</guid>
		<description><![CDATA[Oggi come oggi esiste una moltitudine di servizi pastebin sparsi per internet ma da qualche giorno &#232; stato aperto quello che attualmente considero essere il pastebin definitivo: Gist. Gist &#232; offerto dall&#8217;ormai noto GitHub, il servizio di hosting di progetti probabilmente pi&#249; in voga in questo momento, e pu&#242; vantare funzionalit&#224; piuttosto interessanti come:

supporto per [...]]]></description>
			<content:encoded><![CDATA[<p>Oggi come oggi esiste una moltitudine di servizi <a title="pastebin @ Wikipedia" href="http://en.wikipedia.org/wiki/Pastebin">pastebin</a> sparsi per internet ma da qualche giorno &#232; stato aperto quello che attualmente considero essere il pastebin definitivo: <a title="Gist - GitHub" href="http://gist.github.com/">Gist</a>. Gist &#232; offerto dall&#8217;ormai noto <a title="GitHub" href="http://github.com/">GitHub</a>, il servizio di hosting di progetti probabilmente pi&#249; in voga in questo momento, e pu&#242; vantare funzionalit&#224; piuttosto interessanti come:</p>
<ul>
<li>supporto per una settantina di linguaggi/grammatiche differenti&#8230; anche se manca <a title="LOLCode @ Wikipedia" href="http://en.wikipedia.org/wiki/LOLCODE">LOLCode</a>, nonostante ci sia <a title="Brainfuck @ Wikipedia" href="http://en.wikipedia.org/wiki/Brainfuck">Brainfuck</a> <img src='http://www.clorophilla.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </li>
<li>pastie (qui chiamati gist) pubblici o privati, anonimi oppure &quot;identificati&quot; se effettuati tramite il proprio account GitHub. Le operazioni, in questo caso, sono elencate all&#8217;interno della dashboard</li>
<li>ogni gist pu&#242; essere composto da file multipli, con possibilit&#224; di scaricare comodamente la versione raw di ogni file oppure di effettuare il download del pacchetto intero in formato tar.gz</li>
<li>possibilit&#224; di modificare i propri gist con tanto di accesso allo storico delle varie revisioni</li>
<li>clone URL pubblici e privati per ogni singolo gist, pronti per essere dati in pasto a Git</li>
</ul>
<p>Provatelo, &#232; veramente ottimo. Giusto per curiosit&#224;, questa &#232; <a title="Public Gists by NRK" href="http://gist.github.com/NRK">la pagina con i miei Gist</a> pubblici&#8230;</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/clorophilla?a=CdO1O4Cp"><img src="http://feeds.feedburner.com/~f/clorophilla?i=CdO1O4Cp" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=i3a3s90q"><img src="http://feeds.feedburner.com/~f/clorophilla?d=43" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=5eW8LwD4"><img src="http://feeds.feedburner.com/~f/clorophilla?d=45" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=vZ8IlBKe"><img src="http://feeds.feedburner.com/~f/clorophilla?d=243" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=254lhmLc"><img src="http://feeds.feedburner.com/~f/clorophilla?i=254lhmLc" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/clorophilla/~4/kvFXO3FRS_A" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.clorophilla.net/blog/?feed=rss2&amp;p=394</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.clorophilla.net/blog/?p=394</feedburner:origLink></item>
		<item>
		<title>LuaRocks! Ovvero, un comodo package manager per le librerie di Lua</title>
		<link>http://feedproxy.google.com/~r/clorophilla/~3/k_fPmQKqIE8/</link>
		<comments>http://www.clorophilla.net/blog/?p=390#comments</comments>
		<pubDate>Sun, 27 Jul 2008 14:08:36 +0000</pubDate>
		<dc:creator>NRK</dc:creator>
				<category><![CDATA[Lua]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[luarocks]]></category>

		<guid isPermaLink="false">http://www.clorophilla.net/blog/?p=390</guid>
		<description><![CDATA[Lua &#232; un linguaggio di programmazione dinamico e portabile particolarmente noto e utilizzato come linguaggio embdedded grazie ad alcune caratteristiche, proprie e della sua VM, che lo rendono ottimo per lo scripting di applicazioni pi&#249; o meno complesse scritte in altri linguaggi, solitamente compilati. Ovviamente pu&#242; essere utilizzato anche per programmare intere applicazioni oppure semplicemente [...]]]></description>
			<content:encoded><![CDATA[<p><a title="Lua (programming language) @ Wikipedia" href="http://en.wikipedia.org/wiki/Lua_%28programming_language%29">Lua</a> &#232; un linguaggio di programmazione dinamico e portabile particolarmente noto e utilizzato come linguaggio embdedded grazie ad alcune caratteristiche, proprie e della sua VM, che lo rendono ottimo per lo scripting di applicazioni pi&#249; o meno complesse scritte in altri linguaggi, solitamente compilati. Ovviamente pu&#242; essere utilizzato anche per programmare intere applicazioni oppure semplicemente script di automazione, ma in casi simili &#232; molto facile che ci si ritrovi con la necessit&#224; di utilizzare librerie esterne da installare e gestire separatamente e manualmente: Lua infatti, diversamente da linguaggi come Ruby o Python, nella sua distribuzione ufficiale non fornisce un set di librerie standard insieme al runtime. Il crescente numero di queste librerie di terze parti ha cominciato a rendere difficile la gestione delle stesse nei propri sistemi e per questo, quasi un anno fa, &#232; nato <a title="LuaRocks Wiki: LuaRocks" href="http://www.luarocks.org/"><em>LuaRocks</em></a>, un progetto per la realizzazione di sistema di distribuzione e gestione di moduli per Lua che per certi versi risulta essere molto simile a RubyGems.</p>
<p>Attualmente per installare LuaRocks nella maggior parte delle distribuzioni Linux &#232; necessario prelevare il tarball ed eseguire i soliti passaggi <em>./configure &#038;&#038; make &#038;&#038; make install</em>, tuttavia l&#8217;installazione sulle Ubuntu-derivate a partire da 8.04 <em>Intrepid Ibex</em> o su Debian a partire da 5.0 <em>Lenny</em> sar&#224; molto pi&#249; semplice dal momento che baster&#224; installare il pacchetto <em>luarocks </em>tramite apt-get. Per Windows esiste un installer che automatizza le procedure, lasciando all&#8217;utente la scelta se installare un interprete Lua basilare senza librerie fornito dallo stesso installer o se utilizzare un interprete gi&#224; installato nel proprio sistema. Tutte le informazioni necessarie al download e all&#8217;installazione di LuaRocks sono disponibili <a title="LuaRocks Wiki: Download" href="http://www.luarocks.org/en/Download">sul relativo sito</a>.</p>
<p>Nel frattempo pochi mesi fa &#232; nato un installer di Lua per Windows chiamato, con molta fantasia, <a title="Lua for Windows: A batteries included Lua installation on Windows" href="http://luaforwindows.luaforge.net/"><em>Lua for Windows</em></a>. Esso include molte delle pi&#249; note librerie per Lua e un ambiente di sviluppo/debug gi&#224; configurato e basato su <a title="Scintilla and SciTE" href="http://www.scintilla.org/SciTE.html">SciTE</a>. Si tratta quindi di un&#8217;ottima soluzione per avere in pochi secondi tutto il necessario per poter programmare in Lua, tuttavia LuaRocks non &#232; stato ancora incluso per cui ecco i passaggi da seguire per integrare il tutto:</p>
<ul>
<li><a title="LuaForge: Lua for Windows: Project Filelist" href="http://luaforge.net/frs/?group_id=377">Scaricare</a> <em>Lua for Windows</em> (LfW) e procedere con l&#8217;installazione: la mia installazione &#232; stata effettuata nel path proposto di default, ovvero <u>C:\Programmi\Lua\5.1</u> </li>
<li><a title="LuaForge: LuaRocks: Project Filelist" href="http://luaforge.net/frs/?group_id=220">Scaricare</a> <em>LuaRocks</em> per Windows, decomprimere l&#8217;archivio e aprire la shell dei comandi nella directory contenente <u>install.bat</u> </li>
<li>L&#8217;installer di LuaRocks permette di specificare alcune opzioni. Ecco come installarlo in modo che sfrutti l&#8217;interprete reso disponibile da LfW e che utilizzi un unico path per l&#8217;installazione dei pacchetti rock:
<p><code>install /LUA C:\Programmi\Lua\5.1 /BIN C:\Programmi\Lua\5.1 /P C:\Programmi\Lua\5.1\LuaRocks\0.6 /CONFIG C:\Programmi\Lua\5.1\LuaRocks /TREE C:\Programmi\Lua\5.1\LuaRocks\ /SCRIPTS C:\Programmi\Lua\5.1\LuaRocks\ /FORCECONFIG</code>       </p>
<p>Di default LuaRocks permette anche ad utenti non amministrativi di installare dei pacchetti rock locali (solitamente in <u>%APPDATA%/luarocks/rocks/</u>), mentre con l&#8217;opzione <em>/FORCECONFIG </em>verr&#224; considerato un unico file di configurazione, quello specificato da <em>/CONFIG</em>, e un unico path per l&#8217;installazione di rock e script a livello di sistema, specificati rispettivamente da <em>/TREE</em> e <em>/SCRIPT</em>. Potete fare riferimento alla documentazione per un approfondimento in merito.</li>
<li>La directory <u>C:\Programmi\Lua\5.1</u> viene automaticamente aggiunta al PATH di sistema dall&#8217;installer di LfW per cui possiamo creare un hardlink ai file <u>luarocks.bat</u> e <u>luarocks-admin.bat</u> con il fine di poter invocare gli stessi pi&#249; comodamente dalla shell. Da Windows XP in avanti si pu&#242; operare come segue:
<p><code>cd C:\Programmi\Lua\5.1\LuaRocks\0.6<br />
        fsutil hardlink create ../../luarocks.bat luarocks.bat<br />
        fsutil hardlink create ../../luarocks-admin.bat luarocks-admin.bat</code>       </li>
<li>Modificare la variabile di sistema <em>LUA_PATH</em> <strong>aggiungendo</strong> ai path gi&#224; impostati da LfW il seguente percorso per il caricamento dei file della libreria LuaRocks:
<p><code>C:\Programmi\Lua\5.1\LuaRocks\0.6\lua\?.lua</code> </li>
</ul>
<p>Ora LuaRocks &#232; installato e funzionante, basta aprire la shell dei comandi e lanciare <em>luarocks search &#8211;all</em> per visualizzare tutti i pacchetti rock disponibili sul server (&#232; disponibile anche <a title="Available rocks" href="http://luarocks.luaforge.net/rocks/">un elenco consultabile</a> pi&#249; comodamente) e <em>luarocks install nomepacchetto</em> per installare i pacchetti rock nel sistema. A questo punto negli script Lua baster&#224; aggiungere la riga <em>require &quot;luarocks.require&quot;</em> che si occuper&#224; di effettuare l&#8217;override della funzione require standard di Lua, rendendo possibile il caricamento delle librerie installate tramite LuaRocks. Alternativamente si pu&#242; ottenere lo stesso risultato lanciando cos&#236; l&#8217;interprete: <em>lua -lluarocks.require</em></p>
<p>Ecco un esempio di come sfruttare una libreria installata tramite LuaRocks:</p>
<p>
<div class="wlWriterSmartContent" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:03205ce6-3677-4dd8-97a2-d45552f04dcf" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre  style="width:100%;;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #008000;">--</span><span style="color: #008000;"> luarocks install colors</span><span style="color: #008000;">
</span><span style="color: #000000;">
</span><span style="color: #FF00FF;">require</span><span style="color: #000000;"> </span><span style="color: #800000;">&quot;</span><span style="color: #800000;">luarocks.require</span><span style="color: #800000;">&quot;</span><span style="color: #000000;">
</span><span style="color: #FF00FF;">require</span><span style="color: #000000;"> </span><span style="color: #800000;">&quot;</span><span style="color: #800000;">colors</span><span style="color: #800000;">&quot;</span><span style="color: #000000;">

green </span><span style="color: #000000;">=</span><span style="color: #000000;"> colors.new(</span><span style="color: #800000;">&quot;</span><span style="color: #800000;">#0f8923</span><span style="color: #800000;">&quot;</span><span style="color: #000000;">)

</span><span style="color: #FF00FF;">print</span><span style="color: #000000;">(</span><span style="color: #800000;">&quot;</span><span style="color: #800000;">Verdolino:</span><span style="color: #800000;">&quot;</span><span style="color: #000000;">, green)    </span><span style="color: #008000;">--</span><span style="color: #008000;"> Verdolino:    #0f8923</span></div>
</pre>
</div>
<p>LuaRocks con l&#8217;ultima release ha raggiunto un livello di maturit&#224; accettabile e l&#8217;elenco delle librerie disponibili sotto forma di pacchetti rock &#232; in lento ma costante aumento, ma ci sono alcune applicazioni o framework che ne traggono beneficio per l&#8217;installazione e la gestione delle loro dipendenze come per esempio <a title="Kepler: The Lua Web Development Platform" href="http://www.keplerproject.org/kepler/">Kepler</a> (un framework per lo sviluppo web generico in Lua), <a title="Orbit" href="http://orbit.luaforge.net/">Orbit</a> (un altro framework per lo sviluppo web in Lua, ma MVC oriented) e <a title="Sputnik: An Extensible Wiki (in Lua)" href="http://sputnik.freewisdom.org/">Sputnik</a> (un wiki scritto in Lua, leggero ma estendibile). Per la cronaca, ecco invece <a title="Installazione e configurazione dell&#8217;interprete LUA in Windows" href="http://www.clorophilla.net/blog/?p=278">cosa si era costretti a fare</a> solamente un anno fa per avere un&#8217;installazione minimale di Lua in Windows e cominciare ad aggiungere librerie come LuaSocket.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/clorophilla?a=4lLBgWDl"><img src="http://feeds.feedburner.com/~f/clorophilla?i=4lLBgWDl" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=ZQxEiGLx"><img src="http://feeds.feedburner.com/~f/clorophilla?d=43" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=ZjsBdJti"><img src="http://feeds.feedburner.com/~f/clorophilla?d=45" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=NQtnYHVx"><img src="http://feeds.feedburner.com/~f/clorophilla?d=243" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=ave2p4Rb"><img src="http://feeds.feedburner.com/~f/clorophilla?i=ave2p4Rb" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/clorophilla/~4/k_fPmQKqIE8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.clorophilla.net/blog/?feed=rss2&amp;p=390</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.clorophilla.net/blog/?p=390</feedburner:origLink></item>
		<item>
		<title>We Can’t Stop Here! This Is Bat Country!!</title>
		<link>http://feedproxy.google.com/~r/clorophilla/~3/oxls0OlgxAw/</link>
		<comments>http://www.clorophilla.net/blog/?p=389#comments</comments>
		<pubDate>Sun, 20 Jul 2008 10:34:06 +0000</pubDate>
		<dc:creator>NRK</dc:creator>
				<category><![CDATA[Varie ed eventuali]]></category>
		<category><![CDATA[NSLU2]]></category>
		<category><![CDATA[test]]></category>
		<category><![CDATA[upgrade]]></category>

		<guid isPermaLink="false">http://www.clorophilla.net/blog/?p=389</guid>
		<description><![CDATA[Scusate per il messaggio inutile, ma l&#8217;ultimo upgrade di WordPress alla versione 2.6 sembra avermi portato a 2 o 3 problemini sparsi qua e l&#224; per cui mi tocca fare qualche prova di troppo. Per renderlo un po&#8217; meno inutile posso dirvi che mi sono finalmente deciso a installare Debian sul mio NSLU2 (per l&#8217;occasione [...]]]></description>
			<content:encoded><![CDATA[<p>Scusate per il messaggio inutile, ma l&#8217;ultimo upgrade di WordPress alla versione 2.6 sembra avermi portato a 2 o 3 problemini sparsi qua e l&#224; per cui mi tocca fare qualche prova di troppo. Per renderlo un po&#8217; meno inutile posso dirvi che mi sono finalmente deciso a installare Debian sul mio <a title="Linksys NSLU2: un piccolo storage di rete? No, di pi&#249;!" href="http://www.clorophilla.net/blog/?p=359">NSLU2</a> (per l&#8217;occasione ho scelto la pi&#249; aggiornata Lenny, sono temerario). Il device in oggetto &#232; ufficialmente supportato con alcuni pacchetti mirati specificatamente ad esso ed &#232; un&#8217;altra vita rispetto a SlugOS/BE. Nonostante quest&#8217;ultima sia leggermente pi&#249; ottimizzata poich&#233; specificatamente creata per uso su sistemi embedded, con Debian il sistema sembra comportarsi comunque piuttosto bene soprattutto dopo qualche tweak. More to come, ora devo sistemare qualche pezzo di blog&#8230;</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/clorophilla?a=Q9MwPkvV"><img src="http://feeds.feedburner.com/~f/clorophilla?i=Q9MwPkvV" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=AJwxhrbQ"><img src="http://feeds.feedburner.com/~f/clorophilla?d=43" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=eZSiWmVg"><img src="http://feeds.feedburner.com/~f/clorophilla?d=45" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=oGDwca8W"><img src="http://feeds.feedburner.com/~f/clorophilla?d=243" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=BhTpvvbA"><img src="http://feeds.feedburner.com/~f/clorophilla?i=BhTpvvbA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/clorophilla/~4/oxls0OlgxAw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.clorophilla.net/blog/?feed=rss2&amp;p=389</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.clorophilla.net/blog/?p=389</feedburner:origLink></item>
		<item>
		<title>Ancora su lambda e closure in PHP</title>
		<link>http://feedproxy.google.com/~r/clorophilla/~3/o36F5_Ny5FA/</link>
		<comments>http://www.clorophilla.net/blog/?p=388#comments</comments>
		<pubDate>Thu, 03 Jul 2008 21:40:51 +0000</pubDate>
		<dc:creator>NRK</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[closure]]></category>
		<category><![CDATA[lambda]]></category>

		<guid isPermaLink="false">http://www.clorophilla.net/blog/?p=388</guid>
		<description><![CDATA[Anche se a pochi giorni di distanza, ho pensato di tornare a parlare di funzioni lambda e closure in PHP approfittando di un nuovo aggiornamento della RFC (con relativa patch che implementa quanto descritto) in cui sono state finalizzate alcune idee e sono stati introdotti alcuni nuovi concetti.
Prima di tutto &#232; stata presa una decisione [...]]]></description>
			<content:encoded><![CDATA[<p>Anche se a pochi giorni di distanza, ho pensato di tornare a parlare di <a title="Lambda e closure in PHP 5.3? Forse s&#236;, forse no, ma intanto proviamo." href="http://www.clorophilla.net/blog/?p=387">funzioni lambda e closure in PHP</a> approfittando di un nuovo <a title="PHP: rfc:closures    [PHP Wiki]" href="http://wiki.php.net/rfc/closures">aggiornamento della RFC</a> (con relativa patch che implementa quanto descritto) in cui sono state finalizzate alcune idee e sono stati introdotti alcuni nuovi concetti.</p>
<p>Prima di tutto &#232; stata presa una decisione per quanto riguarda la sintassi dichiarativa, infatti precedentemente erano state formulate due possibilit&#224;. La prima prevedeva la cattura delle variabili esterne alla chiusura tramite una nuova keyword creata ad hoc, <strong>lexical</strong>:</p>
<p>
<div class="wlWriterSmartContent" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:7b38a8de-a844-4f38-b57d-a4c8d0f78f48" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre  style="width:100%;;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #800080;">$lambda</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">function</span><span style="color: #000000;">(</span><span style="color: #800080;">$arg1</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #800080;">$arg2</span><span style="color: #000000;">) {
    lexical </span><span style="color: #800080;">$reference</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">&amp;</span><span style="color: #800080;">$valueByRef</span><span style="color: #000000;">;
    </span><span style="color: #008000;">//</span><span style="color: #008000;"> ...</span><span style="color: #008000;">
</span><span style="color: #000000;">};</span></div>
</pre>
</div>
<p>La seconda, quella che &#232; stata <u>effettivamente scelta</u>, prevede invece il riutilizzo della keyword gi&#224; esistente <strong>use</strong>:</p>
<p><div class="wlWriterSmartContent" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:5d715090-65be-43d5-a773-6698c4171be4" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre  style="width:100%;;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #800080;">$lambda</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">function</span><span style="color: #000000;">(</span><span style="color: #800080;">$arg1</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #800080;">$arg2</span><span style="color: #000000;">) </span><span style="color: #0000FF;">use</span><span style="color: #000000;"> (</span><span style="color: #800080;">$reference</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">&amp;</span><span style="color: #800080;">$valueByRef</span><span style="color: #000000;">) {
    </span><span style="color: #008000;">//</span><span style="color: #008000;"> ...</span><span style="color: #008000;">
</span><span style="color: #000000;">};</span></div>
</pre>
</div>
<p>Qualcuno preferiva la prima opzione e personalmente ero dello stesso avviso, ma alla fine la scelta &#232; stata dettata dall&#8217;intenzione di raggiungere un compromesso in maniera tale da ottenere le stesse funzionalit&#224; mantenendo la consistenza con l&#8217;attuale semantica di PHP e senza intaccare la retrocompatibilit&#224;. </p>
<p>La prima estensione nella RFC riguarda invece l&#8217;utilizzo della keyword <strong>static</strong> per stabilire se importare o meno <strong>$this</strong> all&#8217;interno di una chiusura definita all&#8217;interno del metodo di una classe. Non effettuare l&#8217;importazione di $this all&#8217;interno di una chiusura quando non necessario permette di ottenere un risparmio non solo in termini di velocit&#224; d&#8217;esecuzione, anche si tratta di differenze veramente minimali, ma anche e soprattutto di memoria, evitando che delle <em>long-lived</em> closure possano tenere in vita inutilmente le istanze delle classi in cui esse sono state create. La chiusura che cattura $this infatti impedisce che il refcount interno per l&#8217;oggetto che referenzia possa arrivare a 0 e ci&#242; ne comporta l&#8217;esclusione dal processo automatico di raccolta delle risorse che viene effettuato dal garbage collector. Vediamo un esempio pratico con tanto di risultato:</p>
<div class="wlWriterSmartContent" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:479a53d4-5ab9-4349-a0aa-db5b9be0f70d" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre  style="width:100%;;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #0000FF;">class</span><span style="color: #000000;"> NRK {
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #800080;">$_whoAmI</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #FF00FF;">__CLASS__</span><span style="color: #000000;">;

    </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">function</span><span style="color: #000000;"> foo() {
        </span><span style="color: #800080;">$method</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #FF00FF;">__METHOD__</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> </span><span style="color: #0000FF;">function</span><span style="color: #000000;">() </span><span style="color: #0000FF;">use</span><span style="color: #000000;"> (</span><span style="color: #800080;">$method</span><span style="color: #000000;">) {
            </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> </span><span style="color: #008080;">sprintf</span><span style="color: #000000;">(</span><span style="color: #000000;">&quot;</span><span style="color: #000000;">created in %s (w/ \$this):\n%s</span><span style="color: #000000;">&quot;</span><span style="color: #000000;">,</span><span style="color: #000000;">
                </span><span style="color: #800080;">$method</span><span style="color: #000000;">,</span><span style="color: #000000;">
                </span><span style="color: #008080;">print_r</span><span style="color: #000000;">(</span><span style="color: #800080;">$this</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #0000FF;">true</span><span style="color: #000000;">) </span><span style="color: #000000;">?:</span><span style="color: #000000;"> </span><span style="color: #000000;">'</span><span style="color: #000000;">null</span><span style="color: #000000;">'</span><span style="color: #000000;">
            );
        };
    }

    </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">function</span><span style="color: #000000;"> bar() {
        </span><span style="color: #800080;">$method</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #FF00FF;">__METHOD__</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> </span><span style="color: #0000FF;">function</span><span style="color: #000000;">() </span><span style="color: #0000FF;">use</span><span style="color: #000000;"> (</span><span style="color: #800080;">$method</span><span style="color: #000000;">) {
            </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> </span><span style="color: #008080;">sprintf</span><span style="color: #000000;">(</span><span style="color: #000000;">&quot;</span><span style="color: #000000;">created in %s (w/o \$this):\n%s</span><span style="color: #000000;">&quot;</span><span style="color: #000000;">,</span><span style="color: #000000;">
                </span><span style="color: #800080;">$method</span><span style="color: #000000;">,</span><span style="color: #000000;">
                </span><span style="color: #008080;">print_r</span><span style="color: #000000;">(</span><span style="color: #800080;">$this</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #0000FF;">true</span><span style="color: #000000;">) </span><span style="color: #000000;">?:</span><span style="color: #000000;"> </span><span style="color: #000000;">'</span><span style="color: #000000;">null</span><span style="color: #000000;">'</span><span style="color: #000000;">
            );
        };
    }
}

</span><span style="color: #800080;">$nrk</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> NRK();
</span><span style="color: #800080;">$fun1</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$nrk</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">foo();
</span><span style="color: #800080;">$fun2</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$nrk</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">bar();

</span><span style="color: #0000FF;">echo</span><span style="color: #000000;"> </span><span style="color: #800080;">$fun1</span><span style="color: #000000;">()</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">&quot;</span><span style="color: #000000;">\n</span><span style="color: #000000;">&quot;</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #800080;">$fun2</span><span style="color: #000000;">();

</span><span style="color: #008000;">/*</span><span style="color: #008000;">
created in NRK::foo (w/ $this):
NRK Object
(
    [_whoAmI:NRK:private] =&gt; NRK
)

created in NRK::bar (w/o $this):
null
</span><span style="color: #008000;">*/</span></div>
</pre>
</div>
<p>In realt&#224; trovo che sarebbe molto pi&#249; comodo e pulito avere $this importata in automatico nel caso essa venga esplicitamente richiamata nel corpo della closure, per il compilatore non sarebbe difficile accorgersene ed agire di conseguenza, ad ogni modo non mi piace l&#8217;uso della keyword <strong>static</strong> dal momento che rende ancora pi&#249; verbosa la definizione di una chiusura.</p>
<p>Proseguendo con le nuove funzionalit&#224;, nell&#8217;ottica di una maggiore integrazione con PHP sono state estese le classi <a title="PHP: Reflection - Manual" href="http://it2.php.net/manual/en/language.oop5.reflection.php#language.oop5.reflection.reflectionmethod">ReflectionMethod</a> e <a title="PHP: Reflection - Manual" href="http://it2.php.net/manual/en/language.oop5.reflection.php#language.oop5.reflection.reflectionfunction">ReflectionFunction</a> implementando il metodo <strong>getClosure()</strong> che permette di ottenere una funzione lambda generata dinamicamente partendo da una funzione o da un metodo di istanza/classe:</p>
<div class="wlWriterSmartContent" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:a9f0cb81-1827-403b-85bd-dd9f08179670" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre  style="width:100%;;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #0000FF;">class</span><span style="color: #000000;"> NRK {
    </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">function</span><span style="color: #000000;"> instanceMeth()       { </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> </span><span style="color: #FF00FF;">__METHOD__</span><span style="color: #000000;">; }
    </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> </span><span style="color: #0000FF;">function</span><span style="color: #000000;"> staticMeth()  { </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> </span><span style="color: #FF00FF;">__METHOD__</span><span style="color: #000000;">; }
    </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> </span><span style="color: #0000FF;">function</span><span style="color: #000000;"> methWithArgs(</span><span style="color: #800080;">$a</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #800080;">$b</span><span style="color: #000000;">) { </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> </span><span style="color: #800080;">$a</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #800080;">$b</span><span style="color: #000000;">; }
}

</span><span style="color: #800080;">$instance</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> NRK();

</span><span style="color: #800080;">$class</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> ReflectionClass(</span><span style="color: #000000;">'</span><span style="color: #000000;">NRK</span><span style="color: #000000;">'</span><span style="color: #000000;">);
</span><span style="color: #800080;">$fun1</span><span style="color: #000000;">  </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$class</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">getMethod(</span><span style="color: #000000;">'</span><span style="color: #000000;">instanceMeth</span><span style="color: #000000;">'</span><span style="color: #000000;">)</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">getClosure(</span><span style="color: #800080;">$instance</span><span style="color: #000000;">);
</span><span style="color: #800080;">$fun2</span><span style="color: #000000;">  </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$class</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">getMethod(</span><span style="color: #000000;">'</span><span style="color: #000000;">staticMeth</span><span style="color: #000000;">'</span><span style="color: #000000;">)</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">getClosure();
</span><span style="color: #800080;">$fun3</span><span style="color: #000000;">  </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$class</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">getMethod(</span><span style="color: #000000;">'</span><span style="color: #000000;">methWithArgs</span><span style="color: #000000;">'</span><span style="color: #000000;">)</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">getClosure();

</span><span style="color: #0000FF;">echo</span><span style="color: #000000;"> </span><span style="color: #800080;">$fun1</span><span style="color: #000000;">()</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">&quot;</span><span style="color: #000000;">\n</span><span style="color: #000000;">&quot;</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #800080;">$fun2</span><span style="color: #000000;">()</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">&quot;</span><span style="color: #000000;">\n</span><span style="color: #000000;">&quot;</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #800080;">$fun3</span><span style="color: #000000;">(</span><span style="color: #000000;">5</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">3</span><span style="color: #000000;">);

</span><span style="color: #008000;">/*</span><span style="color: #008000;">
NRK::instanceMeth
NRK::staticMeth
8
</span><span style="color: #008000;">*/</span></div>
</pre>
</div>
<p>Per finire, un&#8217;altra novit&#224; ispirata dall&#8217;implementazione dell&#8217;oggetto Closure riguarda la generalizzazione del concetto di oggetto invocabile attraverso l&#8217;implementazione di un nuovo metodo magico, <strong>__invoke()</strong>. Un esempio vale pi&#249; di mille parole:</p>
<div class="wlWriterSmartContent" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:a4f87aed-b529-48f5-ade8-ce9769e8df1c" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre  style="width:100%;;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #0000FF;">class</span><span style="color: #000000;"> CallableObject {
    </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">function</span><span style="color: #000000;"> __invoke () {
        </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> </span><span style="color: #000000;">'</span><span style="color: #000000;">Guess what?</span><span style="color: #000000;">'</span><span style="color: #000000;">;
    }
}

</span><span style="color: #800080;">$callable</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> CallableObject();
</span><span style="color: #800080;">$notCallable</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> stdClass();

</span><span style="color: #0000FF;">echo</span><span style="color: #000000;"> </span><span style="color: #000000;">'</span><span style="color: #000000;">$callable is </span><span style="color: #000000;">'</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #008080;">is_callable</span><span style="color: #000000;">(</span><span style="color: #800080;">$callable</span><span style="color: #000000;">) </span><span style="color: #000000;">?</span><span style="color: #000000;"> </span><span style="color: #000000;">''</span><span style="color: #000000;"> </span><span style="color: #000000;">:</span><span style="color: #000000;"> </span><span style="color: #000000;">'</span><span style="color: #000000;">not </span><span style="color: #000000;">'</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">&quot;</span><span style="color: #000000;">a callable object\n</span><span style="color: #000000;">&quot;</span><span style="color: #000000;">;
</span><span style="color: #0000FF;">echo</span><span style="color: #000000;"> </span><span style="color: #000000;">'</span><span style="color: #000000;">$notCallable is </span><span style="color: #000000;">'</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #008080;">is_callable</span><span style="color: #000000;">(</span><span style="color: #800080;">$notCallable</span><span style="color: #000000;">) </span><span style="color: #000000;">?</span><span style="color: #000000;"> </span><span style="color: #000000;">''</span><span style="color: #000000;"> </span><span style="color: #000000;">:</span><span style="color: #000000;"> </span><span style="color: #000000;">'</span><span style="color: #000000;">not </span><span style="color: #000000;">'</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">&quot;</span><span style="color: #000000;">a callable object\n</span><span style="color: #000000;">&quot;</span><span style="color: #000000;">;

</span><span style="color: #0000FF;">echo</span><span style="color: #000000;"> </span><span style="color: #800080;">$callable</span><span style="color: #000000;">();
</span><span style="color: #0000FF;">echo</span><span style="color: #000000;"> </span><span style="color: #800080;">$notCallable</span><span style="color: #000000;">();

</span><span style="color: #008000;">/*</span><span style="color: #008000;">
$callable is a callable object
$notCallable is not a callable object
Guess what?
Fatal error: Function name must be a string in [...]
</span><span style="color: #008000;">*/</span></div>
</pre>
</div>
<p>Tirando le somme lo stato dell&#8217;implementazione di lambda e closure in PHP sembrerebbe essere in uno stato particolarmente avanzato al punto tale che lo stesso Andi Gutmans su php.internals <a title="RE: Closures: updated proposal and patch" href="http://news.php.net/php.internals/38736">ha chiesto</a>, soprattutto ai release manager, di pensare se sia effettivamente possibile includere tutto questo gi&#224; in PHP 5.3. In effetti PHP 5.3 sar&#224; gi&#224; ricco di novit&#224; di per s&#232; (namespace e collaterali, LSB, __callStatic, etc) quindi l&#8217;introduzione di un&#8217;altra nuova feature &#232; da valutare bene, tuttavia vista la buona salute della proposta e dei lavori per implementarla sarebbe un peccato dover aspettare un altro anno o pi&#249;. Intanto per&#242; c&#8217;&#232; anche chi si chiede: ma alla fine le novit&#224; di PHP 6 saranno rappresentate solo dal supporto per Unicode?</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/clorophilla?a=2OZJy0Jt"><img src="http://feeds.feedburner.com/~f/clorophilla?i=2OZJy0Jt" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=nsG59YxP"><img src="http://feeds.feedburner.com/~f/clorophilla?d=43" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=iPAcQF30"><img src="http://feeds.feedburner.com/~f/clorophilla?d=45" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=P92BGxF9"><img src="http://feeds.feedburner.com/~f/clorophilla?d=243" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=oWGHXy7h"><img src="http://feeds.feedburner.com/~f/clorophilla?i=oWGHXy7h" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/clorophilla/~4/o36F5_Ny5FA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.clorophilla.net/blog/?feed=rss2&amp;p=388</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.clorophilla.net/blog/?p=388</feedburner:origLink></item>
		<item>
		<title>Lambda e closure in PHP 5.3? Forse sì, forse no, ma intanto proviamo.</title>
		<link>http://feedproxy.google.com/~r/clorophilla/~3/K0TT9M6c7ZI/</link>
		<comments>http://www.clorophilla.net/blog/?p=387#comments</comments>
		<pubDate>Sat, 28 Jun 2008 18:01:48 +0000</pubDate>
		<dc:creator>NRK</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[closure]]></category>
		<category><![CDATA[lambda]]></category>

		<guid isPermaLink="false">http://www.clorophilla.net/blog/?p=387</guid>
		<description><![CDATA[Negli ultimi giorni sulla mailing list di sviluppo di PHP si sta discutendo sulla possibilit&#224; di estendere il linguaggio in maniera tale da introdurre i concetti di funzioni lambda e di closure tanto cari a molti linguaggi dinamici come Ruby, Python, JavaScript, etc. In realt&#224; si potrebbe quasi considerare come un ritorno di fiamma, gi&#224; [...]]]></description>
			<content:encoded><![CDATA[<p>Negli ultimi giorni sulla mailing list di sviluppo di PHP si sta discutendo sulla possibilit&#224; di estendere il linguaggio in maniera tale da introdurre i concetti di funzioni <strong>lambda</strong> e di <strong>closure</strong> tanto cari a molti linguaggi dinamici come Ruby, Python, JavaScript, etc. In realt&#224; si potrebbe quasi considerare come un ritorno di fiamma, gi&#224; in passato ci furono discussioni simili anche se poco convinte e poco convincenti, tuttavia questa volta si intravede la possibilit&#224; di sfociare in una decisione furba nonostante non ci sia particolare interesse nell&#8217;implementazione da parte di alcuni dei core-dev (tanto per cambiare). Attualmente il tutto ruota intorno a <a title="PHP: rfc:closures    [PHP Wiki]" href="http://wiki.php.net/rfc/closures">una RFC</a> che, oltre a mettere in evidenza alcuni scenari sull&#8217;utilizzo di funzioni lambda e chiusure e riportare i dettagli implementativi nell&#8217;engine di Zend, allega alcune patch con alcune piccole varianti sul tema da applicare ai sorgenti nei rami di sviluppo di PHP 5.3 e PHP 6.0 per poter toccare con mano quanto si sta discutendo.</p>
<p>
<div class="wlWriterSmartContent" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:a4dcf5d5-ea11-4285-a507-3e4dc633277c" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre  style="width:100%;;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #800080;">$fun</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">function</span><span style="color: #000000;">(</span><span style="color: #800080;">$name</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">'</span><span style="color: #000000;">guy</span><span style="color: #000000;">'</span><span style="color: #000000;">) { </span><span style="color: #0000FF;">echo</span><span style="color: #000000;"> </span><span style="color: #000000;">&quot;</span><span style="color: #000000;">Hi </span><span style="color: #800080;">$name</span><span style="color: #000000;">!</span><span style="color: #000000;">&quot;</span><span style="color: #000000;">; };

</span><span style="color: #008080;">printf</span><span style="color: #000000;">(</span><span style="color: #000000;">&quot;</span><span style="color: #000000;">Tipo: %s\n</span><span style="color: #000000;">&quot;</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #008080;">get_class</span><span style="color: #000000;">(</span><span style="color: #800080;">$fun</span><span style="color: #000000;">));           </span><span style="color: #008000;">//</span><span style="color: #008000;"> Type: Closure</span><span style="color: #008000;">
</span><span style="color: #008080;">printf</span><span style="color: #000000;">(</span><span style="color: #000000;">&quot;</span><span style="color: #000000;">Callable: %s\n</span><span style="color: #000000;">&quot;</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #008080;">is_callable</span><span style="color: #000000;">(</span><span style="color: #800080;">$fun</span><span style="color: #000000;">));     </span><span style="color: #008000;">//</span><span style="color: #008000;"> Callable: 1</span></div>
</pre>
</div>
<p>Come possiamo notare, &#232; stato implementato un nuovo tipo in ZE denominato <strong>Closure</strong>. Closure risulta essere invocabile, alla stessa stregua di funzioni e metodi:</p>
<p><div class="wlWriterSmartContent" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:907b4a53-6d72-4110-92ce-4616ac28e0d4" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre  style="width:100%;;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #0000FF;">echo</span><span style="color: #000000;"> </span><span style="color: #800080;">$fun</span><span style="color: #000000;">();        </span><span style="color: #008000;">//</span><span style="color: #008000;"> Hi guy!</span><span style="color: #008000;">
</span><span style="color: #0000FF;">echo</span><span style="color: #000000;"> </span><span style="color: #800080;">$fun</span><span style="color: #000000;">(</span><span style="color: #000000;">'</span><span style="color: #000000;">NRK</span><span style="color: #000000;">'</span><span style="color: #000000;">);   </span><span style="color: #008000;">//</span><span style="color: #008000;"> Hi NRK!</span></div>
</pre>
</div>
<p>Il primo pensiero va a questo punto a tutte quelle funzioni in PHP che accettano delle <strong>callback</strong> ma in cui comodit&#224; ed espressivit&#224; vengono pesantemente minate dall&#8217;attuale modus operandi<em> </em>del linguaggio che prevede due opzioni: </p>
<ul>
<li>definire una funzione tradizionale da usare come argomento <em>callback</em> ma sotto forma di stringa (il nome della funzione stessa), dando quindi origine a potenziali <em>bugs galore</em>.</li>
<li>creare una funzione a runtime usando <a title="PHP: create_function - Manual" href="http://it.php.net/create_function">create_function</a>, opzione che oltre a risultare poco elegante alla vista rischia di introdurre un&#8217;altra buona dose di problemi in termini di manutenibilit&#224; del codice.</li>
</ul>
<p>Ecco quindi un confronto tra come &#232; possibile scrivere codice oggi e la possibilit&#224; di sviluppare la stessa soluzione attraverso l&#8217;utilizzo delle funzioni lambda:</p>
<div class="wlWriterSmartContent" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:fab5dff2-eb4b-41b9-a902-a4e6bdc11c25" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre  style="width:100%;;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #800080;">$array</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">array</span><span style="color: #000000;">(</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">2</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">3</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">4</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">5</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">6</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">7</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">8</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">9</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">10</span><span style="color: #000000;">);

</span><span style="color: #008000;">/*</span><span style="color: #008000;"> senza funzioni lambda </span><span style="color: #008000;">*/</span><span style="color: #000000;">
</span><span style="color: #0000FF;">function</span><span style="color: #000000;"> reducer(</span><span style="color: #800080;">$a</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #800080;">$b</span><span style="color: #000000;">) { </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> </span><span style="color: #800080;">$a</span><span style="color: #000000;"> </span><span style="color: #000000;">*</span><span style="color: #000000;"> </span><span style="color: #800080;">$b</span><span style="color: #000000;">; }
</span><span style="color: #800080;">$res</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #008080;">array_reduce</span><span style="color: #000000;">(</span><span style="color: #800080;">$array</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">'</span><span style="color: #000000;">reducer</span><span style="color: #000000;">'</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">1</span><span style="color: #000000;">);   </span><span style="color: #008000;">//</span><span style="color: #008000;"> 3628800</span><span style="color: #008000;">
</span><span style="color: #000000;">
</span><span style="color: #008000;">/*</span><span style="color: #008000;"> senza funzioni lambda </span><span style="color: #008000;">*/</span><span style="color: #000000;">
</span><span style="color: #800080;">$res</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #008080;">array_reduce</span><span style="color: #000000;">(</span><span style="color: #800080;">$array</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #008080;">create_function</span><span style="color: #000000;">(</span><span style="color: #000000;">'</span><span style="color: #000000;">$a, $b</span><span style="color: #000000;">'</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">'</span><span style="color: #000000;">return $a * $b;</span><span style="color: #000000;">'</span><span style="color: #000000;">)</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">1</span><span style="color: #000000;">);   </span><span style="color: #008000;">//</span><span style="color: #008000;"> 3628800</span><span style="color: #008000;">
</span><span style="color: #000000;">
</span><span style="color: #008000;">/*</span><span style="color: #008000;"> con funzion lambda - versione &quot;lunga&quot; </span><span style="color: #008000;">*/</span><span style="color: #000000;">
</span><span style="color: #800080;">$reducer</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">function</span><span style="color: #000000;">(</span><span style="color: #800080;">$a</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #800080;">$b</span><span style="color: #000000;">) { </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> </span><span style="color: #800080;">$a</span><span style="color: #000000;"> </span><span style="color: #000000;">*</span><span style="color: #000000;"> </span><span style="color: #800080;">$b</span><span style="color: #000000;">; };
</span><span style="color: #800080;">$res</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #008080;">array_reduce</span><span style="color: #000000;">(</span><span style="color: #800080;">$array</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #800080;">$reducer</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">1</span><span style="color: #000000;">);   </span><span style="color: #008000;">//</span><span style="color: #008000;"> 3628800</span><span style="color: #008000;">
</span><span style="color: #000000;">
</span><span style="color: #008000;">/*</span><span style="color: #008000;"> con funzion lambda - versione &quot;breve&quot; </span><span style="color: #008000;">*/</span><span style="color: #000000;">
</span><span style="color: #800080;">$res</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #008080;">array_reduce</span><span style="color: #000000;">(</span><span style="color: #800080;">$array</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #0000FF;">function</span><span style="color: #000000;">(</span><span style="color: #800080;">$a</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #800080;">$b</span><span style="color: #000000;">) { </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> </span><span style="color: #800080;">$a</span><span style="color: #000000;"> </span><span style="color: #000000;">*</span><span style="color: #000000;"> </span><span style="color: #800080;">$b</span><span style="color: #000000;">; }</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">1</span><span style="color: #000000;">);   </span><span style="color: #008000;">//</span><span style="color: #008000;"> 3628800</span></div>
</pre>
</div>
<p>Il fatto che l&#8217;oggetto Closure sia a tutti gli effetti visibile in <em>userland</em> permette anche di sfruttare l&#8217;<a title="PHP: Type Hinting - Manual" href="http://ch2.php.net/language.oop5.typehinting">hinting dei tipi</a> nel caso volessimo limitare a questo tipo di oggetto alcuni parametri delle nostre funzioni:</p>
<p><div class="wlWriterSmartContent" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:f5083e34-979a-4fd3-8cc5-25a90bff098c" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre  style="width:100%;;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #0000FF;">function</span><span style="color: #000000;"> iterate(</span><span style="color: #800080;">$array</span><span style="color: #000000;">,</span><span style="color: #000000;"> Closure </span><span style="color: #800080;">$fun</span><span style="color: #000000;">) {
    </span><span style="color: #0000FF;">foreach</span><span style="color: #000000;"> (</span><span style="color: #800080;">$array</span><span style="color: #000000;"> </span><span style="color: #0000FF;">as</span><span style="color: #000000;"> </span><span style="color: #800080;">$element</span><span style="color: #000000;">)
        </span><span style="color: #800080;">$fun</span><span style="color: #000000;">(</span><span style="color: #800080;">$element</span><span style="color: #000000;">);
}

iterate(</span><span style="color: #800080;">$array</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">'</span><span style="color: #000000;">function</span><span style="color: #000000;">'</span><span style="color: #000000;">);   </span><span style="color: #008000;">//</span><span style="color: #008000;"> genera un Catchable Fatal Error, Argument 2 passed to
                               // iterate() must be an instance of Closure, string given</span><span style="color: #008000;">
</span></div>
</pre>
</div>
<p>Essendo Closure una vera e propria classe (che, per la cronaca, attualmente espone solo un metodo __toString() seppur vuoto) potrebbe implementare in un ipotetico futuro diverse funzionalit&#224; interessanti e chiss&#224;, potrebbe anche essere serializzabile. Ad ogni modo, dopo le funzioni lambda passiamo a vedere le closure:</p>
<div class="wlWriterSmartContent" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:0bc4a6fe-56f3-49ab-90d9-3755ea3c8b22" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre  style="width:100%;;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #800080;">$array</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">array</span><span style="color: #000000;">(</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">2</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">3</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">4</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">5</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">6</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">7</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">8</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">9</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #000000;">10</span><span style="color: #000000;">);

</span><span style="color: #800080;">$sum</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">;

</span><span style="color: #800080;">$fun</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">function</span><span style="color: #000000;">(</span><span style="color: #800080;">$element</span><span style="color: #000000;">) {
    lexical </span><span style="color: #000000;">&amp;</span><span style="color: #800080;">$sum</span><span style="color: #000000;">;
    </span><span style="color: #008000;">//</span><span style="color: #008000;"> ...</span><span style="color: #008000;">
</span><span style="color: #000000;">    </span><span style="color: #800080;">$sum</span><span style="color: #000000;"> </span><span style="color: #000000;">+=</span><span style="color: #000000;"> </span><span style="color: #800080;">$element</span><span style="color: #000000;">;
};

</span><span style="color: #008080;">array_walk</span><span style="color: #000000;">(</span><span style="color: #800080;">$array</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #800080;">$fun</span><span style="color: #000000;">);
</span><span style="color: #0000FF;">echo</span><span style="color: #000000;"> </span><span style="color: #800080;">$sum</span><span style="color: #000000;">;   </span><span style="color: #008000;">//</span><span style="color: #008000;"> 55</span></div>
</pre>
</div>
<p>Possiamo notare l&#8217;introduzione della keyword <strong>lexical</strong> (c&#8217;&#232; anche la variante <strong>use</strong> a seconda della patch che si decide di utilizzare) che ci permette di catturare i riferimenti alle variabili esterne al corpo della chiusura. L&#8217;introduzione di lexical &#232; dovuta al fatto che con questa implementazione non viene catturato tutto l&#8217;ambiente lessicale in cui viene creata la chiusura, come accade invece in altri linguaggi, per motivi legati principalmente alle regole di scope di PHP. Usando lexical possiamo pertanto decidere quali variabili catturare, ma &#232; da notare che attualmente per i tipi numerici o stringa, che per default in PHP sono passati per valore, &#232; necessario creare manualmente un riferimento anteponendo l&#8217;ampersand alla variabile catturata, come da esempio. Tecnicamente la cattura per riferimento dovrebbe essere di default anche per questi tipi e lo stesso creatore della patch &#232; del medesimo avviso, tanto pi&#249; che il terribile <a title="PHP: Variable scope - Manual" href="http://it.php.net/global">global</a> si comporta nello stesso modo creando sempre riferimenti.</p>
<p>In linea di massima l&#8217;introduzione di funzioni lambda e closure in PHP sarebbe interessante e in certe situazioni renderebbe la scrittura dei programmi un po&#8217; meno arrabattata con la possibilit&#224; di ottenere codice molto pi&#249; facilmente generalizzabile e pi&#249; verificabile/manutenibile. Provare &#232; abbastanza facile: basta avere un ambiente configurato per compilare PHP, scaricare i sorgenti di PHP 5.3 o 6.0 dal <a title="PHP: Anonymous CVS Access" href="http://www.php.net/anoncvs.php" target="_blank">repository CVS</a> (s&#236;, usano ancora CVS&#8230;), applicare <a title="PHP: rfc:closures    [PHP Wiki]" href="http://wiki.php.net/rfc/closures#the_patch">una delle patch disponibili</a>, compilare e installare.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/clorophilla?a=uxbb4NN9"><img src="http://feeds.feedburner.com/~f/clorophilla?i=uxbb4NN9" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=pBD8Iuac"><img src="http://feeds.feedburner.com/~f/clorophilla?d=43" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=IKyDBHPd"><img src="http://feeds.feedburner.com/~f/clorophilla?d=45" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=8VyV8SvS"><img src="http://feeds.feedburner.com/~f/clorophilla?d=243" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=6OOL6lj2"><img src="http://feeds.feedburner.com/~f/clorophilla?i=6OOL6lj2" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/clorophilla/~4/K0TT9M6c7ZI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.clorophilla.net/blog/?feed=rss2&amp;p=387</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.clorophilla.net/blog/?p=387</feedburner:origLink></item>
		<item>
		<title>Questo blog supporta OpenID</title>
		<link>http://feedproxy.google.com/~r/clorophilla/~3/N8AWvrbckGs/</link>
		<comments>http://www.clorophilla.net/blog/?p=386#comments</comments>
		<pubDate>Mon, 16 Jun 2008 12:18:38 +0000</pubDate>
		<dc:creator>NRK</dc:creator>
				<category><![CDATA[Internet e dintorni]]></category>
		<category><![CDATA[Varie ed eventuali]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[openid]]></category>
		<category><![CDATA[wp-openid]]></category>

		<guid isPermaLink="false">http://www.clorophilla.net/blog/?p=386</guid>
		<description><![CDATA[Finalmente ieri sera ho attivato su questo blog il supporto per OpenID nei commenti dopo aver tentato l&#8217;impresa nei mesi precedenti provando alcuni plugin i quali, tuttavia, non hanno mai dato risultati molto incoraggianti. Questa volta ho usato WP-OpenID e l&#8217;integrazione con il blog e il suo tema si &#232; dimostrata rapida e indolore. L&#8217;unico [...]]]></description>
			<content:encoded><![CDATA[<p><img style="border-right: 0px; border-top: 0px; margin: 0px 5px 0px 0px; border-left: 0px; border-bottom: 0px" height="91" alt="Logo di OpenID" src="http://www.clorophilla.net/public/wp-uploads/2008/06/openid-big-logo2.png" width="100" align="left" border="0" />Finalmente ieri sera ho attivato su questo blog il supporto per <a title="OpenID - What is OpenID?" href="http://openid.net/what/">OpenID</a> nei commenti dopo aver tentato l&#8217;impresa nei mesi precedenti provando alcuni plugin i quali, tuttavia, non hanno mai dato risultati molto incoraggianti. Questa volta ho usato <a title="WordPress - WP-OpenID - WordPress Plugins" href="http://wordpress.org/extend/plugins/openid/">WP-OpenID</a> e l&#8217;integrazione con il blog e il suo tema si &#232; dimostrata rapida e indolore. L&#8217;unico neo, a cui devo ancora dare una spiegazione ma attendo di avere due minuti in pi&#249; a disposizione per approfondire, riguarda la mancata o errata gestione della delegazione: per esempio il mio OpenID &#232; <a href="http://clorophilla.net">http://clorophilla.net</a> con delegazione a <a title="Welcome to myOpenID" href="https://www.myopenid.com/">myOpenID</a> come provider di identit&#224;, per&#242; quando tento di usarlo nei commenti del mio blog viene generato un errore. Ad ogni modo si tratta di un buon passo in avanti considerato che era da tempo che volevo attivare la possibilit&#224; di commentare sfruttando il proprio OpenID, per sistemare i glitch c&#8217;&#232; tempo.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/clorophilla?a=1gg8L9zH"><img src="http://feeds.feedburner.com/~f/clorophilla?i=1gg8L9zH" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=fI5xGhAp"><img src="http://feeds.feedburner.com/~f/clorophilla?d=43" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=SPSnnB4z"><img src="http://feeds.feedburner.com/~f/clorophilla?d=45" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=LwTDVcz3"><img src="http://feeds.feedburner.com/~f/clorophilla?d=243" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=KalibMBP"><img src="http://feeds.feedburner.com/~f/clorophilla?i=KalibMBP" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/clorophilla/~4/N8AWvrbckGs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.clorophilla.net/blog/?feed=rss2&amp;p=386</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.clorophilla.net/blog/?p=386</feedburner:origLink></item>
		<item>
		<title>IronRuby sempre più vicino a Ruby on Rails</title>
		<link>http://feedproxy.google.com/~r/clorophilla/~3/lWXwBRQhpHo/</link>
		<comments>http://www.clorophilla.net/blog/?p=384#comments</comments>
		<pubDate>Mon, 26 May 2008 19:52:22 +0000</pubDate>
		<dc:creator>NRK</dc:creator>
				<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[IronRuby]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[shoes]]></category>

		<guid isPermaLink="false">http://www.clorophilla.net/blog/?p=384</guid>
		<description><![CDATA[Se non &#232; in grado di far girare Ruby on Rails, allora non &#232; Ruby&#8230; pi&#249; o meno con queste parole John Lam, agli inizi dello sviluppo di IronRuby, aveva sottolineato la volont&#224; di ottenere un&#8217;implementazione del linguaggio che fosse il pi&#249; fedele possibile all&#8217;MRI (l&#8217;interprete originale di Matz). Oggi, con questo suo tweet, arriva [...]]]></description>
			<content:encoded><![CDATA[<p><em>Se non &#232; in grado di far girare Ruby on Rails, allora non &#232; Ruby</em>&#8230; pi&#249; o meno con queste parole John Lam, agli inizi dello sviluppo di <a title="IronRuby" href="http://www.ironruby.net/">IronRuby</a>, aveva sottolineato la volont&#224; di ottenere un&#8217;implementazione del linguaggio che fosse il pi&#249; fedele possibile all&#8217;MRI (l&#8217;interprete originale di Matz). Oggi, con <a title="Twitter / john_lam: IronRuby is now running Hel..." href="http://twitter.com/john_lam/statuses/820318028">questo suo tweet</a>, arriva la prima dimostrazione pratica di come questo obiettivo sia ormai sempre pi&#249; vicino. Ovviamente manca ancora parecchio lavoro per completare IronRuby e attualmente il team &#232; dedicato interamente a implementare e sistemare tutte le parti necessarie a poter effettuare l&#8217;hosting di una semplice applicazione RoR giusto in tempo per la <a title="RailsConf 2008 - O&#39;Reilly Conferences, May 29 - June 01, 2008,Portland, Oregon" href="http://en.oreilly.com/rails2008/public/content/home">RailsConf 2008</a> che avr&#224; inizio tra pochi giorni, ma il ritmo sembra ormai molto buono. E&#8217; interessante far notare che negli ultimi due mesi il lavoro del team di IronRuby si &#232; fatto molto pi&#249; trasparente in seguito a una forte critica sviluppatasi direttamente sulla mailing list, in cui si faceva notare come l&#8217;assenza di aggiornamenti sullo stato dei lavori e i commit in SVN abbastanza rari rendevano il lavoro di contribuzione e di testing molto difficile. La discussione ha generato un dialogo che ha portato a commit decisamente pi&#249; frequenti, post dei diff sulla mailing list e review del codice e dei nuovi sviluppi&#8230; e la comunit&#224; che si sta formando intorno ad IronRuby ha apprezzato. Personalmente in queste ultime due settimane di silenzio sul blog ho avuto modo, tra le varie attivit&#224;, di approfondire pi&#249; seriamente gli internals di IronRuby provando a implementare qualche funzionalit&#224; mancante e devo ammettere che il suo codice e la struttura generale del progetto si sono dimostrati dannatamente ottimi e relativamente facili da capire nonostante non sia ancora esistente documentazione pubblica in merito (sarebbe stata inutile dal momento che il core ha cominciato a stabilizzarsi solo di recente). Se nel frattempo io mi sono divertito con metodi semplici come <em>Kernel#rand</em> e <em>Kernel#srand</em> per poi passare a <em>Kernel#system</em> con relativa classe <em>Process::Status </em>per cominciare a prendere familiarit&#224; con il progetto, <a title="Steve Eichert" href="http://iqueryable.com/">qualcuno</a> si &#232; spinto ben oltre iniziando a ricreare un&#8217;implementazione di <a title="Shoes, a Tiny Toolkit" href="http://code.whytheluckystiff.net/shoes/">Shoes</a> su IronRuby basandosi sulle API .NET di Windows Forms&#8230; potremmo chiamarlo <a title="Creating cross platform GUI&#39;s with IronRuby" href="http://iqueryable.com/2008/05/20/CreatingCrossPlatformGUIsWithIronRuby.aspx">IronShoes</a>? Insomma ad oggi sono fortemente ottimista riguardo al futuro di IronRuby soprattutto visti gli ultimi sviluppi. Sono ottimista anche per la situazione di Ruby in generale perch&#233; stanno arrivando segnali molto interessanti dalla comunit&#224;, ma preferisco parlare di questo in un post successivo.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/clorophilla?a=rU2hyRUi"><img src="http://feeds.feedburner.com/~f/clorophilla?i=rU2hyRUi" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=22uc4DSc"><img src="http://feeds.feedburner.com/~f/clorophilla?d=43" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=2Y7KOpOL"><img src="http://feeds.feedburner.com/~f/clorophilla?d=45" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=ZNv3UPXF"><img src="http://feeds.feedburner.com/~f/clorophilla?d=243" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/clorophilla?a=QnkoIRaC"><img src="http://feeds.feedburner.com/~f/clorophilla?i=QnkoIRaC" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/clorophilla/~4/lWXwBRQhpHo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.clorophilla.net/blog/?feed=rss2&amp;p=384</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.clorophilla.net/blog/?p=384</feedburner:origLink></item>
	</channel>
</rss>
