<?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>Sun, 08 Jun 2008 23:00:17 +0000</pubDate>
	<generator>http://wordpress.org/?v=1.5.1-alpha</generator>
	<language>en</language>

		<item>
		<title>articoletto su darcs</title>
		<link>http://riffraff.blogsome.com/2008/02/04/articoletto-su-darcs/</link>
		<comments>http://riffraff.blogsome.com/2008/02/04/articoletto-su-darcs/#comments</comments>
		<pubDate>Mon, 04 Feb 2008 08:02:10 +0000</pubDate>
		<dc:creator>gabriele</dc:creator>
		
	<category>programmazione</category>
	<category>web</category>
		<guid>http://riffraff.blogsome.com/2008/02/04/articoletto-su-darcs/</guid>
		<description><![CDATA[	Su StackTrace l&#8217;editor della categoria SW Engineering (piergiuliano bossi) ha pubblicato un mio articoletto su darcs, andate a darci un&#8217;occhiata  
	Se l&#8217;editor di The Ruby Mine (andrea reginato) trova tempo di riscriver^Wcorreggerlo, dovrebbe apparire un mio articoletto anche lì.
	E con questo posso tirare una riga su &#8220;Cose da fare nel 2008:   scrivere [...]]]></description>
			<content:encoded><![CDATA[	<p>Su StackTrace l&#8217;editor della categoria SW Engineering (piergiuliano bossi) ha pubblicato <a href="http://stacktrace.it/articoli/2008/02/perche-amare-darcs-e-perche-odiarlo/">un mio articoletto su darcs</a>, andate a darci un&#8217;occhiata <img src='http://riffraff.blogsome.com/wp-images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
	<p>Se l&#8217;editor di <a href="http://www.therubymine.com/">The Ruby Mine</a> (andrea reginato) trova tempo di riscriver^Wcorreggerlo, dovrebbe apparire un mio articoletto anche lì.</p>
	<p>E con questo posso tirare una riga su &#8220;<em>Cose da fare nel 2008:   scrivere qualcosa per TRM e ST</em>&#8220;.
</p>
]]></content:encoded>
			<wfw:commentRss>http://riffraff.blogsome.com/2008/02/04/articoletto-su-darcs/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>Ah, i professionisti</title>
		<link>http://riffraff.blogsome.com/2007/12/21/ah-i-professionisti/</link>
		<comments>http://riffraff.blogsome.com/2007/12/21/ah-i-professionisti/#comments</comments>
		<pubDate>Fri, 21 Dec 2007 08:43:45 +0000</pubDate>
		<dc:creator>gabriele</dc:creator>
		
	<category>programmazione</category>
	<category>personale</category>
		<guid>http://riffraff.blogsome.com/2007/12/21/ah-i-professionisti/</guid>
		<description><![CDATA[	Tra le cose che amo di più c&#8217;è il realizzare, di tanto in tanto, quanta aria fritta viene pompata ad altissima pressione e velocità da chiunque. Me in primis, quindi la cosa dà serenità, una specie di ansia-da-prestazione-litico.
	Ora, prendiamo rails. Ci lavorano un sacco di professional da un sacco di tempo. Io non amo rails, [...]]]></description>
			<content:encoded><![CDATA[	<p>Tra le cose che amo di più c&#8217;è il realizzare, di tanto in tanto, quanta aria fritta viene pompata ad altissima pressione e velocità da chiunque. Me in primis, quindi la cosa dà serenità, una specie di ansia-da-prestazione-litico.</p>
	<p>Ora, prendiamo rails. Ci lavorano un sacco di <em>professional</em> da un sacco di tempo. Io non amo rails, ma cavolo, è oggettivamente potente, e io ne conosco forse il 20%.</p>
	<p>Rails offre un&#8217;infrastruttura per la scrittura di test che è fantastica, chiunque ci abbia messo mano vi dirà quanto sono fighi i test funzionali, quelli unitari, <em>assert_valid_markup</em>, le fixture automatiche etc etc. </p>
	<p>Vi diranno anche che i <em>test dì integrazione</em>, quelli che servono a verificare che i vari pezzi del progetto funzionino insieme, sono una figata pazzesca.</p>
	<p>La cosa simpatica, è che nei test di integrazione <e>è impossibile testare l&#8217;upload di un file, a causa di un bug che esiste da due anni, <a href="http://dev.rubyonrails.org/ticket/4635">con il suo bel ticket</a>, e c&#8217;è anche la patch. Ho provato a chiedere nella ML internazionale, ma la mail è passata in silenzio, c&#8217;è troppo traffico e di bassa competenza su quella lista. Su <a href="http://ruby-it.org">ruby-it</a> c&#8217;è stato un feedback volenteroso, ma appunto abbiamo concluso che c&#8217;è un bug. </p>
	<p>Ora riflettete: è impossibile testare gli upload, da due anni.<br />
Significa che tutti i <em>professional</em> che ci sono la fuori, negli ultimi due anni, non hanno mai scritto un test per verificare se funziona l&#8217;upload di un file. </p>
	<p>Che tradotto significa: o negli ultimi due anni nessuno ha mai usato un <tt>file_field</tt>, o nessuno la fuori ha mai fatto sviluppo TDD. Ma che dico TDD, diciamo &#8220;test automatici&#8221;, in generale, anche fossero alla fine di un processo waterfall.<br />
&Egrave; bello sapere che gli altri sono cazzoni quanto me <img src='http://riffraff.blogsome.com/wp-images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
	<p>PS<br />
<em>esiste la possibilità però che il vero professional testi tutto con selenium..</em></e>
</p>
]]></content:encoded>
			<wfw:commentRss>http://riffraff.blogsome.com/2007/12/21/ah-i-professionisti/feed/</wfw:commentRss>
	</item>
		<item>
		<title>coComments diventa uno schifo, passo a co.mments e mi scrive l&#8217;estensione</title>
		<link>http://riffraff.blogsome.com/2007/08/31/cocomments-diventa-uno-schifo-passo-a-comments-e-mi-scrive-lestensione/</link>
		<comments>http://riffraff.blogsome.com/2007/08/31/cocomments-diventa-uno-schifo-passo-a-comments-e-mi-scrive-lestensione/#comments</comments>
		<pubDate>Fri, 31 Aug 2007 10:32:50 +0000</pubDate>
		<dc:creator>gabriele</dc:creator>
		
	<category>programmazione</category>
	<category>web</category>
	<category>software</category>
		<guid>http://riffraff.blogsome.com/2007/08/31/cocomments-diventa-uno-schifo-passo-a-comments-e-mi-scrive-lestensione/</guid>
		<description><![CDATA[	La versione 2.0 beta di coComments è stata accolta da una salva di critiche enorme, al punto che gli autori hanno tenuto a specificare che no, suvvia, non è che deve rimanere così, gli utenti sono quelli che comandano etc etc&#8230;
	A me però anche dopo le ri-modifiche continua a non piacere. Già prima era abbastanza [...]]]></description>
			<content:encoded><![CDATA[	<p>La versione 2.0 beta di coComments è stata accolta da una salva di critiche enorme, al punto che gli autori hanno tenuto a specificare che no, suvvia, non è che deve rimanere così, gli utenti sono quelli che comandano etc etc&#8230;</p>
	<p>A me però anche dopo le ri-modifiche continua a non piacere. Già prima era abbastanza bruttino, e l&#8217;estensione per firefox, per quanto potente, era ultralenta. </p>
	<p>Per cui sto sperimentando con co.mments.com, che ha un tracking dei commenti molto migliore. </p>
	<p>Purtroppo non ha integrazione col browser, il che significa dover cliccare su una bookmarklet per registrare una conversazione e visitare il sito per vedere le novità (o leggere il feed). </p>
	<p>Per la prima cosa, non è un vero problema, e anzi, ha dei vantaggi. </p>
	<p>La seconda è un po&#8217; scomoda, per cui ho smanettato un po&#8217; e mi son tirato fuori un&#8217;estensione per firefox che mostra un&#8217;iconcina colorata nella status bar quando ci sono nuovi commenti, e cliccando sulla quale si può andare a vedere il tracking.<br />
Ho smanettato due ore, poi <a href="http://hyperstruct.net/">le divinità di javascript</a> mi hanno dato una mano e ho ottenuto una cosa funzionante in 4 minuti netti. </p>
	<p>Se volete provarla fate un fischio.
</p>
]]></content:encoded>
			<wfw:commentRss>http://riffraff.blogsome.com/2007/08/31/cocomments-diventa-uno-schifo-passo-a-comments-e-mi-scrive-lestensione/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>Costruttori brutti linguaggi dinamici belli</title>
		<link>http://riffraff.blogsome.com/2007/06/26/costruttori-brutti-linguaggi-dinamici-belli/</link>
		<comments>http://riffraff.blogsome.com/2007/06/26/costruttori-brutti-linguaggi-dinamici-belli/#comments</comments>
		<pubDate>Tue, 26 Jun 2007 08:55:17 +0000</pubDate>
		<dc:creator>gabriele</dc:creator>
		
	<category>programmazione</category>
		<guid>http://riffraff.blogsome.com/2007/06/26/costruttori-brutti-linguaggi-dinamici-belli/</guid>
		<description><![CDATA[	Sul blog di gilad bracha c&#8217;è un post che parla del perché i costruttori sono anti-oo.
Giovanni Corriga(finalmente ha un blog!), vi direbbe che è perché la gente continua a pensare agli &#8220;oggetti&#8221; invece che ai &#8220;messaggi&#8221;. In pratica cosa c&#8217;è che non va?
	Fondamentalmente, che usando un costruttore alla java/c#/c++ si introduce un accoppiamento forte nel [...]]]></description>
			<content:encoded><![CDATA[	<p>Sul blog di gilad bracha c&#8217;è un post che parla del perché <a href="http://gbracha.blogspot.com/2007/06/constructors-considered-harmful.html">i costruttori sono anti-oo</a>.<br />
<a href="http://blogs.corriga.net/giovanni/">Giovanni Corriga</a>(finalmente ha un blog!), vi direbbe che è perché la gente continua a pensare agli &#8220;oggetti&#8221; invece che ai &#8220;messaggi&#8221;. In pratica cosa c&#8217;è che non va?</p>
	<p>Fondamentalmente, che usando un costruttore alla java/c#/c++ si introduce un accoppiamento forte nel codice che andrebbe evitato. &Egrave; una nozione abbastanza diffusa che uno dovrebbe scrivere codice relativo all&#8217;interfaccia e non all&#8217;implementazione, e invece usando i costruttori ci si lega invariabilmente a un certo modo di fare le cose. Esempio scemo:</p>
	<p><code>
<pre>
DatabaseMapper dm = new DatabaseMapper()
dm.save(someObject)
</pre>
</code></p>
	<p>A un certo punto vi rendete conto che DatabaseMapper potrebbe essere preferibile come singleton o come un riferimento a un pool di oggetti. In qualsiasi modo vogliate spostarvi dall&#8217;avere un oggetto sarete costretti a rompere l&#8217;interfaccia introducendo un metodo come <code>getInstance()</code> e nascondendo il costruttore. </p>
	<p>In ruby, Smalltalk, python, perl e CL, invece, non esiste un concetto speciale di costruttore.<br />
Un metodo è responsabile di allocare un oggetto. Un altro metodo è responsabile per l&#8217;inizializzazione. Infine, un comodo metodo di utilità si occupa di fare entrambe le cose.<br />
Scrivendo<br />
<code>
<pre>
 dm = DatabaseMapper()
</pre>
</code> in python quello che in realtà accade è che richiamate il metodo <code>__call__()</code> il quale a sua volta alloca l&#8217;oggetto con <code>__new__()</code>, lo inizializza con <code>__init()</code> e lo restituisce. </p>
	<p>Quando decidete di passare al singleton non dovete far altro che cambiare un metodo e tutto continua a funzionare correttamente.<br />
Lo stesso discorso vale per ruby, solo che i metodi in questione sono <code>new</code>, <code>allocate</code> e <code>initialize</code>. </p>
	<p>Smalltalk e common lisp, per quel che ne so, seguono lo stesso identico approccio, con la sola singola differenza che i metodi non hanno una visibilità ristretta ma sono pubblici.  Nel post di gilad bracha si parla di Smalltalk dicendo che non forza il fatto che un oggetto sia inizializzato una sola volta, e immagino parli di questo, ma da buon programmatore dinamico io ritengo che si tratti di un non-problema.</p>
	<p>Il linguaggio non deve costringere a fare cose stupide, ma non è utile  trattare il programmatore da idiota.</p>
	<p>Ad ogni modo credo sia interessante considerare come, ancora una volta, aggiungere un costrutto ad un linguaggio (i costruttori) ne diminuisca le potenzialità invece di aumentarle. Meditate gente, meditate.
</p>
]]></content:encoded>
			<wfw:commentRss>http://riffraff.blogsome.com/2007/06/26/costruttori-brutti-linguaggi-dinamici-belli/feed/</wfw:commentRss>
	</item>
		<item>
		<title>UidBind e il self-marketing</title>
		<link>http://riffraff.blogsome.com/2007/06/24/uidbind-e-il-self-marketing/</link>
		<comments>http://riffraff.blogsome.com/2007/06/24/uidbind-e-il-self-marketing/#comments</comments>
		<pubDate>Sun, 24 Jun 2007 14:37:41 +0000</pubDate>
		<dc:creator>gabriele</dc:creator>
		
	<category>programmazione</category>
	<category>linux</category>
	<category>web</category>
		<guid>http://riffraff.blogsome.com/2007/06/24/uidbind-e-il-self-marketing/</guid>
		<description><![CDATA[	Da anni sono un utente felice di un certo servizio di hosting,  per vari motivi.
	Primo, sono open-source friendly. Nel senso che usano software libero, contribuiscono allo sviluppo di quel che usano e supportano la gente che supporta l&#8217;open source, come ruby-it o ziobudda .
	Secondo, ho il supporto via jabber di una persona (roberto) che [...]]]></description>
			<content:encoded><![CDATA[	<p>Da anni sono un utente felice di un certo <a href="http://www.unbit.it">servizio di hosting</a>,  per vari motivi.</p>
	<p>Primo, sono open-source friendly. Nel senso che usano software libero, contribuiscono allo sviluppo di quel che usano e <em>supportano la gente che supporta</em> l&#8217;open source, come <a href="http://ruby-it.org">ruby-it</a> o <a href="http://www.ziobudda.net">ziobudda </a>.</p>
	<p>Secondo, ho il supporto via jabber di una persona (roberto) che conosco di persona <img src='http://riffraff.blogsome.com/wp-images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
	<p>Terzo, sono una manica di hacker, nel senso positivo del termine. Il vero motivo per cui su unbit è possibile usare <a href="http://wiki.unbit.it/HowtoCamping">Camping</a> o <a href="http://wiki.unbit.it/HowtoDjango">Django</a>,  si ha disposizione <a href="http://wiki.unbit.it/HowtoMercurial">mercurial</a>, e si può accedere al pannello di controllo tramite XMP-RPC è perché è fico, non perché ci sia un grosso mercato. </p>
	<p>Ma essendo una manica di hacker hanno anche i tipici difetti di relazione col mondo, ad esempio una homepage inaccessibile.</p>
	<p>Tutto questo per parlarvi di <a href="http://projects.unbit.it/uidbind">uidbind</a>,  che è un modulo kernel per linux che permette di impostare permessi di accesso granulari a specifiche porte TCP/UDP. </p>
	<p>L&#8217;amministratore può, tramite un albero di directory configfs, selezionare alcune porte e rendere possibile solo all&#8217;utente X di effettuare una <tt>bind()</tt> su di esse, il che ha un grosso potenziale per evitare che si crei casino. </p>
	<p>Mettiamo che si permetta agli utenti di lanciare dei server (esempio: mongrel, o tomcat). Il default è che gli utenti comincino a pestarsi i piedi a vicenda, andando ogni volta a occupare le porte altrui e forzando un algoritmo distribuito di &#8220;<em>ti frego la porta o devo modificare le configurazioni</em>&#8221; che è decisamente sgradevole. </p>
	<p>Con uidbind è possibile assegnare ad ogni utente una porta e far si che usi sempre e solo quella e che nessun altro abbia la possibilità di usarla, in nessun modo.</p>
	<p>Il modulo ha anche il potenziale di eliminare quella vecchissima eredità di UNIX per cui le prime 1024 porte sono riservate a root. La ragione, all&#8217;epoca, era che si voleva evitare che un utente potesse effettuare l&#8217;hijack di servizi trusted (esempio: telnet o http), ma l&#8217;effetto collaterale è che ancora oggi tutti i servizi classici devono partire inizialmente come root.<br />
Facendo si che l&#8217;accesso alle porte sia gestito in modo granulare sarebbe possibile riservare le prime porte a root e poi, caso per caso, riassegnarle ad utenti specifici come httpd o smtpd, superando finalmente limitazioni vecchie di decenni.</p>
	<p>Ora vabè che il modulo è ancora in betamm ma guardate la pagina di uidbind. Neanche un po&#8217; di auto-esaltazione porca miseria!
</p>
]]></content:encoded>
			<wfw:commentRss>http://riffraff.blogsome.com/2007/06/24/uidbind-e-il-self-marketing/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>
	</channel>
</rss>
