<?xml version="1.0" encoding="UTF-8"?>
<rss 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>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</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;</description><link>http://blog.pioz.it/post/576013226</link><guid>http://blog.pioz.it/post/576013226</guid><pubDate>Thu, 06 May 2010 14:00:53 +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><item><title>Create Facebook application in Ruby on Rails</title><description>&lt;p&gt;Vediamo come creare una semplicissima app per facebook in Rails che stampa ‘Hello NOME_UTETE_FACEBOOK COGNOME_UTETE_FACEBOOK’&lt;/p&gt;

&lt;p&gt;Per prima cosa installiamo la gemma facebooker&lt;/p&gt;

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

&lt;p&gt;Poi creiamo un’app vuota&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;rails myfaceapp
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;e il plugin facebooker per rails&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;./script/plugin install git://github.com/mmangino/facebooker.git
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ok creiamo un controller, per esempio &lt;code&gt;ciccio&lt;/code&gt; con la vista index&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;script/generate controller ciccio index
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Modifichiamo subito il file &lt;code&gt;app/controllers/application_controller.rb&lt;/code&gt; aggiungendo&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ensure_application_is_installed_by_facebook_user
filter_parameter_logging :fb_sig_friends
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A questo punto andiamo a modificare l’azione &lt;code&gt;index&lt;/code&gt; nel controller &lt;code&gt;ciccio&lt;/code&gt; (file &lt;code&gt;app/controllers/ciccio_controller.rb&lt;/code&gt;)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def index
  @firstName = facebook_session.user.first_name
  @lastName = facebook_session.user.last_name
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Infine editiamo la vista dell’azione index &lt;code&gt;app/views/ciccio/index.html.erb&lt;/code&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Hello &lt;%= @firstName %&gt; &lt;%= @lastName %&gt;!
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Bene. Ora la nostra app e` quasi pronta…&lt;/p&gt;

&lt;p&gt;Ora dobbiamo configurarla er in facebook. Andiamo all’indirizzo &lt;a href="http://www.facebook.com/developers/apps.php" target="_blank"&gt;http://www.facebook.com/developers/apps.php&lt;/a&gt; e creiamo una nuova app (Imposta Nuova Applicazione). Inseriamo il nome dell’app e accettiamo la licenza. Andiamo poi sul tab ‘Modelli’ (Canvas) e inseriamo &lt;code&gt;Canvas page URL&lt;/code&gt; con &lt;em&gt;mytestapp&lt;/em&gt; e &lt;code&gt;Canvas Callback URL&lt;/code&gt; con &lt;code&gt;http://localhost:3000/ciccio/index/&lt;/code&gt;. Salviamo le modifiche.&lt;/p&gt;

&lt;p&gt;A questo punto l’ultimo passo: copiamo la Chiave API e la Secret Key (Applicazione Nascosta). Ora nella nosta app rails creiamo il file &lt;code&gt;app/config/facebooker.yml&lt;/code&gt; come segue:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;development:
  api_key: API_KEY_APPENA_COPIATA
  secret_key: SECRET_KEY_APPENA_COPIATA
  pretty_errors: true
  set_asset_host_to_callback_url: true
test:
  api_key: API_KEY_APPENA_COPIATA
  secret_key: SECRET_KEY_APPENA_COPIATA
  pretty_errors: true
  set_asset_host_to_callback_url: true
production:
  api_key: API_KEY_APPENA_COPIATA
  secret_key: SECRET_KEY_APPENA_COPIATA
  pretty_errors: true
  set_asset_host_to_callback_url: true
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Avviamo la nostra app con &lt;code&gt;./script/server&lt;/code&gt; e testiamola all’indirizzo &lt;code&gt;&lt;a href="http://apps.facebook.com/mytestapp/" target="_blank"&gt;http://apps.facebook.com/mytestapp/&lt;/a&gt;&lt;/code&gt;&lt;/p&gt;</description><link>http://blog.pioz.it/post/428499136</link><guid>http://blog.pioz.it/post/428499136</guid><pubDate>Fri, 05 Mar 2010 17:43:29 +0100</pubDate><category>Rails on Rails</category><category>Facebook</category></item><item><title>Streaming link Radio 105</title><description>&lt;p&gt;&lt;a href="http://shoutcast.unitedradio.it:1101" target="_blank"&gt;http://shoutcast.unitedradio.it:1101&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://shoutcast.unitedradio.it:1301" target="_blank"&gt;http://shoutcast.unitedradio.it:1301&lt;/a&gt; invece e` Radio Virgin.&lt;/p&gt;</description><link>http://blog.pioz.it/post/408737699</link><guid>http://blog.pioz.it/post/408737699</guid><pubDate>Wed, 24 Feb 2010 09:18:00 +0100</pubDate></item><item><title>Customize Globalize2 to return default locale when translation is missing</title><description>&lt;p&gt;&lt;a href="http://github.com/joshmh/globalize2" target="_blank"&gt;Globalize2&lt;/a&gt; (fantastico plugin per Ruby on Rails per globalizzare la nostra applicazione [tradurre il contenuti nel DB]) ritorna &lt;code&gt;nil&lt;/code&gt; se non trova una traduzione per un campo del DB.
Questo in molti casi e` un pacco e sarebbe bello che ritornasse il valore del locale di default.&lt;/p&gt;

&lt;p&gt;Per fare cio` andiamo ad modificare globalize2.&lt;br/&gt;
Prendiamo il file in &lt;code&gt;globalize2/lib/globalize/active_record/adapter.rb&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Andiamo alla funzione &lt;code&gt;def fetch_attribute(locale, attr_name)&lt;/code&gt; linea 53&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def fetch_attribute(locale, attr_name)
  translations = fetch_translations(locale)
  value, requested_locale = nil, locale
  Globalize.fallbacks(locale).each do |fallback|
    translation = translations.detect { |t| t.locale == fallback }
    value  = translation &amp;&amp; translation.send(attr_name)
    locale = fallback &amp;&amp; break if value
  end
  set_metadata(value, :locale =&gt; locale, :requested_locale =&gt; requested_locale)
  value
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Modifichiamo dopo &lt;code&gt;set_metadata&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def fetch_attribute(locale, attr_name)
  translations = fetch_translations(locale)
  value, requested_locale = nil, locale
  Globalize.fallbacks(locale).each do |fallback|
    translation = translations.detect { |t| t.locale == fallback }
    value  = translation &amp;&amp; translation.send(attr_name)
    locale = fallback &amp;&amp; break if value
  end
  set_metadata(value, :locale =&gt; locale, :requested_locale =&gt; requested_locale)
  value = fetch_attribute(I18n.default_locale, attr_name) if value.nil? &amp;&amp; locale != I18n.default_locale # ADDED BY PIOZ
  value
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;In questo modo se &lt;code&gt;value&lt;/code&gt; e` &lt;code&gt;nil&lt;/code&gt; ricalcolera` &lt;code&gt;value&lt;/code&gt; con il locale di default.&lt;/p&gt;</description><link>http://blog.pioz.it/post/367025080</link><guid>http://blog.pioz.it/post/367025080</guid><pubDate>Tue, 02 Feb 2010 16:09:00 +0100</pubDate></item><item><title>Send mail with attachment via ruby SMTP</title><description>&lt;p&gt;Vediamo come inviare una mail con allegato usando l’API di Ruby per SMTP.
Di seguito il codice:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def send_newsletter

  body = "Testo del messaggio"

  filecontent = File.read("allegato.pdf")
  encodedcontent = [filecontent].pack("m") # base64
  marker = "AUNIQUEMARKER"

  # Define the main headers.
  part1 =&lt;&lt;EOF
From: from@mail.com &lt;Pioz&gt;
To: &lt;to@mail.it&gt;
Subject: Oggetto del messaggio
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=#{marker}
--#{marker}
EOF

  # Define the message action
  part2 =&lt;&lt;EOF
Content-Type: text/html; charset="utf-8"
Content-Transfer-Encoding:8bit

#{body}
--#{marker}
EOF

  # Define the attachment section
  part3 =&lt;&lt;EOF
Content-Type: application/pdf; name="allegato.pdf"
Content-Transfer-Encoding:base64
Content-Disposition: attachment; filename="allegato.pdf"

#{encodedcontent}
--#{marker}--
EOF

  mailtext = part1 + part2 + part3

  Net::SMTP.start('mail.server.it', 25, 'mail.server.it', USERNAME, PASSWORD, :login) do |smtp|
    smtp.send_message mailtext, "from@mail.com", "to@mail.it"
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ecco.. in pratica inviamo una mail in multipart divisa in tre parti: una per dire che e` multipart, una per il body della mail (formato HTML nell’esempio) e l’ultima per l’allegato.&lt;/p&gt;</description><link>http://blog.pioz.it/post/341067836</link><guid>http://blog.pioz.it/post/341067836</guid><pubDate>Mon, 18 Jan 2010 17:28:58 +0100</pubDate><category>ruby</category><category>send mail</category><category>smtp</category><category>attachment</category></item><item><title>Inline RJS on controller</title><description>&lt;p&gt;Beh, renderizziamo un rjs direttamente dal controller… easy:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def index
  @polli = Polli.all
  render(:update) { |page| page.alert('Yeah') }
end
&lt;/code&gt;&lt;/pre&gt;</description><link>http://blog.pioz.it/post/318773373</link><guid>http://blog.pioz.it/post/318773373</guid><pubDate>Wed, 06 Jan 2010 00:43:51 +0100</pubDate></item><item><title>Multi domain mail server with Postfix, Dovecot and secure authentication</title><description>&lt;p&gt;Allora in questa guida vedremo come installare e configurare un mail server professionale.
Il tutto e` stato testato in una &lt;a href="http://www.debian.org" target="_blank"&gt;Debian&lt;/a&gt; 5.0 stable.&lt;/p&gt;

&lt;p&gt;Con questo server mail sara` possibile gestire piu` domini e quindi per esempio allo stesso tempo mantenere mail del tipo &lt;em&gt;@pioz.it&lt;/em&gt; e &lt;em&gt;@barison.org&lt;/em&gt;.
Il tutto avverra` dando la possibilita` all’utente se utilizzare comunicazioni criptate (come SSL o TLS) o in chiaro, se utilizzare autenticazione in chiaro (PLAIN) o criptata (CRAM-MD5 o DIGEST-MD5). Dando la possibilita` di usare protocollo IMAP o POP3.&lt;/p&gt;

&lt;p&gt;Il necessario:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Postfix&lt;/strong&gt; come server SMTP&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dovecot&lt;/strong&gt; come server POP3 e IMAP&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MySQL&lt;/strong&gt; come database per il salvataggio degli utenti, password e domini&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SASL&lt;/strong&gt; per criptare il trasferimento dei dati tra server e client&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Installiamo il necessario:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ apt-get install postfix postfix-mysql
$ apt-get install dovecot-imapd dovecot-pop3d
$ apt-get install mysql-server-5.0
$ apt-get install libsasl2 sasl2-bin libsasl2-modules
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Passo 0: domini&lt;/h3&gt;

&lt;p&gt;Per capirci meglio usiamo le seguenti convenzioni: il dominio associato al mail server sara` &lt;code&gt;ciccio.com&lt;/code&gt;, mentre i domini che hosteremo saranno &lt;code&gt;pippo.it&lt;/code&gt; e &lt;code&gt;pluto.com&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Questo significa che tutti e tre i domini dovranno avere un record MX nel dns chiamato mail.nomedominio che puntera` all’IP del nostro server mail.&lt;/p&gt;

&lt;p&gt;Inoltre dato che useremo anche SSL per il trasferimento dei dati tra server e client e` necessario avere un certificato (valido) per il dominio &lt;code&gt;mail.ciccio.com&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;PASSO 1: configurazione database&lt;/h2&gt;

&lt;p&gt;Per prima cosa creiamo un database per contenere gli utenti che potranno usufruire del nostro servizio mail.
Creiamo un file e lo chiamiamo &lt;code&gt;mail.sql&lt;/code&gt; e ci incolliamo dentro il seguente codice SQL:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;create database mail;

use mail;

CREATE TABLE user (
  domain varchar(255) NOT NULL,
  username varchar(255) NOT NULL,
  password varchar(255) NOT NULL,
  quota int(255) NOT NULL default 0,
  active tinyint(1) NOT NULL default 1,
  admin tinyint(1) NOT NULL default 0,
  PRIMARY KEY (username, domain)
);

CREATE TABLE alias (
  address varchar(255) NOT NULL,
  goto varchar(255) NOT NULL,
  active tinyint(1) NOT NULL default 1,
  PRIMARY KEY (address, goto)
);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A questo punto eseguiamo il codice SQL e creiamo un utente con privilegi ristretti che verra` usato da postfix e dovecot per connettersi al DB:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ mysql -u root -p
mysql&gt; source mail.sql;
mysql&gt; GRANT select,insert,update,delete ON mail.* TO 'postfix'@'localhost' IDENTIFIED BY 'password';
mysql&gt; quit;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ottimo, ora abbiamo il nostro BD… 2 tabelle: una per gli utenti e una per gli alias. Gli alias sono delle mail che sono alias di mail “reali”.&lt;/p&gt;

&lt;p&gt;Vediamo, prima di proseguire, i campi della tabella &lt;code&gt;user&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;domain&lt;/strong&gt;: il dominio dell’indirizzo mail (per esempio luca@pippo.it ha dominio pippo.it).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;username&lt;/strong&gt;: lo username per accedere alla casella di posta, nel nostro caso, &lt;strong&gt;IMPORTANTE&lt;/strong&gt;, e` l’intero indirizzo mail (quindi non luca, ma luca@pippo.it). Questo perche` avendo mail con domini diversi dobbiano distinguerle in modo univoco.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;password&lt;/strong&gt;: la password per accedere alla casella di posta. Vedremo che sara` criptata con AES.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;quota&lt;/strong&gt;: quota casella di posta.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;active&lt;/strong&gt;: l’account mail e` attivo o disattivo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;admin&lt;/strong&gt;: campo utile per verificare, magari da qualche app esterna, se l’utente puo` creare altri account.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I campi della tabella &lt;code&gt;alias&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;address&lt;/strong&gt;: indirizzo mail dell’alias.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;goto&lt;/strong&gt;: e` alias di.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;active&lt;/strong&gt;: l’alias e` attivo o disattivo.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;PASSO 2: creazione delle Maildir&lt;/h2&gt;

&lt;p&gt;Le nostre caselle di posta saranno sottoforma di maildir e le posizioniamo in &lt;code&gt;/etc/vmail/&lt;/code&gt;. Creiamole impostando i relativi permessi:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ adduser postfix mail
$ adduser dovecot mail
$ mkdir /var/vmail
$ chmod 770 /var/vmail
$ chown mail.mail /var/vmail
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Bene, in pratica la casella di posta per luca@pippo.it sara` in &lt;code&gt;/var/vmail/luca@pippo.it&lt;/code&gt;. Essa verra` creata in automatico al primo login.&lt;/p&gt;

&lt;h2&gt;PASSO 3: configurazione Dovecot&lt;/h2&gt;

&lt;p&gt;Adesso e` arrivato il momento di configurare &lt;a href="http://www.dovecot.org/" target="_blank"&gt;Dovecot&lt;/a&gt;: il server pop e imap.&lt;/p&gt;

&lt;p&gt;Dovecot, per i nostri usi consiste in due file di configurazione:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/etc/dovecot/dovecot.conf&lt;/code&gt;: file di configurazione principale.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/etc/dovecot/dovecot-sql.conf&lt;/code&gt;: file di configurazione per la connessione e recupero dati dal database MySQL.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vediamo il primo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;## Dovecot configuration file

protocols = pop3 pop3s imap imaps
disable_plaintext_auth = no
log_path = /var/log/mail.log
log_timestamp = "%Y-%m-%d %H:%M:%S "

ssl_disable = no
ssl_cert_file = /etc/ssl/mycerts/mail.ciccio.com/cert.crt
ssl_key_file = /etc/ssl/mycerts/mail.ciccio.com/key.key
ssl_ca_file = /etc/ssl/mycerts/mail.ciccio.com/root.crt

mail_location = maildir:/var/vmail/%u/
mail_privileged_group = mail
#first_valid_uid = 150
first_valid_uid = 8

protocol imap {
  mail_plugins = autocreate
  plugin {
    autocreate  = Trash
    autocreate2 = Junk
    autocreate3 = Drafts
    autocreate4 = Sent
    autocreate5 = INBOX

    autosubscribe  = Trash
    autosubscribe2 = Junk
    autosubscribe3 = Drafts
    autosubscribe4 = Sent
    autosubscribe5 = INBOX
  }
}

protocol pop3 {
  pop3_uidl_format = %08Xu%08Xv
}

protocol lda {
  # log_path = /etc/dovecot/sieve.log
  mail_plugins = cmusieve
  postmaster_address = enrico@megiston.it
}

plugin {
  sieve = /etc/dovecot/sieve/default.sieve
}

auth_verbose = no
auth_debug = no
auth_debug_passwords = no
auth default {
  mechanisms = login plain digest-md5 cram-md5
  passdb sql {
    args = /etc/dovecot/dovecot-sql.conf
  }
  userdb sql {
    args = /etc/dovecot/dovecot-sql.conf
  }
  user = root
  socket listen {
    master {
      path = /var/run/dovecot/auth-master
      mode = 0660
      user = dovecot
      group = mail
    }
    client {
      path = /var/spool/postfix/private/auth
      mode = 0660
      user = postfix
      group = mail
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Adesso non entriamo nel dettaglio in quanto non ho voglia di star qua a scrivere, comunque due cosette sulle cose principali:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;La prima riga specifica i protocolli che vogliamo usare. Gli abilitiamo tutti per dare liberta` totale ai nostri utenti. Mi raccomando di avere il certificato per il vostro dominio, nell’esempio per &lt;code&gt;mail.ciccio.com&lt;/code&gt;.  &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;first_valid_uid&lt;/code&gt; deve coincidere con uid dell’utente &lt;code&gt;mail&lt;/code&gt;, solitamente 8. Per verificare lanciate il comando “&lt;code&gt;id mail&lt;/code&gt;”.  &lt;/li&gt;
&lt;li&gt;Importante e` la riga “&lt;code&gt;mechanisms = login plain digest-md5 cram-md5&lt;/code&gt;” che specifica i meccanismi di autenticazione. Noi li abilitiamo tutti, sia quelli in chiaro che criptati in modo da permettere anche a client poco sofisticati (ad esempio quelli dei cellulari) di connettersi al nostro server. Mentre per client completi dare la possibilita` di usare autenticazione cifrata (ad esempio Mozilla Thunderbird).  &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;userdb&lt;/code&gt; e &lt;code&gt;passdb&lt;/code&gt; vengono recuperati dall’altro file di configurazione.  &lt;/li&gt;
&lt;li&gt;Infine fondamentale la sezione &lt;code&gt;socket listen&lt;/code&gt; che apre una socket per permettere ad altri programmi di usare il sistema di autenticazione di Dovecot, nel nostro caso Postfix.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L’altro file di configurazione per il recuper degli utenti e delle password risulta essere una cosa del genere:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;driver = mysql
connect = host=127.0.0.1 dbname=mail user=postfix password=password
default_pass_scheme = PLAIN
user_query = SELECT concat('maildir:/var/vmail/', username, '/') as mail, 8 AS uid, 8 AS gid FROM user WHERE username = '%u' AND domain = '%d' AND active = '1'
password_query = SELECT username AS user, AES_DECRYPT(UNHEX(password),'AESKEY') AS password FROM user WHERE username = '%u' AND domain = '%d' AND active = 1
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Commentiamo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;driver&lt;/code&gt; specifica che il database e` MySQL.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;connect&lt;/code&gt; info per la connessione al database.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;default_pass_scheme&lt;/code&gt; usiamo PLAIN, infatti se diamo la possibilita` di usare meccanismi di autenticazione in chiaro e non in chiaro (es plain e cram-md5) non c’e` alternativa, non possiamo salvare la password in modo criptato per meccanismo PLAIN. Comunque niente paura, la password non sara` salvata in chiaro ma criptata con la funzione AES di mysql e trasformata da binario a text con la funzione HEX.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;user_query&lt;/code&gt; e` la query per recuperare l’utente. Da notare che uid e gid devono essere lo stesso dell’utente &lt;code&gt;mail&lt;/code&gt; (&lt;code&gt;id mail&lt;/code&gt;). Questa in realta` deve recuperare il path della maildir dell’utente, per questo c’e` il &lt;code&gt;concat&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;user_password&lt;/code&gt; e` la query per recuperare le password decriptandole usando una chiave (nell’esempio AESKEY).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bene ora Dovecot e` pronto. Riavviamo Dovecot con &lt;code&gt;/etc/init.d/dovecot restart&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;PASSO 4: configurazione Postfix&lt;/h2&gt;

&lt;p&gt;Postfix e` il server SMTP. Viene gestito da due file di configurazione principali, piu` altri per la connessione con il database:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;/etc/postfix/master.cf&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/postfix/main.cf&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/postfix/mysql_virtual_alias_maps.cf&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/postfix/mysql_virtual_domains_maps.cf&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/postfix/mysql_virtual_mailbox_maps.cf&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Il master (1):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#
# Postfix master process configuration file.  For details on the format
# of the file, see the master(5) manual page (command: "man 5 master").
#
# Do not forget to execute "postfix reload" after editing this file.
#
# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================
smtp      inet  n       -       n       -       -       smtpd
#submission inet n       -       -       -       -       smtpd
#  -o smtpd_tls_security_level=encrypt
#  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING
# Decommentiamo il seguito per abilitare il wrapper SSL su TLS
smtps     inet  n       -       -       -       -       smtpd
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING
#628      inet  n       -       -       -       -       qmqpd
pickup    fifo  n       -       -       60      1       pickup
cleanup   unix  n       -       -       -       0       cleanup
qmgr      fifo  n       -       n       300     1       qmgr
#qmgr     fifo  n       -       -       300     1       oqmgr
tlsmgr    unix  -       -       -       1000?   1       tlsmgr
rewrite   unix  -       -       -       -       -       trivial-rewrite
bounce    unix  -       -       -       -       0       bounce
defer     unix  -       -       -       -       0       bounce
trace     unix  -       -       -       -       0       bounce
verify    unix  -       -       -       -       1       verify
flush     unix  n       -       -       1000?   0       flush
proxymap  unix  -       -       n       -       -       proxymap
proxywrite unix -       -       n       -       1       proxymap
smtp      unix  -       -       -       -       -       smtp
# When relaying mail as backup MX, disable fallback_relay to avoid MX loops
relay     unix  -       -       -       -       -       smtp
        -o smtp_fallback_relay=
#       -o smtp_helo_timeout=5 -o smtp_connect_timeout=5
showq     unix  n       -       -       -       -       showq
error     unix  -       -       -       -       -       error
retry     unix  -       -       -       -       -       error
discard   unix  -       -       -       -       -       discard
local     unix  -       n       n       -       -       local
virtual   unix  -       n       n       -       -       virtual
lmtp      unix  -       -       -       -       -       lmtp
anvil     unix  -       -       -       -       1       anvil
scache    unix  -       -       -       -       1       scache
#
# ====================================================================
# Interfaces to non-Postfix software. Be sure to examine the manual
# pages of the non-Postfix software to find out what options it wants.
#
# Many of the following services use the Postfix pipe(8) delivery
# agent.  See the pipe(8) man page for information about ${recipient}
# and other message envelope options.
# ====================================================================
#
# maildrop. See the Postfix MAILDROP_README file for details.
# Also specify in main.cf: maildrop_destination_recipient_limit=1
#
maildrop  unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail argv=/usr/bin/maildrop -d ${recipient}
#
# See the Postfix UUCP_README file for configuration details.
#
uucp      unix  -       n       n       -       -       pipe
  flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
#
# Other external delivery methods.
#
ifmail    unix  -       n       n       -       -       pipe
  flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
bsmtp     unix  -       n       n       -       -       pipe
  flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipient
scalemail-backend unix  -       n       n       -       2       pipe
  flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension}
mailman   unix  -       n       n       -       -       pipe
  flags=FR user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py
  ${nexthop} ${user}
dovecot   unix  -       n       n       -       -       pipe
  flags=DRhu user=mail argv=/usr/lib/dovecot/deliver -n -f ${sender} -d ${recipient}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Non commentiamo, e` molto simile a quello di default a parte un paio di modifiche, tra cui l’abilitazione del wrapper SSL su TLS.&lt;/p&gt;

&lt;p&gt;Il main.cf (2):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# MAIN POSTFIX CONFIGUTARION #

# smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
# biff = no
# append_dot_mydomain = yes
debug_peer_level = 3
myhostname = mail.ciccio.com

virtual_uid_maps = static:8
virtual_gid_maps = static:8
virtual_minimum_uid = 8
virtual_mailbox_base = /var/vmail/
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_transport = virtual

# SASL #

smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous
smtpd_sasl_auth_header = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions =
  permit_sasl_authenticated,
  reject_unauth_destination

# TLS #

smtp_use_tls = yes
smtpd_use_tls = yes
smtpd_tls_key_file = /etc/ssl/mycerts/mail.ciccio.com/key.key
smtpd_tls_cert_file = /etc/ssl/mycerts/mail.ciccio.com/cert.crt
smtpd_tls_CAfile = /etc/ssl/mycerts/mail.ciccio.com/root.crt
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Anche qua non commentiamo… da notare solo che SASL per autenticare usa la socket che gli viene messa a disposizione da Dovecot.&lt;/p&gt;

&lt;p&gt;E gli altri tre in ordine per la connessione al BD:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# /etc/postfix/mysql_virtual_alias_maps.cf
user = postfix
password = password
hosts = 127.0.0.1
dbname = mail
table = alias
select_field = goto
where_field = address

# /etc/postfix/mysql_virtual_domains_maps.cf
user = postfix
password = password
hosts = 127.0.0.1
dbname = mail
table = user
select_field = domain
where_field = domain

# /etc/postfix/mysql_virtual_mailbox_maps.cf
user = postfix
password = password
hosts = 127.0.0.1
dbname = mail
query = SELECT concat(username,'/') FROM user WHERE username = '%s' AND active = 1
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ok, per Postfix abbiamo finito. Riavviamolo con &lt;code&gt;/etc/init.d/postfix/restart&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;PASSO 5: proviamo il tutto&lt;/h2&gt;

&lt;p&gt;Inseriamo gli utenti nel nosto DB e poi testiamo il tutto usando Thunderbird.
Per aggiungere un utente usiamo la seguente query:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ mysql -u postfix -p
$ insert into user(domain,username,password) values("pippo.it", "luca@pippo.it", HEX(AES_ENCRIPT('passwordchevoglio', 'AESKEY')));
$ insert into user(domain,username,password) values("pluto.com", "nicola@pluto.com", HEX(AES_ENCRIPT('passworddd', 'AESKEY')));
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Vediamo per esempio come configurare Thunderbird:
&lt;img src="http://media.tumblr.com/tumblr_kuhdz2ptTT1qa79c0.png" alt=""/&gt;&lt;/p&gt;

&lt;h3&gt;Alcune note&lt;/h3&gt;

&lt;p&gt;Ricordate di installare Spamassasin per Postfix e magari una bella webmail come &lt;a href="http://roundcube.net/" target="_blank"&gt;Roundcube&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Se avete dubbi, chiarimenti, o volete approfondire alcune sezioni non fatevi scrupoli a contattarmi al mio indirizzo mail &lt;a href="mailto:pioz@pioz.it" target="_blank"&gt;pioz@pioz.it&lt;/a&gt;.&lt;/p&gt;</description><link>http://blog.pioz.it/post/278756139</link><guid>http://blog.pioz.it/post/278756139</guid><pubDate>Fri, 11 Dec 2009 10:22:00 +0100</pubDate><category>mailserver</category><category>server</category><category>mail</category><category>postfix</category><category>dovecot</category><category>sasl</category><category>mysql</category><category>cram-md5</category><category>linux</category><category>debian</category></item><item><title>TwinView with nvidia Xorg</title><description>&lt;p&gt;Vediamo come collegare la TV al nostro PC, piu` precisamente alla nostra scheda video nvidia.
Ovviamente la TV deve essere collegata col cavo SVIDEO e i driver nvidia installati e funzionanti.
Configureremo la TV in modalita` clone.
Apriamo col nostro editor preferito il file di configurazione:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ nano /etc/X11/xorg.org
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Alla fine della sezione &lt;code&gt;screen&lt;/code&gt; aggiungiamo le seguenti righe&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Option "TwinView" "1"
Option "metamodes" "1280x1024,1024x768@1280x1024"
Option "TwinViewOrientation" "Clone"
Option "TVStandard" "PAL-B"
Option "TVOutFormat" "SVIDEO"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A questo punto riavviamo il server X e il gioco e` fatto&lt;/p&gt;</description><link>http://blog.pioz.it/post/255917211</link><guid>http://blog.pioz.it/post/255917211</guid><pubDate>Tue, 24 Nov 2009 20:25:00 +0100</pubDate><category>xorg</category><category>nvidia</category><category>twinview</category><category>linux</category></item></channel></rss>
