Archive

Posts Tagged ‘ruby’

ruby performances

When you’re digging into your code in order to increase the performances you probably have to know a couple of things about how the ruby interpreter works. I’ve completed a couple of tests with several interpreters to show you how a simple change can impact.
The ruby interpreters i’ve used in these tests are:

  • ruby 1.9.2p180 (2011-02-18 revision 30909) [x86_64-darwin10.6.0]
  • ruby 1.8.7 (2010-12-23 patchlevel 330) [i686-darwin10.7.0]
  • MacRuby 0.8 (ruby 1.9.2) [universal-darwin10.0, x86_64]
  • jruby 1.5.6 (ruby 1.8.7 patchlevel 249) (2010-12-03 9cf97c3) (Java HotSpot(TM) 64-Bit Server VM 1.6.0_24) [x86_64-java]

Every time you call a method the ruby interpreter uses a hash structure for the lookup, this is an expansive task, so you can avoid this lookup every time you need to access an instance variable doing it directly with @variable instead of the attr_accessor methods.

This is the test script:

This is the result of the test in seconds (you can see the raw data here)
Ruby method vs variable access time

Another interesting optimization you can probably do is to use the interpolation whatever is possible. Look at this example:

this is the result of the test (and raw data):
ruby interpolation vs concatenation

JSON e JSONP con ruby on rails

JSON e JSONP sono molto spesso utilizzati da rails per dialogare con terze parti, ad esempio per rispondere a chiamate ajax. In rails vi sono diversi metodi per utilizzare JSON.
L’approccio old-school compatibile con rails 2.3 è quello di utilizzare il metodo respond_to e passare un blocco nel quale specificare i vari formati:

Con rails3 è possibile utilizzare il metodo respond_with:

Di default in rails include_root_in_json è true, in alcuni casi è necessario settarlo a false:

Per utilizzare JSONP è sufficiente specificare il metodo di callback nella render:

regexp in ruby1.9

Tra le novità di ruby1.9 ci sono alcune migliorie sulle espressioni regolari, oltre ad un significativo miglioramento nelle prestazioni, sono state introdotte due nuove funzionalità: look-behind e named captures.

Look Behind

look-ahead e look-behind sono asserzioni che non catturano l’elemento, ma controllano che intorno, rispettivamente davanti e dietro, sia presente o assente. Mentre look-ahead era già presente in ruby 1.8 la look-behind è stata introdotta con la 1.9. Per la look-behind positiva si utilizza la formula (?<=regex), la look-behind negativa invece (?<!regex). Di seguito due esempi, positivo e negativo, di look behind:

Named Capturing Groups

Named capture è una funzionalità a mio avviso molto rubish ed elegante, permette semplicemente di dare un nome alla capture, il nome sarà poi ovviamente la key nel MatchData. Per utilizzare la Named Capture si usa la sintassi (?<name>group). Di seguito un’esempio:

Se necessario utilizzare ruby 1.8 c’è a disposizione la gem di Oniguruma .

testare le routes con rspec2

Chi si è già aggiornato a rspec2 avrà notato che il vecchio approccio al testing delle routes è deprecato, il vecchio codice non funziona più:

it "should map { :controller => 'comments', :action => 'index' } to /comments" do
  route_for(:controller => "comments", :action => "index").should == "/comments"
end
it "should generate params { :controller => 'comments', action => 'index' } from GET /comments" do
  params_from(:get, "/comments").should == {:controller => "comments", :action => "index"}
end

C’è stato ultimamente un’interessante dibattito su quale sia la migliore via per procedere a questo tipo di test, nell’attesa che nuovo zucchero venga aggiunto (es: l’uso del nuovo formato di indirizzamento delle routes tipo “controller#action“) il nuovo approccio (che fa un check bidirezionale) è il seguente:

it "routes GET /post/:post_id/comments to comments#index for post_id" do
  {:get => "/post/1/comments"}.should route_to(:controller => "comments", :action => "index", :post_id => "1")
end

che però senza questo commit non funziona. Per procedere quindi è necessario al momento aggiornarsi all’ultima release di rspec-rails, modificando il file Gemfile:

group :test do
   gem 'rspec-rails',  :git=> "git://github.com/rspec/rspec-rails.git"
end

Patterns in Ruby: composite

Come nell’approccio olistico il pattern composite non fa altro che scomporre un problema in più parti elementari. Un’esempio può essere il calcolo delle dimensioni di una citta,  che è composta da case e quartieri: Read more…

Patterns in Ruby: factory

Il factory pattern non descrive altro che un’oggetto che genera un’altro oggetto rispondendo alla domanda di quale classe? Esistono due varianti il factory method e l’factory abstract, l’esempio che segue è preso da wikipedia, ed è l’implementazione classica del factory method scritta in java:

Read more…

Exploring ruboto

Installazione di ruboto su debian/ubuntu in 6 semplici passi

  1. passo uno, installare la JDK java:
    sudo apt-get install sun-java6-jdk
  2. installare jruby con rvm (per installare rvm seguire questa guida):
    rvm install jruby
  3. installare l’SDK android (vedi qui), io l’ho installata in ~/android-sdk
  4. aggiungere la seguente linea in ~/.bashrc :
    export PATH=$PATH:~/android-sdk/tools
  5. generare un emulatore (vedi qui)
  6. installare ruboto:
    rvm jruby-1.5.0
    gem install ruboto-core

installare ruby1.9 e rails3 su debian/ubuntu

Installare Ruby on Rails 3 oggi è molto piu semplice grazie a due tool che aiutano a gestire le dipendenze: RVM per avere diverse istanze di ruby ognuna con un suo set di gemme e bundler che aiuta a gestire i set di gemme necessari per ogni istanza di ruby on rails.

Per installare RVM bisogna innanzitutto assicurarsi che siano installati alcuni pacchetti:

 sudo apt-get install subversion bison git-core curl zlib1g-dev libssl-dev

Successivamente lanciare il seguente comando:

 bash < <( curl http://rvm.beginrescueend.com/releases/rvm-install-head )

a questo punto inserire in ~/.bashrc la seguente linea:

  [[ -s $HOME/.rvm/scripts/rvm ]] && source $HOME/.rvm/scripts/rvm

e voilà, una volta riavviata la shell rvm è pronto per essere utilizzato, per installare ruby 1.9.2 (al momento l’ultima release stabile) basta lanciare il comando:

 rvm pkg install zlib
 rvm install ruby-1.9.2

Read more…

Patterns in Ruby: Observer

Capita spesso che al variare di un determinato valore tanti elementi distinti debbano aggiornarsi, ad esempio un grafico che si aggiorna al variare dei valori di una tabella, o le celle di un foglio di calcolo. In tutti questi casi torna utile l’Observer pattern. Nell’esempio che segue variando i valori delle valute verrà automaticamente aggiornato il grafico, ovviamente il numero degli observer non è limitato ad uno.

Read more…

Patterns in ruby: Singleton

Uno dei pattern piu controversi e discussi (es: leggi qui, qui e qui) è il singleton. Il singleton pattern viene utilizzato quando l’oggetto ha una sola ed unica istanza. Ad esempio alcuni software hanno un’unico file di configurazione o un solo accesso al database. L’implementazione del pattern in ruby è la seguente: Read more…