text 16 Jul Recursive call: Ruby vs Python

Facciamo un piccolo test: calcoliamo Fibonacci ricorsivamente in Ruby (v1.9.1) e in Python (v2.5.1) e vediamo chi vince

Ruby Fibonacci code (f.rb)

def fib(n)
  if n == 0 || n == 1
    n
  else
    fib(n-1) + fib(n-2)
  end
end

36.times { |i| fib(i) }

Python Fibonacci code (f.py)

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)

Ora lanciamo i due programmi nel seguente modo:

time ruby f.rb && time python f.py

E vediamo l’output:

real    0m9.956s
user    0m9.875s
sys     0m0.034s

real    0m24.471s
user    0m24.060s
sys     0m0.074s

Ecco Ruby impiega 9.956 secondi mentre Python 24.471 secondi!

Ruby vince nettamente su Python!!

Oh beh provate pero` questo codice in C (f.c):

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 < 36; i++)
    fib(i);
}

Compiliamo:

 gcc f.c

Ed eseguiamo:

time ./a.out

0.546 secondi!


text 2 Jul Ruby script to rename and reorder by date your photos

Di seguito uno script che rinomina le foto con estensione jpg o JPG con numero crescente, esempio

cimg0285 -> 001.jpg
cimg0342 -> 002.jpg
....
cimg1078 -> 121.jpg

Inoltre ordina le foto in base alla data di scatto della foto.
Come dipendenza installate la gemma exifr per leggere i metadati di un file JPEG:

sudo gem install exifr

Di seguito il codice:

#!/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]) <=> (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

text 8 Jun Youtube flv 2 mp3

Vediamo come convertire un video flv di Youtube in mp3 usando ffmpeg.

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 video_info; scarichiamolo:

http://www.youtube.com/get_video_info?video_id=VugK063j0Zo

Questo file contiene una serie di valori in stile parametri http. A noi serve quello con chiave token: nell’esempio token=vjVQa1PpcFNk6LFs5OQXj-teHu8POPhx7isbKGtGbOc%3D.

A questo punto abbiamo tutto il necessario per generare l’url per il download diretto del video flv:

http://www.youtube.com/get_video?video_id=VIDEOID&t=TOKEN

nell’esempio:

http://www.youtube.com/get_video?video_id=VugK063j0Zo&t=vjVQa1PpcFNk6LFs5OQXj-teHu8POPhx7isbKGtGbOc%3D

Bene, ora possiamo con ffmpeg ottenere direttamente l’audio del video in formato mp3 con il seguente comando:

ffmpeg -i 'URL DIRETTO DEL VIDEO' -acodec libmp3lame -ac 2 -ab 128kb -vn -y file_output.mp3

Nell’esempio

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

It’s magical…


text 15 May Create apt repository

Vediamo come creare una repository apt. Per far cio` usiamo l’utiliti reprepro:

sudo apt-get install reprepro

ora creiamo una directory di lavoro e il file di configurazione:

mkdir -p repository/conf
nano repository/conf/distributions

Il file distributions sara` una cosa del genere:

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

Bene a questo punto generiamo la repo con il seguente comando da dentro la cartella repository appena creata:

reprepro includedeb debian pacchetto1.deb pacchetto2.deb ...

Se avete una chiave privata verra` usata per garantire la repository. Bene adesso mettete online la cartella repository e siamo OK.

Per seguiamo i seguenti passi:

  • Aggiungiamo la chiave pubblica ad apt

    echo key.pub | sudo apt-key add -

  • Aggiungiamo il repo al file /etc/apt/sources.list

    deb http://www.pioz.it/repository debian main

  • Aggiorniamo

    sudo apt-get update

  • Installiamo qualche programma

    sudo apt-get install pacchetto1.deb


text 8 May GIMDB - GTK graphical interface for the Internet Movie DataBase

gimdb e` un programma che ti permette di esplorare l’Internet Movie DataBase di Amazon. E` scritto in Ruby e usa la libreria grafica GTK. gimdb scarica le informazioni dei film che richiedi e le salva in un database sqlite3 locale.

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

GIMDB screenshot

gimdb 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…

Dipendenze

  • ruby
  • activerecord
  • sqlite3-ruby
  • nokogiri
  • libgnome2 (sudo apt-get install libgnome2-ruby)
  • libglade2 (sudo apt-get install libglade2-ruby)

Installazione

sudo apt-get install libgnome2-ruby
sudo apt-get install libglade2-ruby
sudo gem install gimdb

Ad ogni modo informazioni piu` dettagliate disponibili nella homepage del progetto: http://github.com/pioz/gimdb