Installazione di Ruby on Rails in Leopard

Con l’uscita di Leopard, Apple ufficializza il supporto a RoR, inserendolo direttamente nell’installazione base del proprio OS.
Per avere una installazione un po’ più completa, basta aggiungere MySQL, vediamo come rendere la nostra Leopard Box, una perfetta piattaforma per lo sviluppo in RoR.

N.B. Si suppone installato il pacchetto Xcode, installabile dal DVD di Leopard!

Verifica dell’installazione di Ruby e Rails

Per verificare se effettivamente ruby e rails sono installati, basta lanciare questo comando:

ruby -v; rails -v

Che nel mio caso restituisce:

ruby 1.8.6 (2007-06-07 patchlevel 36) [universal-darwin9.0]
Rails 1.2.3

… 1.2.3? … vecchiotto… la stabile è ora la 2.0.2… vabbè, rimediamo, intanto aggiorniamo il sistema gem e poi lanciamo un aggiornamento di tutte le gemme presenti già nel sistema, l’aggiornamento di rails però non installa la nuova gemma, tipica delle installazioni di rails v2, chiamata activeresources, installeremo anche quella:

sudo gem update --system
sudo gem update
sudo gem install activeresource

Hmmmm! Manca una gemma che può rendersi molto utile durante lo sviluppo di applicazioni: rmagick! Che però dipende da imagemagick, vediamo come installare entrambi.

Installazione di MacPorts

MacPorts è un grande repository di software Linux portati a Mac, è una risorsa molto potente, in quanto rende disponibile in maniera semplice (e piuttosto familiare per un utente Debian/Ubuntu, anche se concettualmente è più simile al sistema Gentoo) un vastissimo parco di programmi utili, come ad esempio nmap… quale amministratore di rete potrebbe farne a meno? ^_^
Bene, dopo il pistolotto iniziale, installiamo macports scaricando il dmg per Leopard e lanciando la solita installazione… (Ci mette un bel po’, non preoccupatevi, macports si sta compilando per il vostro sistema…).
Per rendere più semplice la navigazione e la scelta dei pacchetti, si può installare anche porticus, una specie di package manager… una GUI per l’accesso al repository di macports.
Ah! non dimenticate di dire a bash dove trovare l’eseguibile di port, pena il dover continuamente dare il percorso completo da riga di comando (I’m so lazy…), quindi aggiungete queste righe al file .bash_profile

export PATH=$PATH:/opt/local/bin
export MANPATH=$MANPATH:/opt/local/share/man
export INFOPATH=$INFOPATH:/opt/local/share/info

E chiudete (Command+q) e riaprite il terminale!

Installazione di Rmagick

Semplice… usate porticus o più velocemente copiate e incollate questi comandi nel terminale:

sudo port install tiff -macosx
sudo port install ImageMagick
sudo gem install rmagick

Anche qui, port non fa altro che rendere abbastanza trasparente la compilazione del pacchetto, preoccupandosi delle fasi preliminari di configurazione della sorgente, questo però implica che l’installazione sia un po’ lunga, in quanto deve compilare anche tutte le dipendenze mancanti nel sistema per quel determinato pacchetto.

Installazione di MySQL

Alla data di questo howto è finalmente disponibile un package DMG ufficiale per Leopard (Mac OS X 10.5), io ho scelto la versione per x86_64, d’altronde questo OS è a tutti gli effetti un OS a 64bit, no? Una volta finito il download, viene montato automaticamente il dmg, presentandoci due pkg (uno è il DB vero e proprio, l’altro è l’aggiunta alle applicazioni in startup automatico) e un prefPane, installiamoli tutti.
MySQL viene installato in /usr/local/mysql, la socket è in /tmp/mysql.sock e lo startup item in /usr/local/MySQLCOM.

L’avvio automatico è affidato a launchctl, perciò, basta creare un file chiamato /Library/LaunchDaemons/com.mysql.mysqld.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" 
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>KeepAlive</key>
	<true/>
	<key>Label</key>
	<string>com.mysql.mysqld</string>
	<key>Program</key>
	<string>/usr/local/mysql/bin/mysqld_safe</string>
	<key>RunAtLoad</key>
	<true/>
</dict>
</plist>

Proviamolo lanciando questo comando: sudo launchctl load /Library/LaunchDaemons/com.mysql.mysqld.plist

Ora dovrebbe funzionare, priviamo a riavviare per vedere se parte in automatico!

Sean O’Sullivan consiglia di creare, per comodità, un alias nel file delle risorse della shell, quindi aggiungete queste righe al file .bash_profile (e poi riavviate il terminale):

alias start_mysql="sudo /usr/local/MySQLCOM/MySQLCOM start"
alias stop_mysql="sudo /usr/local/MySQLCOM/MySQLCOM stop"
alias restart_mysql="sudo /usr/local/MySQLCOM/MySQLCOM/MySQLCOM restart"

Come noterete, lanciando il comando mysql, la shell non lo trova, va aggiunto al file delle risorse della shell, in modo che sappia dove trovarlo, questo si può fare con questo comando da, aggiungere al file .bash_profile (e poi riavviate il terminale):

alias mysql="/usr/local/mysql/bin/mysql"
alias mysqladmin="/usr/local/mysql/bin/mysqladmin"

Ed ora installiamo la gemma:

sudo su -
ARCHFLAGS='-arch x86_64' gem install mysql -- --with-mysql-config=/usr/local/mysql/bin/mysql_config
install_name_tool -change /usr/local/mysql/lib/mysql/libmysqlclient.15.dylib /usr/local/mysql/lib/libmysqlclient.15.dylib /Library/Ruby/Gems/1.8/gems/mysql-2.7/lib/mysql.bundle

Annotazione personale… Hmmmmm! A chi mi dice che GNU/Linux è difficile, farò leggere questo paragrafo… O__O Da utente sia MAC che Ubuntu, posso dirvi che nella mia derivata Debian preferita, bastava aprire il gestore di pacchetti, cercare mysql server e installarlo… 3 click… 3 diavolo di click… O_O

And… That’s all folks! ^_^

Database Access da Linux

Mi sta capitando, per fortuna o per sfortuna 😉 di dover mettere le mani dentro a database access, dalla mia linux box, per migrazioni dal sistema proprietario a Database aperti (e più performanti! ^_^).

La fortuna è che mi piace fare esperienza! ^_^

Comunque, in qualche ora di ricerca ho fatto fatica a capire come usare ODBC per accedere ai dati, la parte che non ho trovato facilmente è stato come aggiungere driver e datasources (avrò usato le parole sbagliate in google… oppure non c’è molta documentazione indexata dagli spider del motore di ricerca…).

La soluzione mi è arrivata incappando in un post di una mailing list.

Per prima cosa si devono installare questi pacchetti (come riferimento uso la mia ubuntu gutsy):

sudo apt-get install libmdbodbc

Un tool grafico per sfogliare i database mdb:

sudo apt-get install mdbtools

Successivamente si deve aggiungere al file /etc/odbcinst.ini il driver (inteso come libreria condivisa) inerente al driver per MS ACCESS, così da segnalare a odbc come maneggiare i file di tipo mdb:

[MDBToolsODBC]
Description = MDBToolsODBCdrivers
Driver = /usr/lib/libmdbodbc.so.0
Usage = 1
FileUsage = 1 

Ovviamente, occhio al fatto che nella vostra distribuzione lo shared object sia in /usr/lib, sennò cambiate la stringa dopo Driver = in modo che rispecchi la posizione del file nel vostro filesystem.

Ora, supponendo che il file .mdb sia in /home/mionome/Documents/Prova.mdb si deve aggiungere questa sorgente di dati al file /etc/odbc.ini:

[Prova]
Description = Prova Sample Database
Driver = /usr/lib/libmdbodbc.so.0
Database = /home/mionome/Documents/Prova.mdb 

Ora, come prova, si può provare il comando:

isql Prova

che vi metterà in connessione con il database Access specificato nel datasource.

A questo punto, visto che ne ho bisogno in un progetto ruby, devo installare anche i bindings odbc per questo linguaggio:

sudo apt-get install libdbd-odbc-ruby

Che ci permette, sotto irb, di provare il collegamento al database dall’ambiente ruby:

require "odbc"
ODBC.drivers
ODBC.datasources
connection = ODBC.connect "Prova"

Lanciando il comando irb mi trovo nell’ambiente interattivo di ruby, molto comodo per eseguire delle prove; come prima cosa è importante il require “odbc” che carica il modulo ODBC, per sapere se ruby vede i driver e i datasource di odbc (perchè mai non dovrebbe? ^_^) ho provato a richiamare i due metodi statici: drivers e datasources che restituiscono entrambi i rispettivi array (benissimo, vedo effettivamente quelli inseriti nei due file di configurazione), per ottenere l’oggetto database, su cui poi operare attraverso i metodi elencati nelle pagine di Ruby ODBC Reference, devo fare la connessione al datasource giusto (ODBC.connect “Prova” è l’omologo in ambiente ruby di isql Prova).

A questo punto si possono provare le query:

query = connection.prepare("SELECT * FROM PROVA_TABLE")
query.execute.each_hash() { |row| print row.inspect }
query.drop
connection.drop_all

Costruire dinamicamente il nome di un attributo ActiveRecord

I metodi che ActiveRecord associa al modello del database vengono creati in base al nome del campo nella tabella, ActiveRecord automaticamente crea un metodo di lettura della grandezza (coincide col nome del campo) e uno di scrittura (coincide col nome del campo seguito da un =), può succedere a volte di non sapere quale metodo si andrà a interrogare, grazie a send possiamo creare dinamicamente questi nomi di metodi, per esempio, potrei avere una tabella constructs con due campi cover1 e cover2 (questo opzionale), potrei a questo punto ciclare sul numero di cover e riempire in automatico i campi:

covers_array.each do |cover_sel|
created.send(("cover#{number_of_covers.to_s}=").to_sym, cover_sel)
number_of_covers += 1
end

Notare il segno di = alla fine del send e il valore da associarvi passato come secondo argomento di send.