Archive for the ‘ rails ’ Category

Alcune librerie interessanti in Ruby

Ultimamente ho trovato molto utili o interessanti queste librerie:

Ruby Graph Library
Implementa una struttura dati a grafo, sulla quale e’ possibile applicare tutti gli algoritmi piu’ comuni sui grafi. Ogni istanza nodo possiede i metodi per aggiungere archi e collegare altri nodi, per gestire vertici, e ciclare sul grafo (anche l’iteratore non e’ ottimizzato)

Skynet
Skynet implementa MapReduce di Google. MapReduce e’ un modello di programmazione e di elaborazione di dataset enormi. Ecco come Google vi da istantaneamente i risultati della vostra ricerca su un database che rappresenta gran parte di internet. Grazie a questa libreria e’ possibile eseguire processi paralleli su piu macchine. Non solo, estendendo ActiveRecord permette facilmente di utilizzare MapReduce nella vostra applicazione Rails.

RubyProf
RubyProf e’ un profilatore delle applicazioni scritte in Ruby, evidenzia i colli di bottiglia e permette di analizzare, attraverso i grafici prodotti, le prestazioni di un determinato segmento di codice.

Bye
Piero

Installazione gem mysql su MacOS X

Quando attivi Mongrel su una macchina MacOS X (Intel) puoi avere questo messaggio:

“WARNING: You’re using the Ruby-based MySQL library that ships with 
Rails. This library is not suited for production. Please install the 
C-based MySQL library instead (gem install mysql).”

L’installazione corretta della gemma mysql è la seguente:

sudo env ARCHFLAGS=”-arch i386″ gem install mysql — –with-mysql-config=/usr/local/mysql/bin/mysql_config -with-mysql-dir=/usr/local/mysql

acts_as_nested_set e order by

In una mia applicazione stò utilizzando un nested set salvato su una tabella grazie al plugin ‘better nested set’.

Non capisco perchè l’ordinamento dei nodi figli, che ho correttamente specificato dev’essere calcolato su un campo, non viene preso in considerazione.

Nel mio modello ho:

class NestedSurveyElement < ActiveRecord::Base

acts_as_nested_set :o rder => ‘orderby ASC’, :dependent => :delete_all, :scope => :survey_id

#……..

end

Per ovviare temporanemente al problema, riordino l’array restituito dal metodo children() di acts_as_nested_set in questo modo:

children = root_element.children.sort_by{|c| c.order_field}

Purtroppo in questo modo aggiungo tempo di calcolo non necessario (anche se un ordinamento nel mio caso è piuttosto trascurabile ) al mio processo… ma per ora funziona…

Ottenere la revisione SVN nella vostra applicazione Rails

Se volete stampare il numero di revisione della vostra applicazione Rails su una pagina potete fare come segue:

  1. Aprite il file config/environment.rb
  2. Aggiungete questa linea
    “MY_APP_REVISION = %x[(cd "#{RAILS_ROOT}" && svn info | grep Revision | cut -c 11-)].strip”
  3. Salvate e aprite la view dove volete visualizzare il numero di revisione
  4. aggiungete la linea “<%= MY_APP_REVISION %>”

Il comando funziona come segue:

  • %x[] è simile alla funzione system() di ruby e permette di eseguire un comando in una shell e catturarne l’output
  • tutti i comandi sono rinchiusi all’interno di due parentesi tonde in modo da aprire una nuova shell esclusivamente per questo comando
  • prima mi posiziono della directory principale di rails, se ho successo, lancio il comando ‘svn info’ che mi ritorna tutte le informazioni sul mio repository svn
  • redirigo l’output a grep che mi filtra le linee contenenti la parola ‘Revision’ (in questo caso una sola), otterrò così la stringa ‘Revision: 580′
  • redirigo di nuovo l’output (‘Revision: 580′) al comando cut che taglia una stringa. I parametri passati a cut sono ‘-c 11-’ ovvero taglia dal carattere 11 fino al termine della linea
  • L’output ottenuto da %x[] sarà una stringa terminata da ‘\n’, per eliminare il carattere di fine linea utilizzo il metodo standard della classe string strip().

Naturalmente questo tip funziona solo su sistemi unix-like

Ciao Piero

Sessioni vecchie e Rails 2.0

Se stupidamente, come me, avete utilizzato le sessioni nella vostra WebApp memorizzando molto più che lo stretto necessario avrete qualche problema con Rails 2.0 ricevendo errori di Cookie Overflow.

Infatti di default Rails 2.0 utilizza CookieStore per salvare le sessioni limitando così a 4Kb la dimensione massima della sessione. Per ‘tamponare’ questo problema potete tornare ad utilizzare il vecchio metodo di Rails 1.x: PStore.

Modificate il vostro file config/environment.rb e aggiungete questa linea:

config.action_controller.session_store = :p_store

e tutto tornerà a funzionare come prima.

10 Things Every Java Programmer Should Know About Ruby

Sul sito Ruby-doc sono riportate le slides di Jim Weirich alla Open Source Conference del 2005 riguardo a ruby.

Sono molto interessanti e utili, la lettura non porta via più di 10 minuti…

Il link è questo

Il blog di Weirich è questo

Compile Time? Runtime? Anytime!

Una delle prime domande che mi viene posta quando parlo di Ruby a qualcuno è ‘come viene compilato il codice?”

In parte rispondo con la pagina 400 del libro ‘Pragmatic Ruby Programming 2nd edition’ di Dave Thomas (che consiglio vivamente di acquistare)

“The important thing to remember about Ruby is that there isn’t a big difference between
‘compile time’ and ‘run time’. It’s all the same. You can add code to a running process.
You can redefine methods on the fly, change their scope from public to private, and
soon. You can even alter basic types, such as Class and Object.
Once you get used to this flexibility, it is hard to go back to a static language such as
C++ or even to a half-static language such as Java.
But then, why would you want to do that?”

Il grande vantaggio di Ruby è la possibilità di modificare e aggiungere metodi a runtime. Come è possibile questo?

Cominciamo col dire che, similmente a SmallTalk, per ruby ogni cosa è un oggetto con i suoi metodi, dal numero alla stringa, non come avviene in Java dove, ad esempio, abbiamo i tipi primitivi privi di metodi.

In un linguaggio OO standard gli oggetti vengono identificati dalla classe che ha istanziato l’oggetto stesso, as esempio un oggetto di tipo String in java sarà istanziato da una classe String. In ruby il tipo degli oggetti viene identificato in base ai metodi che possiedono. Ecco che grazie a questo abbiamo librerie come ActiveRecord (lo strato ORM di Rails) che senza scrivere quasi una riga di codice e senza scrivere metodi di accesso ai campi di una tabella ti permette di interrogare il database. Tutto viene fatto in automatico, a runtime.