text 29 Jul MacPorts memo

Update MacPorts

sudo port selfupdate

List all avaiable ports

port list

Display installed ports

port installed

Display outdated ports

port outdated

Search ports

port search gtk

Get info of a port

port info rb-gtk2

Install a port

sudo port install rb-gtk2

Deletes all intermediate files that MacPorts creates while building a port

sudo port clean --all rb-gtk2

Upgrade a port

sudo port upgrade rb-gtk2

Uninstall a port

sudo port uninstall rb-gtk2

Upgrade all outdated ports

sudo port upgrade outdated

text 21 Jul Check PageRank of a website with Ruby

Vediamo un’ottima gemma per Ruby per verificare il PageRank di Google di un sito web. La gemma in questione si chiama pageranker e la potere installare nel classico modo:

sudo gem install pageranker

Una volta installata potete usarla nei seguenti due modi:

$ pageranker 'pioz.it'

oppure da integrare nel vostro codice:

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

Molto semplice e utile. Per maggiori info visitate la homepage: http://github.com/pioz/pageranker


photo 21 Jul Per usare i tasti HOME ed END nel modo classico (HOME va all’inizio della riga, END alla fine).

Per usare i tasti HOME ed END nel modo classico (HOME va all’inizio della riga, END alla fine).


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