Gli haiku sono una forma di poesia Giapponese molto affascinante. L’intera poesia e’ caratterizzata da una lunghezza di 17 sillabe, nelle quali viene raccolto tutto il sentimento dell’autore.
Ruby, a sua volta e’ un linguaggio molto affascinante, e permette di esprimere in poche righe di codice dei concetti anche molto complessi.
Questa pagina raccoglie alcuni spezzoni (forse spezzini?) che mostrano la potenza di ruby in un massimo di 17 righe.
Effettivamente in diciassette righe di ruby si puo’ fare quasi tutto, quindi stabiliremo un limite di 9 righe in modo da poter dire “io lo faccio in meno di dieci righe!” _
- creare una copia ordinata di un file:
open('output.txt','w').puts(open('input.txt').sort)
- quicksort da 6 righe:
def qsort(list) return [] if list.size == 0 x, *xs = list less, more = xs.partition{|y| y < x} qsort(less) + [x] + qsort(more) end
e da cinque righe:def qs(l) return [] if (x,*xs=l).empty? less, more = xs.partition{|y| y < x} qs(less) + [x] + qs(more) end
(è possibile farlo arrivare a tre righe, ma diventa stupido, usando due iterazioni ogni volta.)
- pseudo portscanner
Uso:
ruby nomefile.rb hostname startport endportrequire 'socket' addr,sport,eport=ARGV[0],ARGV[1].to_i,ARGV[2].to_i puts "porte aperte:" sport.upto(eport) {|x| puts x if (TCPSocket.new (addr,x) rescue false) }
- echoserver multithread
require 'socket' server = TCPServer.open(1234) while true Thread.start(server.accept) do |s| s.puts(s.gets) end end
- webserver
WEBrick permette di creare facilmente server HTTP/HTTPS,SOAP..
E’ un modulo standard in ruby1.8, libreria esterna nell’1.6
require 'webrick' include WEBrick s = HTTPServer.new( :Port => 2000, :DocumentRoot => "/" ) s.mount("/nomedir", HTTPServlet::FileHandler, 'lamia_dir',true) s.start
- controllo cambi
Un semplice strumento per recuperare il cambio euro-dollaro da yahoo:
require 'net/http' input = Net::HTTP.get "it.finance.yahoo.com", "/d/quotes.csv?s=EURUSD=X&f=sl1d1t1c1ohgv" a,b,c,d,e=input.split(/;/) puts "EUR/USD: #{b} (#{e}, #{d})"
- rgrep
Un rimpiazzo minimale per il comando ‘grep’
regex = /#{ARGV.shift}/ ARGF.each { |line| puts line if regex.match(line) }
- md5sum
Uno script equivalente al comando md5sum, che genera la stringa esadecimale corrispondente
all’hash del file datoruby -r md5 -e "puts MD5.new(File.open('filename').read).hexdigest"
- cdplayer
Questo e’ un micro player per cd audio:
Per usarlo avviate irb e caricate lo script.
Per suonare il brano
Xbasta scrivereplay X(ad.es.play 5) e per bloccarlostoprequire 'sdl' SDL.init( SDL::INIT_CDROM ) (Cd=SDL::CD.open(0)).status def play(trk) Cd.playTracks(trk,0,0,0) end def stop Cd.stop end
lo script richiede la libreria Ruby/SDL
- webserver
Poiche’ ruby ha nella libreria standard uno splendido modulo chiamato
WEBrickche permette di costruire applicazioni web partendo dal webserver, e’ ovvio che esiste un semplice oneliner per creare un server che mostri il contenuto della directory corrente:ruby -rwebrick -e 'WEBrick::HTTPServer.new(:DocumentRoot=>".").start'
La porta sara’ la 80 di default.
- encoder/decoder rot13:
puts ARGV[0].tr('[a-zA-Z]', '[n-za-mN-ZA-M]') if ARGV[0] or raise "No string passed"