<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/1.5.1-alpha" -->
<rss version="2.0" 
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
>

<channel>
	<title>PDI^2</title>
	<link>http://riffraff.blogsome.com</link>
	<description>Propulsione d'Improbabilità Infinita</description>
	<pubDate>Mon, 23 Aug 2010 09:38:17 +0000</pubDate>
	<generator>http://wordpress.org/?v=1.5.1-alpha</generator>
	<language>en</language>

		<item>
		<title>Note dal Ruby Social Club Milano 3</title>
		<link>http://riffraff.blogsome.com/2008/09/27/note-dal-ruby-social-club-milano-3/</link>
		<comments>http://riffraff.blogsome.com/2008/09/27/note-dal-ruby-social-club-milano-3/#comments</comments>
		<pubDate>Sat, 27 Sep 2008 13:41:27 +0000</pubDate>
		<dc:creator>gabriele</dc:creator>
		
	<category>ruby</category>
	<category>personale</category>
	<category>rubyonrails</category>
	<category>ruby-it</category>
		<guid>http://riffraff.blogsome.com/2008/09/27/note-dal-ruby-social-club-milano-3/</guid>
		<description><![CDATA[	Passando da milano un paio di giorni fa i rubyisti locali hanno avuto l&#8217;ottima idea di organizzare un meeting.
In fondo un po&#8217; me lo meritavo, essendo stato  presente al primo storico RSC dovevano farmi vedere come siam cresciuto in due anni  
	E cavolo se siamo cresciuti! La prima volta eravamo in cinque o [...]]]></description>
			<content:encoded><![CDATA[	<p>Passando da milano un paio di giorni fa i rubyisti locali hanno avuto l&#8217;ottima idea di <a href="http://www.therubymine.com/2008/9/15/terzo-incontro-del-ruby-social-club-a-milano">organizzare un meeting</a>.<br />
In fondo un po&#8217; me lo meritavo, essendo stato  presente al <a href="http://ruby-it.org/pages/Primo+incontro+del+Ruby+Social+Club+a+Roma">primo storico RSC</a> dovevano farmi vedere come siam cresciuto in due anni <img src='http://riffraff.blogsome.com/wp-images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
	<p>E cavolo se siamo cresciuti! La prima volta eravamo in cinque o sei, se non ricordo male, stavolta eravamo una trentina! Note sparse:</p>
	<ul>
	<li>l&#8217;accoglienza di <a href="http://mikamai.com/">mikamai</a> è stata ottima. Anche perché mi hanno fatto stare da loro per due giorni oltre alla sera del meeting <img src='http://riffraff.blogsome.com/wp-images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
	<li>ben tre donne!</li>
	<li>nei talk si è parlato, tra le altre cose,  di tecnologie di scraping, amazon EC2, assistenti virtuali, visualizzazione di social network con Processing</li>
	<li>all&#8217;ultimo momento ho scoperto di dover fare un mini-talk anche io. Come speaker faccio schifo. <a href="http://docs.google.com/Presentation?id=dgrf9rq4_56gwvnm2dh">La micropresentazione è online</a>, ma siccome è stata accroccata in fretta e con il <a href="http://en.wikipedia.org/wiki/The_Takahashi_method">takahashi method</a> non credo ci capirete niente. Però se volete chiedere fate pure <img src='http://riffraff.blogsome.com/wp-images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
	<li>Matteo Vaccari ha tenuto una pico-sessione al proiettore presentandoci un problema interessante:<br />
	<blockquote><p>
 supponiamo di voler partizionare/ordinare un array in modo che tutti gli elementi X vengano prima di quelli Y.<br />
 Ad esempio, ordinare [1,2,3,4,5,6,7] in modo che tutti i pari vengano prima dei dispari.<br />
 La cosa va fatta <em>in place</em>, in modo che lo spazio usato sia costante (qualche variabile ausiliaria va bene). E in tempo lineare.<br />
 Questo è facile, effettuando uno scan della lista e scambiando ogni volta l&#8217;elemento i-esimo con l&#8217;elemento j-esimo, dove i è inizialmente zero (incremento quando non scambio) e j è array.length -1 (fine array, decremento quando scambio).<br />
 In questo algoritmo l&#8217;invariante è che ogni passo riduce la dimensione dell&#8217;array lasciando le parti esterne ordinate (l&#8217;inizio che si è già passato perché composto da elementi &#8220;minori&#8221; e la fine che si è allontanata perché composta da elementi &#8220;maggiori&#8221;).<br />
Come si fa con una partizione in tre (minori, medi, maggiori) ?
</p></blockquote>
	<p>  Divertitevi, sulla ML <a href="http://www.ruby-forum.com/topic/166712#new">c&#8217;è un thread</a> (spezzato in due) a riguardo</li>
	<li>io avevo anche promesso a un paio di persone di dargli i dati precisi di un altro problemino, ma non mi ricordo a chi l&#8217;ho detto. Beh in ogni caso il problema è il seguente:<br />
	<blockquote><p>Dato un array A di lunghezza N vogliamo produrre in output un array B della stessa lunghezza in cui ogni a ogni elemento A[i] corrisponda il prodotto di tutti gli elementi dell&#8217;array <em>tranne se stesso</em>.<br />
Ad esempio per A= [1,2,3,4] avremmo B= [2*3*4, 1*3*4, 1*2*4, 1*2*3] = [24, 12, 8, 6].</p>
	<p>Ovviamente, in tempo lineare.<br />
Se ora state per dire &#8220;basta usare la divisione..&#8221; beh ovviamente no, senza usare divisione, modulo e similari.
</p></blockquote>
	</li>
	<li>tra le altre cose di cui mi ricordo di aver parlato: couchdb, linguaggio io, bloody mary, le cameriere, django, biologi, ungheria, irlanda, etc etc</li>
	<li>è sempre bello incontrare persone che hai sempre letto sullo schermo e scoprire che hanno una terza dimensione</li>
	</ul>
	<p>Mi scuso con quelli che mi son stati vicini perché credo di aver parlato troppo e ascoltato poco, ma mi ha fatto molto piacere incontrarvi, spero si possa fare di nuovo, e d&#8217;altronde sarebbe anche ora di fare un nuovo RSC meeting a roma <img src='http://riffraff.blogsome.com/wp-images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />
</p>
]]></content:encoded>
			<wfw:commentRss>http://riffraff.blogsome.com/2008/09/27/note-dal-ruby-social-club-milano-3/feed/</wfw:commentRss>
	</item>
		<item>
		<title>script/performance/request in rails 2</title>
		<link>http://riffraff.blogsome.com/2008/01/13/scriptpermformancerequest-in-rails-2/</link>
		<comments>http://riffraff.blogsome.com/2008/01/13/scriptpermformancerequest-in-rails-2/#comments</comments>
		<pubDate>Sun, 13 Jan 2008 10:27:24 +0000</pubDate>
		<dc:creator>gabriele</dc:creator>
		
	<category>personale</category>
	<category>rubyonrails</category>
		<guid>http://riffraff.blogsome.com/2008/01/13/scriptpermformancerequest-in-rails-2/</guid>
		<description><![CDATA[	Avete visto che figa la nuva fìciur che c&#8217;è in rails2? In pratica script/performance/request permette di eseguire uno scriptino che simula un&#8217;interazione dell&#8217;utente effettuandone il profiling. 
	Ora, vi invito a guardare il changelog, che mostra questo fantastico esempio;
	
    $ cat login_session.rb
    get_with_redirect '/'
    say \"GET / [...]]]></description>
			<content:encoded><![CDATA[	<p>Avete visto che figa la nuva fìciur che c&#8217;è in rails2? In pratica <tt>script/performance/request</tt> permette di eseguire uno scriptino che simula un&#8217;interazione dell&#8217;utente effettuandone il profiling. </p>
	<p>Ora, vi invito a guardare il changelog, che mostra questo fantastico esempio;</p>
	<pre>
    $ cat login_session.rb
    get_with_redirect '/'
    say \"GET / => #{path}\"
    post_with_redirect '/sessions', :username => 'john', :password => 'doe'
    say \"POST /sessions => #{path}\"
    $ ./script/performance/request -n 10 login_session.rb
</pre>
	<p>Ora, cosa c&#8217;è che non va in questo eempio, diranno i miei piccoli lettori? Quello che non va in tutti gli esempi che ci sono in rails dalla versione 1.2 in poi, il fatto che non funziona. </p>
	<p>Perché? Semplicemente perché <tt>post_with_redirect</tt> e <tt>get_with_redirect</tt> non esistono. <tt>say</tt>, d&#8217;altro canto, è un <tt>puts</tt> inutuile e non si capisce perché ci sia, forse perché a jeremy kemper piace molto perl6. </p>
	<p>I dati, che verranno generati anonimamente nella directory <tt>tmp/</tt> del vostro progetto, senza che ci sia modo di saperlo, sono d&#8217;altronde i normali dati di ruby-prof, il che significa che vi mostreranno come il 99% del tempo sia speso da rails per definire dei metodi. Sigh sob. Ah e ad ogni esecuzione request si lamenta  di non trovare un file descriptor per la console (?) .</p>
	<p>Mi chiedo che fine abbia fatto quella pulizia e precisione che c&#8217;era in rails pre 1.0 :/
</p>
]]></content:encoded>
			<wfw:commentRss>http://riffraff.blogsome.com/2008/01/13/scriptpermformancerequest-in-rails-2/feed/</wfw:commentRss>
	</item>
		<item>
		<title>Fare casino con IRB, binding ed eval</title>
		<link>http://riffraff.blogsome.com/2007/07/03/fare-casino-con-irb-binding-ed-eval/</link>
		<comments>http://riffraff.blogsome.com/2007/07/03/fare-casino-con-irb-binding-ed-eval/#comments</comments>
		<pubDate>Tue, 03 Jul 2007 21:49:14 +0000</pubDate>
		<dc:creator>gabriele</dc:creator>
		
	<category>ruby</category>
		<guid>http://riffraff.blogsome.com/2007/07/03/fare-casino-con-irb-binding-ed-eval/</guid>
		<description><![CDATA[	Ricordate quando parlavo del mio piccolo doctest per ruby?
	Ok, continua ad essere sporco e puzzolente, ma adesso ha un paio di feature in più, tra cui la possibilità di effettuare il replay di una sessione passata.
Questo significa che se avevate un test-esempio
	
&gt;&gt; a = 10
=&gt; 10
&gt;&gt; b = 20
=&gt; 20
&gt;&gt; def sum(a,b)
&gt;&gt;  a+b
&gt;&gt; end
=&gt; [...]]]></description>
			<content:encoded><![CDATA[	<p>Ricordate quando parlavo del <a href="http://riffraff.blogsome.com/2007/06/12/ruby-doctest-e-lo-pseudofile-data/">mio piccolo doctest per ruby</a>?</p>
	<p>Ok, continua ad essere sporco e puzzolente, ma adesso ha un paio di feature in più, tra cui la possibilità di effettuare il replay di una sessione passata.<br />
Questo significa che se avevate un test-esempio</p>
	<pre><code>
&gt;&gt; a = 10
=&gt; 10
&gt;&gt; b = 20
=&gt; 20
&gt;&gt; def sum(a,b)
&gt;&gt;  a+b
&gt;&gt; end
=&gt; nil
&gt;&gt; sum(a,b)
=> 30
</code></pre>
	<p>potete effettuare il replay della sessione ed andare avanti con</p>
	<pre><code>
&gt;&gt; def triplesum(a,b)
&gt;&gt;  sum(sum(sum(a,b),b),b)
&gt;&gt; end
=&gt; nil
&gt;&gt; triplesum(a,b)
=&gt; 70
</code></pre>
	<p>Che è molto carino, e utile imo.<br />
Ora, dove sta il problema? Primo, nel modo in cui funziona <tt>eval</tt>, secondo, nel modo in cui è scritto IRB. </p>
	<p><strong>evil eval</strong><br />
Che eval sia fondamentalmente malvagio è una cosa rinomata, ma per scrivere un <acronym title="Read Eval Print Loop">REPL</acronym> rimane la cosa più sensata.<br />
Quello che potreste non sapere è che in ruby <tt>eval()</tt> non può definire una variabile nello scope in cui è richiamata. O quasi. </p>
	<p>Lasciate stare IRB e provate questo:</p>
	<pre>
ruby -e \"eval('a=10');a\"
</pre>
	<p>Se tutto funziona normalmente dovreste beccarvi un bel <tt>NameError</tt>. Questo perché <em>il parser</em> non ha mai visto nessuna <tt>a</tt> nello scope corrente.<br />
Se però provate questo:</p>
	<pre>
ruby -e \"eval('a=10');p eval('a')\"
</pre>
	<p>vedrete stampato un bel <tt>10</tt> che dimostra che la variabile <em>esiste</em> solo che non è accessibile con il solito approccio.</p>
	<p><strong>good IRB</strong><br />
IRB però vi frega in questo, guardate un po&#8217;:</p>
	<pre>
&gt;&gt; eval(\"a=10\")
=&gt; 10
&gt;&gt; a
=&gt; 10
</pre>
	<p>Perché? Perché ovviamente IRB usa internamente <tt>eval</tt>, non fa il parsing come l&#8217;interprete farebbe normalmente, e quindi tutto funziona. </p>
	<p><strong>good require</strong><br />
Se caricate un file con <tt>require()</tt> le variabili locali rimangono.. beh.. locali, e quindi non sono accessibili all&#8217;esterno. Allora come facciamo a caricare le variabili locali che avevamo nella sessione precedente?<br />
Non possiamo fare un dump del codice su un file e caricarlo con questo metodo, ma possiamo usare <tt>eval()</tt> per definirle in un oggetto <tt>Binding</tt> e poi convincere IRB che deve usare quell&#8217;oggetto come spazio di lavoro. </p>
	<p><strong>evil IRB</strong><br />
Solo che IRB, di default, non permette di effettuare questa cosa. C&#8217;è un casino di setup quando la console interattiva viene inizializzata, che va dal caricare l&#8217;encoding al verificare la configurazione di default all&#8217;impostare il nome del programma, e tutto questo è fatto tramite <em>IRB.start</em> che non ammette alcun parametro utile per i nostri scopi. </p>
	<p><strong>Soluzione</strong><br />
Qual&#8217;è la prima forma di riuso? Il copia&#038;incolla, esatto. Quindi per definire la nuova funziona ci si limita a ricopiare il codice di quella originale in modo quasi identico, cambiandolo dove serve.</p>
	<p>In attesa che qualcuno ci dia una versione di IRB che ci semplifichi la vita, potete quindi usare il mio <a href="http://darcs.riffraff.info/dbz/test/irbish.rb">IRB.start_in_binding</a> che crea una console per il binding dato (o per <tt>TOPLEVEL_BINDING</tt>).<br />
Pare funzionare, in caso non andasse potete ravanere nei sorgenti di IRB da soli o sfruttare il lavoro fatto da <a href="http://flgr.0x42.net/">flgr</a> in <a href="http://rubyforge.org/projects/ruby-breakpoint/">ruby-breakpoint</a>
</p>
]]></content:encoded>
			<wfw:commentRss>http://riffraff.blogsome.com/2007/07/03/fare-casino-con-irb-binding-ed-eval/feed/</wfw:commentRss>
	</item>
		<item>
		<title>Perché Java è meglio di Ruby</title>
		<link>http://riffraff.blogsome.com/2007/06/22/perche-java-e-meglio-di-ruby/</link>
		<comments>http://riffraff.blogsome.com/2007/06/22/perche-java-e-meglio-di-ruby/#comments</comments>
		<pubDate>Fri, 22 Jun 2007 16:56:08 +0000</pubDate>
		<dc:creator>gabriele</dc:creator>
		
	<category>ruby</category>
	<category>java</category>
	<category>fun</category>
		<guid>http://riffraff.blogsome.com/2007/06/22/perche-java-e-meglio-di-ruby/</guid>
		<description><![CDATA[	Si, siamo una comunità di disturbati, e ne siamo fieri.

]]></description>
			<content:encoded><![CDATA[	<p>Si, <a href="http://monkeyfirst.blogspot.com/2007/06/botta-de-programmazione.html">siamo una comunità di disturbati</a>, e ne siamo fieri.
</p>
]]></content:encoded>
			<wfw:commentRss>http://riffraff.blogsome.com/2007/06/22/perche-java-e-meglio-di-ruby/feed/</wfw:commentRss>
	</item>
		<item>
		<title>Ruby &#038; rails vs J2EE, di nuovo</title>
		<link>http://riffraff.blogsome.com/2007/06/13/ruby-rails-vs-j2ee-di-nuovo/</link>
		<comments>http://riffraff.blogsome.com/2007/06/13/ruby-rails-vs-j2ee-di-nuovo/#comments</comments>
		<pubDate>Wed, 13 Jun 2007 14:44:16 +0000</pubDate>
		<dc:creator>gabriele</dc:creator>
		
	<category>ruby</category>
	<category>java</category>
	<category>blogosfera</category>
		<guid>http://riffraff.blogsome.com/2007/06/13/ruby-rails-vs-j2ee-di-nuovo/</guid>
		<description><![CDATA[	Su TRM c&#8217;è un articoletto che ha l&#8217;intento di spiegare rails al programmatore J2EE, e da lì c&#8217;è un articoletto di risposta di uno sviluppatore J2EE, appunto. 
	Le mie dure lire: usate quello che è più adatto al progetto corrente, che conoscete meglio  e che preferite. &Egrave; il modo giusto per vivere felici  [...]]]></description>
			<content:encoded><![CDATA[	<p>Su TRM c&#8217;è un articoletto che ha l&#8217;intento di <a href="http://www.therubymine.com/articles/2007/06/07/ruby-on-rails-per-il-programmatore-j2ee">spiegare rails al programmatore J2EE</a>, e da lì c&#8217;è un <a href="http://www.tgofbs.it/?p=81">articoletto di risposta</a> di uno sviluppatore J2EE, appunto. </p>
	<p>Le mie dure lire: usate quello che è più adatto al progetto corrente, che conoscete meglio  e che preferite. &Egrave; il modo giusto per vivere felici <img src='http://riffraff.blogsome.com/wp-images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
	<p>Ad ogni modo, nel post e nei commenti ci sono dei punti validi: la m17n in ruby è ancora debole (ma per il web cambia poco, visto che utf8 è gestito), il deploy non è ancora un&#8217;operazione banale, ruby non ha i thread nativi ed è un interprete lento, non esiste accesso a tutta la pletora di MOM che c&#8217;è in java e altro. Ricordo che io, fondamentalmente odio rails <img src='http://riffraff.blogsome.com/wp-images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
	<p>Però, siccome l&#8217;autore dice di cercare l&#8217;oggettività, per quanto ovviamente possibile, mi permetto di rettificare alcune cose sbagliate ( credo siano dovute alla mancanza di conoscenza dell&#8217;ambiente, non a un FUD intenzionale <img src='http://riffraff.blogsome.com/wp-images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  </p>
	<p>Su ruby:</p>
	<ul>
	<li>ruby non ha le variabili dì&#8217;istanza pubbliche di default, anzi non è proprio possibile avere variabili pubbliche, si accede <em>solo</em> attraverso metodi.<br />
Le variabili d&#8217;istanza pubbliche sono una rottura dell&#8217;incapsulazione  (eccezione: property alla python/C#/TP) e infatti in Smalltak, che la OO l&#8217;ha inventata, non esistono. </li>
	<li>non so cosa significhi che la struttura delle classi è neogotica, perché non so qual&#8217;è l&#8217;equivalente degli archi a sesto acuto in ambito programmatorio, ma la gerarchia delle classi mi sembra abbastanza ragionevole. Non c&#8217;è neanche l&#8217;ereditarietà multipla che dovrebbe far storcere il naso ai javisti (io, essendo anche pythonista non ci vedo niente di male <img src='http://riffraff.blogsome.com/wp-images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  </li>
	<li>sinceramente non mi pare sia possibile assegnare una variabile da sinistra a destra in ruby, a meno che non ci sia un operatore &#8220;<tt>-&gt;</tt>&#8221; che non ho mai trovato negli ultimi 6 anni</li>
	<li>le variabili d&#8217;istanza vengono istanziate al volo, vero, ma puoi comunque farlo solo tramite i metodi (o la reflection) quindi non c&#8217;è problema</li>
	<li><em>&#8220;La tipizzazione degli oggetti base è da barzelletta non esiste&#8221;</em>. De gustibus, a me i tipi dinamici piacciono. D&#8217;altronde neanche java è type safe, e HAppS è ancora un po&#8217; ostico per me.</li>
	<li>gli errori sono più comprensibili in ruby imho. Almeno l&#8217;equivalente di NullPointerException ti dice che metodo è stato richiamato, perché <tt>nil</tt> è un oggetto</li>
	<li> mai fallita l&#8217;installazione di una gemma, ma capisco possa accadere. Però il confronto con maven mi pare inappropriato, non è un package manager.</li>
	</ul>
	<p>Su Rails:</p>
	<ul>
	<li> il sistema di template (che imo pone pochi problemi) si cambia in una riga. <tt>script/plugin install liquid | haml | erubis | ya2yaml | amrita | markaby </tt> o quel che volete</li>
	<li> credo che il plurale di persona (as in dramatis persona) sarebbe personae, ma si sa che gli inglese col latino fanno porcate <img src='http://riffraff.blogsome.com/wp-images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Aldilà di questo, è possibile definire le proprie inflection se si vuole un db sgrammaticato (o uno legacy)</li>
	<li> non ho capito che significa che la gestione degli url viene fatta in punti diversi, io la faccio solo in routes.rb</li>
	<li> non so perché non si possa usare un qualsiasi approccio allo sviluppo. In teoria si può sviluppare un&#8217;applicazione RoR anche senza modelli e controller ma grazie  al cielo lo fanno in pochi  <img src='http://riffraff.blogsome.com/wp-images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  </li>
	<li>si può usare uno schema legacy, si può fare. Ci sono pure plugin per farlo. Certo, manca JCA.</li>
	<li> manca il supporto all&#8217;internazionalizzazione <em>builtin</em>, ma esistono plugin come globalize apposta. Rimane sempre meglio averla builtin, come in django (<a href="http://www.riffraff.info/2007/5/31/rails-vs-django-a-non-biased-yet-useless-comparison">lo dicevo di là</a>) e comunque il supporto a unicode è scadente, come dicevo prima, ma c&#8217;è sempre UTF-8.</li>
	<li> non ho capito il problema con gli scaffolding. Quelli servono a evitare di scrivere un po&#8217; di codice, mica sono un&#8217;interfaccia di amministrazione (django++ ma per rails ci sono, ancora, dei plugin)</li>
	</ul>
	<p>Sui punti generali non posso commentare..  non uso capistrano, ViM è il mio IDE e Rails forse non scala ma non per colpa di FastCGI (che è concettualmente molto diverso da CGI). Yahoo, Google, Digg, reddit, Flickr, livejournal etc scalano infinitamente senza servlet.  <small>&lt;flamebait&gt;e poi vorrei vederla questa mega applicazione in java che scala come slashdot, che è fatto con mod_perl &lt;/flamebait&gt;</small></p>
	<p>Ancora, right tool for the job, KISS, long life &#038; prosperity, io domani parto per l&#8217;heineken jammin festival dove non mi preoccuperò di queste cose <img src='http://riffraff.blogsome.com/wp-images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />
</p>
]]></content:encoded>
			<wfw:commentRss>http://riffraff.blogsome.com/2007/06/13/ruby-rails-vs-j2ee-di-nuovo/feed/</wfw:commentRss>
	</item>
		<item>
		<title>ruby, doctest e lo pseudofile DATA</title>
		<link>http://riffraff.blogsome.com/2007/06/12/ruby-doctest-e-lo-pseudofile-data/</link>
		<comments>http://riffraff.blogsome.com/2007/06/12/ruby-doctest-e-lo-pseudofile-data/#comments</comments>
		<pubDate>Tue, 12 Jun 2007 08:33:11 +0000</pubDate>
		<dc:creator>gabriele</dc:creator>
		
	<category>ruby</category>
		<guid>http://riffraff.blogsome.com/2007/06/12/ruby-doctest-e-lo-pseudofile-data/</guid>
		<description><![CDATA[	Sono un maestro del tosare yak.
Ovvero, di quella antica e nobile pratica per cui devi risolvere un problema, che però dipende da un altro, il quale porta a un altro che porta a un altro e a un certo punto ti trovi a depilare uno yak per far funzionare il tuo blog.
	Nel mio caso il [...]]]></description>
			<content:encoded><![CDATA[	<p>Sono un maestro del tosare yak.<br />
Ovvero, di quella antica e nobile pratica per cui devi risolvere un problema, che però dipende da un altro, il quale porta a un altro che porta a un altro e a un certo punto ti trovi a depilare uno yak per far funzionare il tuo blog.</p>
	<p>Nel mio caso il processo è stato</p>
	<ol>
	<li>mephisto non ha la feature X (che ho dimenticato cosa fosse)</li>
	<li>cavolo dovrei scrivermi il mio blog engine..</li>
	<li>beh posso farlo usando <a href="http://ramaze.rubyforge.org/">ramaze</a></li>
	<li>peccato non abbia una gui di amministrazione automatica</li>
	<li>beh posso sempre farla se ho un buon ORM</li>
	<li>ma non mi va di usare <a href="http://ar.rubyonrails.com/">ActiveRecord</a>, oltretutto son sempre stato un fan del <a href="http://www.martinfowler.com/eaaCatalog/dataMapper.html">Data Mapper</a></li>
	<li>oddio c&#8217;è la v0.50 di <a href="http://www.nitroproject.org/">Og</a>.. no  ancora non è rilasciata e non hanno tolto tutti i <tt>rescue Object</tt>&#8230; brrr </li>
	<li>vabè, potrei scrivermene uno io, piccolino, ma ben testato</li>
	<li>cavolo se son brutti sti test..</li>
	<li>ah beh posso usare test/spec</li>
	<li>cavolo sti test fanno schifo..</li>
	<li>e poi non son capace di azzeccare una descrizione..</li>
	<li>ah avessi <a href="http://docs.python.org/lib/module-doctest.html">doctest</a> come in python..</li>
	<li>beh potrei scrivermi il mio..</li>
	</ol>
	<p>Ed è a questo punto che ci ritroviamo, circa una settimana dopo,  1400 righe più tardi, e con SLOCCount che per questo progetto stima 4 mesi di lavoro e una spesa di 38.581 dollari, da investire in 0.83 sviluppatori  (?).</p>
	<p>1400 righe? Ma sei scemo?? diranno ora i miei piccoli lettori.<br />
In verità si, ma non per questo, in quanto solo un quinto di queste sono la libreria, mentre il resto sono i miei test unitari &#038; doctest.<br />
La mia libreria è piccina, se considerate che SLOCCount su ActiveRecord trova       22941 linee di codice <img src='http://riffraff.blogsome.com/wp-images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . </p>
	<p>Ed il bello è che metà di queste righe sono doctest, che nella mia microimplementazione significa: apri irb, prova cose, copincolla.</p>
	<p><strong>Come funziona test/doc</strong></p>
	<p>La &#8220;libreria&#8221; che fa funzionare il tutto è <a href="http://darcs.riffraff.info/dbz/test/doc.rb">lunga ben 30 righe</a>, perché è mal scritta e scorretta, ma io le voglio bene lo stesso. </p>
	<p>L&#8217;idea è semplice: ogni operazione in un <acronym title="Read Eval Print Loop">REPL</acronym> come irb è composta da due parti: il codice, e il risultato. Se usate irb con l&#8217;opzione <tt>&#8211;simple-prompt</tt> si tratta di una cosa come questa:</p>
	<pre><code>
&gt;&gt; codice()
=&gt; risultato
</code></pre>
	<p>dunque se le righe sono in un oggetto enumerabile basta usare <tt>grep</tt> per trovarle e ignorare le altre linee, nelle quali potrete aggiungere utili commenti o, nel mio caso, i <a href="http://www.djangoproject.com/documentation/models/">modeltest</a> di django ancora da tradurre <img src='http://riffraff.blogsome.com/wp-images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  </p>
	<p>Una volta che avete la lista ordinata in coppie input/output basta fare l&#8217;eval del primo e confrontrarlo con il secondo. Facile, no?</p>
	<p>In realtà no, definendo un metodo o una classe in irb questo non va perché vi trovate con input multilinea, ma io mi limito a ignorare il problema, e i miei test sono <a href="http://darcs.riffraff.info/dbz/test/samples/field_defaults.rb">abbastanza carini</a>.</p>
	<p>Ora: dov&#8217;è il posto migliore per mettere i doctest? Nei commenti, potreste dire voi. Concordo in generale, ma in questo caso, visto che le cose da fare sono molte e le righe del modello molto poche, sembrava più conveniente mettere i test nello pseudofile <tt>DATA</tt>.</p>
	<p>Per chi non lo sapesse, ruby mette a disposizione del programmatore una variabile, <tt>DATA</tt> appunto, che si comporta come un oggetto <tt>File</tt>, ovvero è possibile leggere le linee, fare seek etc etc.</p>
	<p>Il contenuto dell&#8217;oggetto non è però un vero file, ma il pezzo del file  .rb corrente che sta dopo dopo la keyword <tt>__END__</tt>.</p>
	<p>Sembrava perfetto per il mio scopo. Nessun <tt>require</tt> strano, nessun problema per fare parsing, codice<br />
&#038; esempi nello stesso file ma separati e dovendo aggiungere una singola linea di codice. </p>
	<p>Senonché, e qui viene il problema, <tt>DATA</tt> non funziona come mi ricordavo io.<br />
Ovvero, la variabile è globale e rappresenta la relativa sezione <em>non</em> del file corrente (cioè di <tt>__FILE__</tt>) ma dello script in esecuzione (cioè <tt>$0</tt> o <tt>$PROGRAM_NAME</tt>).</p>
	<p>Ergo eseguire i miei doctest tramite rcov è impossibile, perché <tt>DATA</tt> è inizializzato, male, in rcov stesso.  Vabè, torniamo al parsing a mano, in fondo basta  leggere il file in un array di linee e poi scorrerlo finché non si trova <tt>__END__</tt></p>
	<p>Però dovrei ridurmi a specificare il nome del file ogni volta che voglio creare un doctest.</p>
	<p>Soluzione: <tt>filename ||= caller[0][ /^.*?(?=:)/ ]</tt>.</p>
	<p>Lasciando stare la Regexp, significa che usiamo come nome del file quello in cui c&#8217;è il codice che crea il DocTest. </p>
	<p>Quindi se ho una riga <tt>DocTest.new</tt> in <tt>test/sample.rb</tt> non c&#8217;è bisogno che usi degli argomenti, perché usando <tt>caller</tt> posso scoprire automaticamente qual&#8217;è il file chiamante (appunto, <tt>test/sample.rb</tt>.</p>
	<p>Ora i miei test funzionano, sono gradevoli e posso usare quelli di django praticamente copincollandoli (come noterete ci son pure gli stessi commenti).<br />
Trentottomila dollari ben spesi!</p>
]]></content:encoded>
			<wfw:commentRss>http://riffraff.blogsome.com/2007/06/12/ruby-doctest-e-lo-pseudofile-data/feed/</wfw:commentRss>
	</item>
		<item>
		<title>Post Archivio n° 17</title>
		<link>http://riffraff.blogsome.com/2007/06/04/p401/</link>
		<comments>http://riffraff.blogsome.com/2007/06/04/p401/#comments</comments>
		<pubDate>Mon, 04 Jun 2007 18:06:20 +0000</pubDate>
		<dc:creator>gabriele</dc:creator>
		
	<category>ruby</category>
	<category>personale</category>
	<category>blogosfera</category>
	<category>web</category>
	<category>ruby-it</category>
		<guid>http://riffraff.blogsome.com/2007/06/04/p401/</guid>
		<description><![CDATA[	Sono in quel momento dell&#8217;anno un cui decido che diventerò una persona migliore. 
	Studiare qualcosa di completamente ignoto, andare a trovare i parenti, telefonare a amici che non sento  da un sacco di tempo, fare attività fisica, scrivere codice che serva minimamente a qualcosa/qualcuno, ripulire l&#8217;hard disk, farmi la barba con regolarità, fumare di [...]]]></description>
			<content:encoded><![CDATA[	<p>Sono in quel momento dell&#8217;anno un cui decido che diventerò una persona migliore. </p>
	<p>Studiare qualcosa di completamente ignoto, andare a trovare i parenti, telefonare a amici che non sento  da un sacco di tempo, fare attività fisica, scrivere codice che serva minimamente a qualcosa/qualcuno, ripulire l&#8217;hard disk, farmi la barba con regolarità, fumare di meno. </p>
	<p>Ergo sono stremato, mi limito a buttare qua qualche link nella peggiore tradizione dei link dump di del.icio.us, scusate, ma ricordate che l&#8217;archivio serve più a me che a voi. </p>
	<ul>
	<li>il <a href="http://forum.hnet.ru/index.php?act=Attach&#038;type=post&#038;id=7770">più bel captcha </a>di sempre</li>
	<li>federico, 1: <a href="http://doc.javastaff.com/?p=47">convertitore pdf -> ipod</a></li>
	<li>federico, 2: <a href="http://www.doubtr.com/">doubtr.com</a>, gli amici che ti danno consigli, 2.0</li>
	<li>giovanni, 1: se siete giocatori apprezzerete questo <a href="http://nicepokervideos.com/">blog che aggrega video sul poker</a>. Ricordate che il vero giocatore non ricorda mai quando perde.</li>
	<li>io che smanetto per <a href="http://www.riffraff.info/2007/6/4/how-to-add-atom-threading-extension-to-mephisto">aggiungere le Atom Thread Extension a mephisto</a>, il che mi ricorda che non ci sono ancora notizie se la mia patch sia accettata, ritenuta inutile, o se quantomeno integrino i miei test che cavolo sono migliori di quelli esistenti <em>e almeno passano</em>. La <em>commit bit anarchy</em> è l&#8217;unica soluzione per lo sviluppo open source, son sempre più convinto. </li>
	<li>nel frattempo mi hanno reddit&#8217;ato. Risultato: un migliaio di visite in più del normale. Nota interessante: >60% dei client sono firefox, 15% IE (più 7 che 6). </li>
	<li>venerdì <a href="http://lists.unbit.it/pipermail/ml/2007-May/005203.html">incontro rubyista</a>. Siccome l&#8217;ambiente stavolta è casalingo magari fate un fischio in anticipo. </li>
	<li>e mercoledì 6 giugno ci state per una seratina a roma tra nerd^Wgeek^Wtecnici^Wblogger^W<em>gente che vuole stare insieme</em>? Dobbiamo solo berci qualche birra e fare due chiacchiere potenzialmente informatiche. Lo so, sarà difficile, senza neanche chiamarlo \w+camp, aprire un wiki o un blog sull&#8217;argomento, scroccare da mangiare da <a href="http://blogs.san-lorenzo.com/sl/2007/01/san_lorenzo_per_il_barcamp_di.html">San Lorenzo</a> o stampare magliette, ma ci proviamo.  </li>
	</ul>
]]></content:encoded>
			<wfw:commentRss>http://riffraff.blogsome.com/2007/06/04/p401/feed/</wfw:commentRss>
	</item>
		<item>
		<title>YARV supporta callcc :)</title>
		<link>http://riffraff.blogsome.com/2007/05/24/yarv-supporta-callcc/</link>
		<comments>http://riffraff.blogsome.com/2007/05/24/yarv-supporta-callcc/#comments</comments>
		<pubDate>Thu, 24 May 2007 13:07:56 +0000</pubDate>
		<dc:creator>gabriele</dc:creator>
		
	<category>ruby</category>
		<guid>http://riffraff.blogsome.com/2007/05/24/yarv-supporta-callcc/</guid>
		<description><![CDATA[	il commento del commit è bellissimo:
	cont.c: support callcc which everyone love. incomplete. please give me bug reports.
	Beh andate e scaricate ruby 1.9.
Stressatelo su, che la release stabile deve essere una roccia 

]]></description>
			<content:encoded><![CDATA[	<p>il commento del commit è bellissimo:</p>
	<blockquote><p>cont.c: support callcc which everyone love. incomplete. please give me bug reports.</p></blockquote>
	<p>Beh andate e scaricate ruby 1.9.<br />
Stressatelo su, che la release stabile deve essere una roccia <img src='http://riffraff.blogsome.com/wp-images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />
</p>
]]></content:encoded>
			<wfw:commentRss>http://riffraff.blogsome.com/2007/05/24/yarv-supporta-callcc/feed/</wfw:commentRss>
	</item>
		<item>
		<title>Ragioni per cui amo ruby numero 1004, 1005</title>
		<link>http://riffraff.blogsome.com/2007/05/17/ragioni-per-cui-amo-ruby-numero-1004-1005/</link>
		<comments>http://riffraff.blogsome.com/2007/05/17/ragioni-per-cui-amo-ruby-numero-1004-1005/#comments</comments>
		<pubDate>Thu, 17 May 2007 15:13:42 +0000</pubDate>
		<dc:creator>gabriele</dc:creator>
		
	<category>ruby</category>
		<guid>http://riffraff.blogsome.com/2007/05/17/ragioni-per-cui-amo-ruby-numero-1004-1005/</guid>
		<description><![CDATA[	Ogni tanto finisco sui blog di ugidotnet, e su quello di Adrian Florea ho trovato questa cosa carina: le cose che non si possono fare con le classi statiche.
	Leggete la lista, è così incredibilmente fico che nessuna di quelle cose abbia senso in ruby (o python)  . 
	(Siete liberi di pensare che un linguaggio [...]]]></description>
			<content:encoded><![CDATA[	<p>Ogni tanto finisco sui <a href="http://blogs.ugidotnet.org/">blog di ugidotnet</a>, e su quello di Adrian Florea ho trovato questa cosa carina: le <a href="http://blogs.ugidotnet.org/adrian/archive/2007/03/23/73690.aspx">cose che non si possono fare con le classi statiche</a>.</p>
	<p>Leggete la lista, è così incredibilmente <em>fico</em> che nessuna di quelle cose abbia senso in ruby (o python) <img src='http://riffraff.blogsome.com/wp-images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . </p>
	<p>(Siete liberi di pensare che un linguaggio non è serio se non ha classi static, non ereditabili etc etc. De gustibus)</p>
	<p>La ragione 1005 è <tt>Module#instance_methods(include_super=true)</tt> cioè la possibilità di chiedere a un modulo (e a una classe, perché <tt>Class.superclass == Module</tt>) quali siano i metodi disponibili in una sua istanza. E usando come argomento <tt>false</tt> si ottiene la lista dei soli metodi definiti lì, senza considerare quelli ereditati.</p>
	<p>Ne parlavo l&#8217;altro giorno con <a href="http://blog.hyperstruct.net/">massimiliano</a>, e oggi mi avrebbe fatto comodo sapere come farlo in python (problema poi completamente aggirato). Coincidenza curiosa.
</p>
]]></content:encoded>
			<wfw:commentRss>http://riffraff.blogsome.com/2007/05/17/ragioni-per-cui-amo-ruby-numero-1004-1005/feed/</wfw:commentRss>
	</item>
		<item>
		<title>Auguri (Chrisblogs|Anarchaia) !</title>
		<link>http://riffraff.blogsome.com/2007/03/30/auguri-chrisblogsanarchaia/</link>
		<comments>http://riffraff.blogsome.com/2007/03/30/auguri-chrisblogsanarchaia/#comments</comments>
		<pubDate>Fri, 30 Mar 2007 08:03:34 +0000</pubDate>
		<dc:creator>gabriele</dc:creator>
		
	<category>ruby</category>
	<category>personale</category>
	<category>web</category>
		<guid>http://riffraff.blogsome.com/2007/03/30/auguri-chrisblogsanarchaia/</guid>
		<description><![CDATA[	Nella comunità ruby (che ahimé, non seguo come un tempo) c&#8217;è sempre stata un sacco di gente interessante. Oddio, il SNR è peggiorato molto negli ultimi due anni ma sorvoliamo.
	Tra questa gente interessante, c&#8217;è chris, che:
	
	programma da dio
	in una dozzina di linguaggi
	mi ha fatto scoprire che si può implementare call/pc con call/cc in un linguaggio [...]]]></description>
			<content:encoded><![CDATA[	<p>Nella comunità ruby (che ahimé, non seguo come un tempo) c&#8217;è sempre stata un sacco di gente interessante. Oddio, il <acronym title="signal noise ratio">SNR</acronym> è peggiorato molto negli ultimi due anni ma sorvoliamo.</p>
	<p>Tra questa gente interessante, c&#8217;è <a href="http://chneukirchen.org/">chris</a>, che:</p>
	<ul>
	<li>programma da dio</li>
	<li>in una dozzina di linguaggi</li>
	<li>mi ha fatto scoprire che si può implementare call/pc con call/cc in un linguaggio imperativo</li>
	<li>ha sense of humor</li>
	<li>è dannatamente più giovane di me e ne sa il quadruplo, di tutto</li>
	</ul>
	<p>Oggi, innalzo le lodi di chris blogs, il suo <a href="http://chneukirchen.org/blog/archive/2007/03/three-years-of-chris-blogs.html">blog che compie tre anni,</a> e dei <a href="http://chneukirchen.org/blog/archive/2007/03/celebrating-two-years-of-anarchaia.html">due anni di Anarchaia</a>, l&#8217;insalata mista più bella della rete. </p>
	<p>Eh già, perché è stato lui ha inventare i tumblelog, per quanto credo che il nome l&#8217;abbia inventato _why. D&#8217;altronde ora c&#8217;è tumblr che ha un sacco successo, ma io ho sempre pensato che il tuo tumblelog devi scriverlo da te <img src='http://riffraff.blogsome.com/wp-images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
	<p>E siccome io ne ho scritt una dozzina e poi non li ho mai pubblicati, e siccome ne avevo uno che mi son dimenticato di postare nel&#8217;ultimo anno, eccovi il mio tumblelog minimale, che si ottiene mettendo questo codice in <tt>rub.rb</tt> in un&#8217;applicazione nitro.<br />
Non so se funzioni ancora. Forse funziona con <a href="http://ramaze.rubyforge.orgv">Ramaze</a>.</p>
	<pre>
<code>
require \'nitro_and_og\'
require \'glue/timestamped\'
require \'skin\'
require \'nitro/helper/feed\'
require \'part/admin\'
	
class Thing
  is Og::SchemaInheritanceBase, TimestampedOnCreate
  property :text, :control=&gt;:textarea
  property :title
  def to_href
    \&quot;/thing/#{oid}\&quot;
  end
  def to_html
    %(&lt;p class=\&quot;thing\&quot;&gt;#{text}&lt;/p&gt;)
  end
end
	
def thing(p, &#038;block)
  Class.new(Thing) do
    property p, String
    define_method :to_html, block
  end
end
	
Quote      = thing(:author)    {\&quot;&lt;blockquote&gt;%s&lt;/blockquote&gt;\&quot;%text}
Irc        = thing(:channel)   {\&quot;&lt;pre&gt;%s&lt;/pre&gt;&lt;p&gt;on %s&lt;/p&gt;\&quot;%[text,channel]}
Snippet    = thing(:language)  {\&quot;&lt;pre&gt;%s&lt;/pre&gt;\&quot;%text}
Image      = thing(:url)       {\'&lt;img src=\&quot;%s\&quot; alt=\&quot;%s\&quot;/&gt;&lt;p&gt;   %s&lt;/p&gt;\'%[url,title,text]}
Link       = thing(:url)       {\'&lt;a href=\&quot;%s\&quot;&gt;%s&lt;/a&gt;, %s\'%[url,title,text]}
	
Og.setup # default sqlite
	
class Home &lt; Nitro::Controller
  helper :feed, :pager
  def atom
    response.content_type = &quot;application/atom+xml&quot;
    build_atom  Thing.latest,
                :title =&gt; &quot;Tum! Atom Feed&quot;,
                :base=&gt; &quot;http://my.domain.info&quot;
  end
  def login(pass)
    session[:ADMIN]=true if pass == 'password'
  end
end
	
Nitro.run(Home)
</code>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://riffraff.blogsome.com/2007/03/30/auguri-chrisblogsanarchaia/feed/</wfw:commentRss>
	</item>
	</channel>
</rss>

