<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>Ruby on Rails stuffs</description><title>Programmer@work</title><generator>Tumblr (3.0; @pioz)</generator><link>http://blog.pioz.it/</link><item><title>Dual boot Linux SATA HD and Windows IDE HD with GRUB2</title><description>&lt;p&gt;Ok vediamo come fare:
Creiamo un file &lt;code&gt;/etc/grub.d/11_windows&lt;/code&gt; come segue:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/bin/sh -e
echo "Found Windows XP" &gt;&amp;2
cat &lt;&lt; EOF
menuentry "Window XP" {
drivemap (hd0) (hd1)
drivemap (hd1) (hd0)
set root=(hd1,1)
chainloader +1
}
EOF
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ricordate che in grub2 la mappatura degli HD e delle partizioni e` cambiata:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;code&gt;sda1 =&gt; hd0,1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sda2 =&gt; hd0,2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sdb1 =&gt; hd1,1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sdc2 =&gt; hd2,2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;…&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Ora aggiorniamo il &lt;code&gt;grub.cfg&lt;/code&gt; con il comando&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo update-grub
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Dovremmo vedere un output del genere:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Generating grub.cfg ...
Found linux image: /boot/vmlinuz-2.6.38-10-generic
Found initrd image: /boot/initrd.img-2.6.38-10-generic
Found linux image: /boot/vmlinuz-2.6.38-8-generic
Found initrd image: /boot/initrd.img-2.6.38-8-generic
Found Windows XP
Found memtest86+ image: /boot/memtest86+.bin
done
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Reboot e viaaa…&lt;/p&gt;</description><link>http://blog.pioz.it/post/6905905296</link><guid>http://blog.pioz.it/post/6905905296</guid><pubDate>Sat, 25 Jun 2011 18:27:45 +0200</pubDate><category>dual boot</category><category>linux</category><category>windows</category><category>sata</category><category>IDE</category><category>grub2</category></item><item><title>init.d script to run Apache SOLR</title><description>&lt;p&gt;Copiate il seguente script in &lt;code&gt;/etc/init.d/solr&lt;/code&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/bin/sh

PATH=/opt/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
NAME=solr
DESC=apache-solr
VERSION=1.4.1
SOLR_PATH=/opt/solr-$VERSION
COMMAND=/usr/bin/java
OPTIONS="-Dsolr.solr.home=$SOLR_PATH/solr -Djetty.home=$SOLR_PATH -jar $SOLR_PATH/start.jar"    
PIDFILE=/var/run/$NAME.pid

test -x $COMMAND || exit 0
test -f $SOLR_PATH/start.jar || exit 0

set -e

case "$1" in
  start)
        if [ -f $PIDFILE ]; then
          echo "$PIDFILE exists. $NAME may be running."
        else
          echo -n "Starting $DESC: "
          start-stop-daemon -b -p$PIDFILE -d$SOLR_PATH --start --quiet --exec $COMMAND -- $OPTIONS
          sleep 3
          echo `ps -ef | grep -v grep | grep "$COMMAND $OPTIONS" | awk '{print $2}'` &gt; $PIDFILE
          echo "$NAME."
        fi
        ;;
  stop)
        if [ -f $PIDFILE ]; then
          echo -n "Stopping $DESC: "
          kill `cat $PIDFILE`
          rm -f $PIDFILE
          echo "$NAME."
        else
          echo "$PIDFILE does not exist. $NAME may be not running."
        fi
        ;;
  restart)
        /etc/init.d/$NAME stop
        sleep 1
        /etc/init.d/$NAME start
        ;;
  *)
        echo "Usage: /etc/init.d/$NAME {start|stop|restart}" &gt;&amp;2
        exit 1
        ;;
esac

exit 0
&lt;/code&gt;&lt;/pre&gt;</description><link>http://blog.pioz.it/post/3501997634</link><guid>http://blog.pioz.it/post/3501997634</guid><pubDate>Fri, 25 Feb 2011 13:57:00 +0100</pubDate><category>script</category><category>solr</category><category>linux</category><category>daemon</category></item><item><title>Goobalize3

Goobalize3 (Google + Globalize3) is useful to auto translate the attributes of your...</title><description>&lt;h1&gt;Goobalize3&lt;/h1&gt;

&lt;p&gt;Goobalize3 (Google + Globalize3) is useful to auto translate the attributes of your activerecord models.&lt;/p&gt;

&lt;p&gt;If you have a model with some attributes translated with Globalize3 you can in easy way auto translate them via Google Translate.&lt;/p&gt;

&lt;h2&gt;Installation&lt;/h2&gt;

&lt;p&gt;As gem: put &lt;code&gt;gem 'goobalize3'&lt;/code&gt; in your Gemfile&lt;br/&gt;
As plugin: run &lt;code&gt;rails plugin install git@github.com:pioz/goobalize3.git&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;Requirements&lt;/h2&gt;

&lt;ul&gt;&lt;li&gt;Globalize3&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;Usage&lt;/h2&gt;

&lt;p&gt;First of all, you need to create &lt;code&gt;google_translate.yml&lt;/code&gt; configuration file in your &lt;code&gt;config&lt;/code&gt; folder. Put&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;api : YOUR_GOOGLE_TRANSLATE_API_KEY
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can get api key at this link: &lt;a href="https://code.google.com/apis/console/" target="_blank"&gt;https://code.google.com/apis/console/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, you can auto translate all globalized attributes of an activerecord object with&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;@post.translate
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;this translate the attributes from current set locale (&lt;code&gt;I18n.locale&lt;/code&gt;) to all available locales (&lt;code&gt;I18n.available_locales - I18n.locale&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;You can set also the target locales&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;@post.translate(:it, :en, :de)
&lt;/code&gt;&lt;/pre&gt;</description><link>http://blog.pioz.it/post/2907084345</link><guid>http://blog.pioz.it/post/2907084345</guid><pubDate>Mon, 24 Jan 2011 09:30:49 +0100</pubDate></item><item><title>Ruby pre-defined variables</title><description>&lt;p&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;$!&lt;/code&gt;  The exception information message set by ‘raise’.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$@&lt;/code&gt;         Array of backtrace of the last exception thrown.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$&amp;&lt;/code&gt;         The string matched by the last successful match.&lt;/li&gt;
&lt;li&gt;$`         The string to the left  of the last successful match.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$'&lt;/code&gt;         The string to the right of the last successful match.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$+&lt;/code&gt;         The highest group matched by the last successful match.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$1&lt;/code&gt;         The Nth group of the last successful match. May be &gt; 1.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$~&lt;/code&gt;         The information about the last match in the current scope.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$=&lt;/code&gt;         The flag for case insensitive, nil by default.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$/&lt;/code&gt;         The input record separator, newline by default.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$\&lt;/code&gt;         The output record separator for the print and IO#write. Default is nil.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$,&lt;/code&gt;         The output field separator for the print and Array#join.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$;&lt;/code&gt;         The default separator for String#split.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$.&lt;/code&gt;         The current input line number of the last file that was read.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$&lt;&lt;/code&gt;         The virtual concatenation file of the files given on command line (or from $stdin if no files were given).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$&gt;&lt;/code&gt;         The default output for print, printf. $stdout by default.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$_&lt;/code&gt;         The last input line of string by gets or readline.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$0&lt;/code&gt;         Contains the name of the script being executed. May be assignable.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$*&lt;/code&gt;         Command line arguments given for the script sans args.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$$&lt;/code&gt;         The process number of the Ruby running this script.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$?&lt;/code&gt;         The status of the last executed child process.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$:&lt;/code&gt;         Load path for scripts and binary modules by load or require.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$"&lt;/code&gt;         The array contains the module names loaded by require.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$DEBUG&lt;/code&gt;     The status of the -d switch.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$FILENAME&lt;/code&gt;  Current input file from $&lt;. Same as $&lt;.filename.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$LOAD_PATH&lt;/code&gt; The alias to the $:.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$stderr&lt;/code&gt;    The current standard error output.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$stdin&lt;/code&gt;     The current standard input.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$stdout&lt;/code&gt;    The current standard output.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$VERBOSE&lt;/code&gt;   The verbose flag, which is set by the -v switch.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$-0&lt;/code&gt;        The alias to $/.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$-a&lt;/code&gt;        True if option -a is set. Read-only variable.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$-d&lt;/code&gt;        The alias to $DEBUG.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$-F&lt;/code&gt;        The alias to $;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$-i&lt;/code&gt;        In in-place-edit mode, this variable holds the extension, otherwise nil.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$-I&lt;/code&gt;        The alias to $:.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$-l&lt;/code&gt;        True if option -l is set. Read-only variable.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$-p&lt;/code&gt;        True if option -p is set. Read-only variable.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$-v&lt;/code&gt;        The alias to $VERBOSE.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$-w&lt;/code&gt;        True if option -w is set.&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;</description><link>http://blog.pioz.it/post/2400759669</link><guid>http://blog.pioz.it/post/2400759669</guid><pubDate>Tue, 21 Dec 2010 11:22:07 +0100</pubDate><category>ruby</category><category>pre-defined variables</category></item><item><title>Use Ruby like PHP</title><description>&lt;p&gt;E se volessimo usare Ruby come PHP? Senza Rails o qualche strano framework?&lt;br/&gt;
Vediamo come fare con Apache…&lt;br/&gt;
Per prima cosa installiamo Apache2&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;apt-get install apache2
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Andiamo ad abilitare l’esecuzione dei CGI con i seguenti comandi:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;a2enmod cgid
a2enmod actions
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Modifichiamo il file &lt;code&gt;/etc/apache2/sites-available/default&lt;/code&gt; e aggiungiamo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;Directory /var/www/&gt;
  AddHandler rubypage .rhtml
  Action rubypage /erb.cgi
  AddHandler cgi-script .cgi
  Options Indexes FollowSymLinks MultiViews ExecCGI
  AllowOverride None
  Order allow,deny
  Allow from all
&lt;/Directory&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Bene, ora riavviamo apache con &lt;code&gt;/etc/init.d/apache2 restart&lt;/code&gt;.&lt;br/&gt;
Ora copiano il seguente codice nel file che creerete in &lt;code&gt;/var/www/erb.cgi&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/usr/bin/ruby

require 'time'
require 'erb'

time = Time.now.httpdate

HEADERS = &lt;&lt;EOF
Date: #{ time }
Server: #{ ENV['SERVER_SOFTWARE'] }
Last-Modified: #{ time }
Content-Type: text/html

EOF

begin

  path = nil
  if (ENV['PATH_TRANSLATED'])
    path = ENV['PATH_TRANSLATED']
  else
    file_path = ENV['REDIRECT_URL'].include?(File.basename(__FILE__)) ?     ENV['SCRIPT_URL'] : ENV['REDIRECT_URL']
    path = File.expand_path(ENV['DOCUMENT_ROOT'] + '/' + file_path)
    raise "Attempt to access invalid path: #{path}" unless     path.index(ENV['DOCUMENT_ROOT']) == 0
  end
  erb = File.open(path) { |f| ERB.new(f.read) }
  print HEADERS + erb.result(binding)

rescue Exception

  print "Content-Type: text/html\n\n"

  # error message
  print "&lt;h1&gt;Script Error&lt;/h1&gt;"
  print "&lt;pre&gt;#{ $! }&lt;/pre&gt;"

  # debug info
  print "&lt;h2&gt;Backtrace&lt;/h2&gt;"
  print "&lt;pre&gt;#{$!.backtrace.join("\n")}&lt;/pre&gt;"

  print "&lt;h2&gt;Environment&lt;/h2&gt;"
  print "&lt;pre&gt;#{ENV.keys.map { |key| key + ' = ' + ENV[key] + "\n"} }&lt;/pre&gt;"

  print "&lt;hr&gt;"
  print "&lt;i&gt;#{__FILE__} -- #{time}&lt;/i&gt;"

end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Bene! Ricordiamo i permessi &lt;code&gt;chmod 755 /var/www/erb.cgi&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Infine creiamo il nostro file in Ruby (&lt;code&gt;/var/www/test.rhtml&lt;/code&gt;):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;%= 'Hello World' %&gt;
&lt;strong&gt;YEAH&lt;/strong&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Visitiamo &lt;code&gt;http://localhost/test.rhtml&lt;/code&gt;&lt;/p&gt;</description><link>http://blog.pioz.it/post/1604465946</link><guid>http://blog.pioz.it/post/1604465946</guid><pubDate>Thu, 18 Nov 2010 01:32:00 +0100</pubDate><category>ruby</category><category>apache</category><category>erb</category><category>cgi</category></item><item><title>Run a rake task with Capistrano</title><description>&lt;p&gt;Beh aggiungiamo una ricetta al nostro deploy.rb&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;desc "Run a task on a remote server."  
task :invoke do
  if ENV['task']
    run("cd #{deploy_to}/current &amp;&amp; rake #{ENV['TASK']} RAILS_ENV=production")
  else
    puts 'usage: cap invoke TASK=task_name'
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A questo punto possiamo lanciare il rake task sul server remoto:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cap invoke TASK=asset:packager:build_all
&lt;/code&gt;&lt;/pre&gt;</description><link>http://blog.pioz.it/post/1366290610</link><guid>http://blog.pioz.it/post/1366290610</guid><pubDate>Thu, 21 Oct 2010 16:21:00 +0200</pubDate><category>rails</category><category>capistrano</category><category>task</category><category>rake</category></item><item><title>Shared repository with git</title><description>&lt;p&gt;Per creare una repository condivisa (read+write permissions) da piu` utenti appartenenti allo stesso gruppo createla col seguente comando:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git init --shared=true
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Per condividere una repository gia` esistente:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git repo-config core.sharedRepository true
&lt;/code&gt;&lt;/pre&gt;</description><link>http://blog.pioz.it/post/904516597</link><guid>http://blog.pioz.it/post/904516597</guid><pubDate>Wed, 04 Aug 2010 23:21:00 +0200</pubDate><category>git</category><category>shared repository</category></item><item><title>MacPorts memo</title><description>&lt;p&gt;Update MacPorts&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo port selfupdate
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;List all avaiable ports&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;port list
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Display installed ports&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;port installed
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Display outdated ports&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;port outdated
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Search ports&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;port search gtk
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Get info of a port&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;port info rb-gtk2
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Install a port&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo port install rb-gtk2
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Deletes all intermediate files that MacPorts creates while building a port&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo port clean --all rb-gtk2
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Upgrade a port&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo port upgrade rb-gtk2
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Uninstall a port&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo port uninstall rb-gtk2
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Upgrade all outdated ports&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo port upgrade outdated
&lt;/code&gt;&lt;/pre&gt;</description><link>http://blog.pioz.it/post/874569427</link><guid>http://blog.pioz.it/post/874569427</guid><pubDate>Thu, 29 Jul 2010 11:27:54 +0200</pubDate></item><item><title>Check PageRank of a website with Ruby</title><description>&lt;p&gt;Vediamo un’ottima gemma per Ruby per verificare il PageRank di Google di un sito web.
La gemma in questione si chiama &lt;a href="http://rubygems.org/gems/pageranker" target="_blank"&gt;&lt;strong&gt;pageranker&lt;/strong&gt;&lt;/a&gt; e la potere installare nel classico modo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo gem install pageranker
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Una volta installata potete usarla nei seguenti due modi:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ pageranker 'pioz.it'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;oppure da integrare nel vostro codice:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;irb(main):001:0&gt; require 'rubygems'
=&gt; true
irb(main):002:0&gt; require 'pageranker'
=&gt; true
irb(main):003:0&gt; Pageranker::check('google.it')
=&gt; 8
irb(main):004:0&gt; Pageranker::check('http://www.google.com')
=&gt; 10
irb(main):005:0&gt; Pageranker::check('dsadasdasdsadrfer.com')
=&gt; nil
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Molto semplice e utile. Per maggiori info visitate la homepage: &lt;a href="http://github.com/pioz/pageranker" target="_blank"&gt;http://github.com/pioz/pageranker&lt;/a&gt;&lt;/p&gt;</description><link>http://blog.pioz.it/post/842164067</link><guid>http://blog.pioz.it/post/842164067</guid><pubDate>Wed, 21 Jul 2010 23:43:16 +0200</pubDate><category>ruby</category><category>PageRank</category><category>Google</category><category>gems</category></item><item><title>Per usare i tasti HOME ed END nel modo classico (HOME va...</title><description>&lt;img src="http://30.media.tumblr.com/tumblr_l5wonmEVh11qapyh2o1_500.png"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Per usare i tasti HOME ed END nel modo classico (HOME va all’inizio della riga, END alla fine).&lt;/p&gt;</description><link>http://blog.pioz.it/post/840473047</link><guid>http://blog.pioz.it/post/840473047</guid><pubDate>Wed, 21 Jul 2010 13:45:00 +0200</pubDate><category>terminal osx</category><category>HOME key</category><category>END key</category></item><item><title>Recursive call: Ruby vs Python</title><description>&lt;p&gt;Facciamo un piccolo test: calcoliamo Fibonacci ricorsivamente in Ruby (v1.9.1) e in Python (v2.5.1) e vediamo chi vince&lt;/p&gt;

&lt;p&gt;Ruby Fibonacci code (&lt;code&gt;f.rb&lt;/code&gt;)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def fib(n)
  if n == 0 || n == 1
    n
  else
    fib(n-1) + fib(n-2)
  end
end

36.times { |i| fib(i) }
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Python Fibonacci code (&lt;code&gt;f.py&lt;/code&gt;)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def fib(n):
  if n == 0 or n == 1:
    return n
  else:
    return fib(n-1) + fib(n-2)

for i in range(36):
  fib(i)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ora lanciamo i due programmi nel seguente modo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;time ruby f.rb &amp;&amp; time python f.py
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;E vediamo l’output:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;real    0m9.956s
user    0m9.875s
sys     0m0.034s

real    0m24.471s
user    0m24.060s
sys     0m0.074s
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ecco Ruby impiega &lt;strong&gt;9.956&lt;/strong&gt; secondi mentre Python &lt;strong&gt;24.471&lt;/strong&gt; secondi!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ruby vince nettamente su Python!!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Oh beh provate pero` questo codice in C (&lt;code&gt;f.c&lt;/code&gt;):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;int
fib(int n)
{
  if(n == 0 || n == 1)
    return n;
  else
    return fib(n-1) + fib(n-2);
}

int
main()
{
  int i;
  for(i = 0; i &lt; 36; i++)
    fib(i);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Compiliamo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; gcc f.c
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ed eseguiamo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;time ./a.out
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;0.546 secondi!&lt;/p&gt;</description><link>http://blog.pioz.it/post/819829395</link><guid>http://blog.pioz.it/post/819829395</guid><pubDate>Fri, 16 Jul 2010 18:01:00 +0200</pubDate><category>Ruby</category><category>Python</category><category>Ruby vs Python</category></item><item><title>Ruby script to rename and reorder by date your photos</title><description>&lt;p&gt;Di seguito uno script che rinomina le foto con estensione jpg o JPG con numero crescente, esempio&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cimg0285 -&gt; 001.jpg
cimg0342 -&gt; 002.jpg
....
cimg1078 -&gt; 121.jpg
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Inoltre ordina le foto in base alla data di scatto della foto.&lt;br/&gt;
Come dipendenza installate la gemma &lt;code&gt;exifr&lt;/code&gt; per leggere i metadati di un file JPEG:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo gem install exifr
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Di seguito il codice:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/usr/bin/ruby
# Script by Pioz

require 'rubygems'
require 'exifr'
require 'optparse'

options = {}
optparse = OptionParser.new do |opts|
  opts.banner = "Usage: #{opts.program_name} [options] directory"
  options[:prefix] = ''
  opts.on( '-p', '--prefix PREFIX', 'Add PREFIX to filenames' ) { |prefix| options[:prefix] = prefix }
  options[:outdir] = nil
  opts.on( '-o', '--out-directory DIRECTORY', 'Copy images in DIRECTORY' ) { |outdir| options[:outdir] = outdir }
  opts.on_tail( '-h', '--help', 'Display this screen' ) do
    puts opts
    exit
  end
end
begin
  optparse.parse!
rescue OptionParser::InvalidOption
  puts optparse.help
  exit
end
if ARGV.size != 1
  puts optparse.help
  exit
end

dir = ARGV.first
outdir = options[:outdir] || dir
Dir.mkdir(outdir) unless File.exist?(outdir)

dates = {}
Dir["#{dir}/*.{jpg,JPG}"].each_with_index do |path, i|
  dates[path] = EXIFR::JPEG.new(path).date_time_original
end
dates.sort{|x,y| (x[1] || x[0]) &lt;=&gt; (y[1] || y[0])}.each_with_index do |pair,i|
  outname = "#{options[:prefix]}%0#{dates.size.to_s.size}d" % (i+1).to_s + '.jpg'
  if dir != outdir
    require 'ftools'
    File.copy(pair[0], "#{outdir}/#{outname}")
  else
    File.rename("#{dir}/#{outname}", "#{outdir}/tmp_#{outname}") if File.exist?("#{outdir}/#{outname}")
    if File.exist?(pair[0])
      File.rename(pair[0], "#{outdir}/#{outname}")
    else
      File.rename("#{dir}/tmp_#{File.basename(pair[0])}", "#{outdir}/#{outname}")
    end
  end
end
&lt;/code&gt;&lt;/pre&gt;</description><link>http://blog.pioz.it/post/759449383</link><guid>http://blog.pioz.it/post/759449383</guid><pubDate>Fri, 02 Jul 2010 02:16:11 +0200</pubDate><category>ruby</category><category>script</category><category>images</category><category>rename</category></item><item><title>Youtube flv 2 mp3</title><description>&lt;p&gt;Vediamo come convertire un video flv di Youtube in mp3 usando ffmpeg.&lt;/p&gt;

&lt;p&gt;Per prima cosa dobbiamo ottenere l’URL esatto del video per poter scaricare l’flv.
Per far cio` ci serve un token che cambia nel tempo ma che possiamo ottenere dal file &lt;code&gt;video_info&lt;/code&gt;; scarichiamolo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;a href="http://www.youtube.com/get_video_info?video_id=VugK063j0Zo" target="_blank"&gt;http://www.youtube.com/get_video_info?video_id=VugK063j0Zo&lt;/a&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Questo file contiene una serie di valori in stile parametri http. A noi serve quello con chiave &lt;strong&gt;token&lt;/strong&gt;: nell’esempio &lt;code&gt;token=vjVQa1PpcFNk6LFs5OQXj-teHu8POPhx7isbKGtGbOc%3D&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A questo punto abbiamo tutto il necessario per generare l’url per il download diretto del video flv:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;a href="http://www.youtube.com/get_video?video_id=VIDEOID&amp;t=TOKEN" target="_blank"&gt;http://www.youtube.com/get_video?video_id=VIDEOID&amp;t=TOKEN&lt;/a&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;nell’esempio:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;a href="http://www.youtube.com/get_video?video_id=VugK063j0Zo&amp;t=vjVQa1PpcFNk6LFs5OQXj-teHu8POPhx7isbKGtGbOc%3D" target="_blank"&gt;http://www.youtube.com/get_video?video_id=VugK063j0Zo&amp;t=vjVQa1PpcFNk6LFs5OQXj-teHu8POPhx7isbKGtGbOc%3D&lt;/a&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Bene, ora possiamo con ffmpeg ottenere direttamente l’audio del video in formato mp3 con il seguente comando:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ffmpeg -i 'URL DIRETTO DEL VIDEO' -acodec libmp3lame -ac 2 -ab 128kb -vn -y file_output.mp3
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Nell’esempio&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ffmpeg -i 'http://www.youtube.com/get_video?video_id=VugK063j0Zo&amp;t=vjVQa1PpcFMpsZHHpcVB1lB6w_EvoJYGbZTNi4KQ2g4%3D' -acodec libmp3lame -ac 2 -ab 128kb -vn -y magically_magical.mp3
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It’s magical…&lt;/p&gt;</description><link>http://blog.pioz.it/post/674456695</link><guid>http://blog.pioz.it/post/674456695</guid><pubDate>Tue, 08 Jun 2010 00:41:00 +0200</pubDate></item><item><title>Create apt repository</title><description>&lt;p&gt;Vediamo come creare una repository apt. 
Per far cio` usiamo l’utiliti &lt;strong&gt;reprepro&lt;/strong&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo apt-get install reprepro
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ora creiamo una directory di lavoro e il file di configurazione:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;mkdir -p repository/conf
nano repository/conf/distributions
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Il file distributions sara` una cosa del genere:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Origin: Company name
Label: Pioz's debian repository
Suite: stable
Codename: debian
SignWith: default
Architectures: i386 amd64 source
Components: main non-free contrib
Description: This repository include my programs
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Bene a questo punto generiamo la repo con il seguente comando da dentro la cartella &lt;code&gt;repository&lt;/code&gt; appena creata:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;reprepro includedeb debian pacchetto1.deb pacchetto2.deb ...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Se avete una chiave privata verra` usata per garantire la repository.
Bene adesso mettete online la cartella repository e siamo OK.&lt;/p&gt;

&lt;p&gt;Per seguiamo i seguenti passi:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;p&gt;Aggiungiamo la chiave pubblica ad apt&lt;/p&gt;

&lt;p&gt;echo key.pub | sudo apt-key add -&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Aggiungiamo il repo al file &lt;code&gt;/etc/apt/sources.list&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;deb &lt;a href="http://www.pioz.it/repository" target="_blank"&gt;http://www.pioz.it/repository&lt;/a&gt; debian main&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Aggiorniamo&lt;/p&gt;

&lt;p&gt;sudo apt-get update&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Installiamo qualche programma&lt;/p&gt;

&lt;p&gt;sudo apt-get install pacchetto1.deb&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;</description><link>http://blog.pioz.it/post/599320548</link><guid>http://blog.pioz.it/post/599320548</guid><pubDate>Sat, 15 May 2010 02:15:37 +0200</pubDate></item><item><title>GIMDB - GTK graphical interface for the Internet Movie DataBase</title><description>&lt;p&gt;&lt;em&gt;gimdb&lt;/em&gt; e` un programma che ti permette di esplorare l’&lt;a href="http://www.imdb.com" target="_blank"&gt;Internet Movie DataBase&lt;/a&gt; di Amazon. E` scritto in Ruby e usa la libreria grafica &lt;a href="http://www.gtk.org" target="_blank"&gt;GTK&lt;/a&gt;. &lt;em&gt;gimdb&lt;/em&gt; scarica le informazioni dei film che richiedi e le salva in un database &lt;a href="http://www.sqlite.org" target="_blank"&gt;sqlite3&lt;/a&gt; locale.&lt;/p&gt;

&lt;p&gt;Puoi creare utenti e salvare per ognuno di loro i film da vedere, i film visti e i film preferiti. &lt;em&gt;gimdb&lt;/em&gt; puo` anche lavorare in modalita` offline cercando i film solamente nel database locale.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://cloud.github.com/downloads/pioz/gimdb/screenshot-GIMDB.png" alt="GIMDB screenshot"/&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;gimdb&lt;/em&gt; potrebbe essere utile se non sai che film guardare e non trovi piu` la lista dei film da guardare che avevi stilato tanto tempo fa…&lt;/p&gt;

&lt;h3&gt;Dipendenze&lt;/h3&gt;

&lt;ul&gt;&lt;li&gt;ruby&lt;/li&gt;
&lt;li&gt;activerecord&lt;/li&gt;
&lt;li&gt;&lt;a href="http://github.com/jamis/sqlite3-ruby" target="_blank"&gt;sqlite3-ruby&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://github.com/tenderlove/nokogiri" target="_blank"&gt;nokogiri&lt;/a&gt;  &lt;/li&gt;
&lt;li&gt;libgnome2 (sudo apt-get install libgnome2-ruby)  &lt;/li&gt;
&lt;li&gt;libglade2 (sudo apt-get install libglade2-ruby)  &lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;Installazione&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;sudo apt-get install libgnome2-ruby
sudo apt-get install libglade2-ruby
sudo gem install gimdb
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ad ogni modo informazioni piu` dettagliate disponibili nella &lt;a href="http://github.com/pioz/gimdb" target="_blank"&gt;homepage&lt;/a&gt; del progetto: &lt;a href="http://github.com/pioz/gimdb" target="_blank"&gt;http://github.com/pioz/gimdb&lt;/a&gt;&lt;/p&gt;</description><link>http://blog.pioz.it/post/581602556</link><guid>http://blog.pioz.it/post/581602556</guid><pubDate>Sat, 08 May 2010 18:05:00 +0200</pubDate></item><item><title>Scrolling with trackpad with Thinkpad on Ubuntu 10.04 - 10.10</title><description>&lt;p&gt;Con questo trick riuscirete a scrillare le pagine usando il trackpad del vostro Thinkpad tenendo premuto il tasto centrale.
Create il nuovo file &lt;code&gt;/usr/lib/X11/xorg.conf.d/20-thinkpad.conf&lt;/code&gt; e incollateci il seguente:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Section "InputClass"
    Identifier "Trackpoint Wheel Emulation"
    MatchProduct "TrackPoint"
    MatchDevicePath "/dev/input/event*"
    Driver "evdev"
    Option "EmulateWheel" "true"
    Option "EmulateWheelButton" "2"
    Option "Emulate3Buttons" "false"
    Option "XAxisMapping" "6 7"
    Option "YAxisMapping" "4 5"
EndSection
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ora riavviate X.&lt;/p&gt;

&lt;p&gt;Se invece stai usando Ubuntu 10.10 sposta il file in &lt;code&gt;/usr/share/X11&lt;/code&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; sudo mv /usr/lib/X11/xorg.conf.d/20-thinkpad.conf /usr/share/X11/xorg.conf.d/20-thinkpad.conf
&lt;/code&gt;&lt;/pre&gt;</description><link>http://blog.pioz.it/post/576013226</link><guid>http://blog.pioz.it/post/576013226</guid><pubDate>Thu, 06 May 2010 14:00:00 +0200</pubDate></item><item><title>Set Gtk::Label wrap dinamically</title><description>&lt;p&gt;Ahime` come si sa` le Gtk::Label non supportano il wrapping dinamico su resize.&lt;br/&gt;
Vabbe`, estendiamo Gtk::Label e iimplementiamo il wrap dinamico.&lt;br/&gt;
Ecco la classe in Ruby:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require 'gtk2'
class WrapLabel &lt; Gtk::Label
    def initialize(s = '')
      super()
      self.wrap = true
      self.wrap_mode = Pango::WRAP_WORD_CHAR
      self.set_alignment(0.0, 0.0)
      self.text = s
      self.signal_connect_after('size-allocate') do |w, a|
        lw_old, lh_old = self.layout.size
        if lw_old / Pango::SCALE != a.width
          self.layout.set_width(a.width * Pango::SCALE)
          lw, lh = self.layout.size
          self.set_size_request(-1, lh / Pango::SCALE) if lh_old != lh
        end
      end
    end
  end
end
&lt;/code&gt;&lt;/pre&gt;</description><link>http://blog.pioz.it/post/473011060</link><guid>http://blog.pioz.it/post/473011060</guid><pubDate>Thu, 25 Mar 2010 20:25:00 +0100</pubDate></item><item><title>Balloon widget in GTK</title><description>&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_kzc9szgXQ61qa79c0.png" alt="GTK ballon widget"/&gt;&lt;/p&gt;

&lt;p&gt;Bello vero?? Magari un giorno spieghero` come creare un widget GTK personalizzato manipolando la renderizzazione con Cairo…&lt;/p&gt;</description><link>http://blog.pioz.it/post/450489256</link><guid>http://blog.pioz.it/post/450489256</guid><pubDate>Mon, 15 Mar 2010 20:52:06 +0100</pubDate></item><item><title>Switching ruby1.8 to ruby1.9 in MacOSX</title><description>&lt;p&gt;Allora se usate MacOSX e avete installato XCode avrete anche Ruby 1.8. Ora vediamo come installare anche Ruby 1.9 e switchare tra le due versioni.&lt;/p&gt;

&lt;p&gt;Per prima cosa usando &lt;a href="http://www.macports.org/" target="_blank"&gt;Macports&lt;/a&gt; installiamo Ruby 1.9&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo port install ruby19
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Adesso possiamo questo semplice script in bash per switchare tra le due versioni&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/usr/bin/env bash

rbv=$(ruby -v)
rv=${rbv:5:3}

function r18 () {
  ln -s /System/Library/Frameworks/Ruby.framework/Versions/Current/usr/bin/erb /usr/bin/erb
  ln -s /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/gem /usr/bin/gem
  ln -s /System/Library/Frameworks/Ruby.framework/Versions/Current/usr/bin/irb /usr/bin/irb
  ln -s /usr/bin/rake.1.8 /usr/bin/rake
  ln -s /System/Library/Frameworks/Ruby.framework/Versions/Current/usr/bin/rdoc /usr/bin/rdoc
  ln -s /System/Library/Frameworks/Ruby.framework/Versions/Current/usr/bin/ri /usr/bin/ri
  ln -s /System/Library/Frameworks/Ruby.framework/Versions/Current/usr/bin/ruby /usr/bin/ruby
  ln -s /System/Library/Frameworks/Ruby.framework/Versions/Current/usr/bin/testrb /usr/bin/testrb
}

function r19 () {
  ln -s /opt/local/bin/erb1.9 /usr/bin/erb
  ln -s /opt/local/bin/gem1.9 /usr/bin/gem
  ln -s /opt/local/bin/irb1.9 /usr/bin/irb
  ln -s /opt/local/bin/rake1.9 /usr/bin/rake
  ln -s /opt/local/bin/rdoc1.9 /usr/bin/rdoc
  ln -s /opt/local/bin/ri1.9 /usr/bin/ri
  ln -s /opt/local/bin/ruby1.9 /usr/bin/ruby
  ln -s /opt/local/bin/testrb1.9 /usr/bin/testrb
}

function cleanruby () {
  rm /usr/bin/erb
  rm /usr/bin/gem
  rm /usr/bin/irb
  rm /usr/bin/rake
  rm /usr/bin/rdoc
  rm /usr/bin/ri
  rm /usr/bin/ruby
  rm /usr/bin/testrb
}

if [ ${rv} = 1.8 ]; then
  echo "Current version is 1.8 swaping to 1.9"
  cleanruby
  r19
elif [ ${rv} = 1.9 ]; then
  echo "Current version is 1.9 swapping to 1.8"
  cleanruby
  r18
fi
exit
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ecco, ora per switchare tra le 2 versioni lanciamo quello script.&lt;br/&gt;
Ricordo che dovrete reinstallare tutte le gemme per Ruby 1.9.&lt;/p&gt;</description><link>http://blog.pioz.it/post/443483941</link><guid>http://blog.pioz.it/post/443483941</guid><pubDate>Fri, 12 Mar 2010 16:49:59 +0100</pubDate></item><item><title>GTK ruby application with Glade</title><description>&lt;p&gt;Vediamo oggi come creare un’applicazione GTK in ruby utilizzando la potenza di Glade, il disegnatore di interfacce.&lt;/p&gt;

&lt;p&gt;Per prima cosa installiamo glade e le librerie necessarie per il tutto:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo apt-get install glade
sudo apt-get install libgnome2-ruby
sudo apt-get install libglade2-ruby
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Bene ora apriamo Glade e disegnamo la nostra interfaccia.
&lt;img src="http://media.tumblr.com/tumblr_kz2ugpaF7X1qa79c0.png" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;Salviamola e generaimo il template con:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ruby-glade-create-template interface.glade &gt; interface.rb
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Bene vediamo che diavolo abbiamo creato, apriamo il file interface.rb&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/usr/bin/env ruby
#
# This file is gererated by ruby-glade-create-template 1.1.4.
#
require 'libglade2'

class ProvaGlade
  include GetText

  attr :glade

  def initialize(path_or_data, root = nil, domain = nil, localedir = nil, flag = GladeXML::FILE)
    bindtextdomain(domain, localedir, nil, "UTF-8")
    @glade = GladeXML.new(path_or_data, root, domain, localedir, flag) {|handler| method(handler)}

  end

end

# Main program
if __FILE__ == $0
  # Set values as your own application. 
  PROG_PATH = "interface.glade"
  PROG_NAME = "YOUR_APPLICATION_NAME"
  ProvaGlade.new(PROG_PATH, nil, PROG_NAME)
  Gtk.main
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Dobbiamo fare una piccola modifica per vedere la finestra: alla fine della funzione &lt;code&gt;initialize&lt;/code&gt; aggiungiamo &lt;code&gt;@glade.get_widget('window1').show_all&lt;/code&gt;. Ovvero otteniamo la finestra principale, di default glade la chiama &lt;em&gt;window1&lt;/em&gt; e invochiamo show_all.&lt;/p&gt;

&lt;p&gt;Lanciamo la miniapp con &lt;code&gt;ruby interface.rb&lt;/code&gt;&lt;/p&gt;</description><link>http://blog.pioz.it/post/439314227</link><guid>http://blog.pioz.it/post/439314227</guid><pubDate>Wed, 10 Mar 2010 18:51:20 +0100</pubDate></item></channel></rss>

