December 21, 2005

Rails rolling on X


This will probably be the last Mac-related entry for a while, as I'm switching to Windows at the moment (maybe I'm going back to Apple, when all the Intel-issues are settled).
I want to describe the process of installing Ruby on Mac OS X, because I found surprisingly few materials on the topic.
Read more...

Ruby läuft auf X
Das hier ist der vorläufig letzte Eintrag von meinem und über meinen Mac. Ich steige gerade auf Windows um (vielleicht kehre ich zu Apple zurück, wenn sich alle Intel-Angelegenheiten eingerenkt haben).
Ich möchte ein wenig über Ruby auf dem MAc schreiben. Ich habe erstaunlich wenig Material über die Installation unter OS X im Internet gefunden.
Mehr davon...


I delved a little bit deeper into ruby lately and found it quite elegant--I was marvelling at the lean syntax. Especially when it comes to the equivalent of--let's say--for...in-loops, or the security concept of user input. I'm sure you heard about the developer's framework Ruby on Rails--now this really lives up to the hype.
Being developed by the lead programmer of 37signals, this enabled him to write an application like Basecamp in mere 2 months single-handedly (seeing is believing: check out this video).
Even though Ruby is getting some support lately in Germany--alas, most service providers will not offer Ruby at the given time. I have some webspace at Host Europe, who are supporting Ruby--but only a very old version 1.6.2, blank without embedded Ruby or anything (I guess they will only upgrade when updating their Linux-servers).

You will need the following stuff for an installation: OS X 10.3.x and Xcode Tools for compiling (should be on your Mac Software CD), Ruby source and Rubygems (a handy tool to manage third party Ruby-plugins). There are precompiled Ruby-binaries, but they didn't work on my machine, dunno...
Windows-users should check out Instant Rails, a drag-and-drop Ruby-Rails-Apache-MySQL solution, all preconfigured and ready to run.
You may want to consider downloading the MySQL/Ruby API Module, which allows Ruby scripts to talk with a MySQL Database.

Compiling
Open the Terminal and hop into the folder where the Ruby source resides (by typing cd and the path). I'd propose you choose the folder /usr/local to compile into. This leaves your original Apple-installed Ruby untouched. Type in the following command:
./configure --prefix=/usr/local
make
sudo make install
That was it already. You can check over by typing the following:
/usr/local/bin/ruby -v
And you should see something like this:
ruby 1.8.2 (2004-12-25) [powerpc-darwin7.8.0]
Now we just need to set our shell’s path environment variable so that it will call the new version of Ruby first, rather than the Apple-distributed version. Use a text editor to create or edit a hidden file in our home folder named .bash_login (note the preceding “.”). Enter the following two lines into the file:
PATH="/usr/local/bin:/usr/local/sbin:~/bin:$PATH"
export PATH
Now close our existing Terminal window and open a new one in order to “refresh” the newly set path. In the new window, type the following line:
ruby -v
If you see something else than in the first run – namely an older version (say 1.6.8), we haven’t set our path correctly. This is important for the next steps, so make sure it’s right.

Rubygems
Type in the following lines into the Terminal to install Rubygems:
tar xzvf rubygems-0.8.8.tgz
cd rubygems-0.8.8
sudo ruby setup.rb
Now you should get a message reporting that you have successfully built Rubygem. Type gem -v at the prompt to check over.

Rails
Thanks to Gems, installing Rails is even easier:
sudo gem install rails
Answer yes by typing “Y” when prompted to all of the dependencies it asks about.
That it already, we have a working Ruby distribution now. But hey, it's slow! Well, as Ruby is a CGI-language that has to be interpreted, Apache needs to start the interpreter every now and then. You can speed up this process by installing FastCGI (download 1, 2, 3).

FastCGI
To untar and install type in the following Terminal-commands:
tar xzvf fcgi-2.4.0.tar.gz
cd fcgi-2.4.0
./configure --prefix=/usr/local
sudo make
sudo make install
Now we need to install the FastCGI bindings for Ruby:
tar xzvf ruby-fcgi-0.8.5.tar.gz
cd ruby-fcgi-0.8.5
/usr/local/bin/ruby install.rb config --prefix=/usr/local/
ruby install.rb setup
sudo ruby install.rb install
Then, just to make sure that Rails knows about and can access these libraries, we’ll install them to Rails with Gems:
sudo gem install fcgi
The last step in enabling FastCGI under Apache is to compile and install the mod_fastcgi Apache module:
tar xzvf mod_fastcgi-2.4.2.tar.gz
cd mod_fastcgi-2.4.2
apxs -o mod_fastcgi.so -c *.c
sudo apxs -i -a -n fastcgi mod_fastcgi.so
Open up the main apache configuration file located in /etc/httpd/httpd.conf, and add the following lines:
[IfModule mod_fastcgi.c]
FastCgiIpcDir /tmp/fcgi_ipc/
AddHandler fastcgi-script .fcgi
[/IfModule]
In order to enable FastCGI for the Rails application, edit the .htaccess file in the public folder, and find the line that reads:
RewriteRule ^(.*)$ /dispatch.cgi?$1 [QSA,L]
Change it to:
RewriteRule ^(.*)$ /dispatch.fcgi?$1 [QSA,L]
Restart Apache with he sudo apachectl graceful command, and we’re up and running with FastCGI.

MySQL/Ruby API
You will very probably want Ruby to talk to MySQL, huh? So let’s install the MySQL/Ruby API now:
tar xzvf mysql-ruby-2.5.2.tar.gz
cd mysql-ruby-2.5.2
/usr/local/bin/ruby extconf.rb --with-mysql-dir=/usr/local/mysql
make
The previous command expects that our MySQL installation is under /usr/local/mysql. If it’s somewhere else, just specify the location in the command above.

Assuming that MySQL is running, we can test the new API before installing it:
ruby -I. ./test.rb hostname username password
If that worked, we’re finally ready to install the API:
sudo make install
We can now get a connection to a MySQL server in our Ruby script like this:
require 'mysql'
con = Mysql.new(
"myserver.domain.com",
"username",
"password",
"mydatabase"
)
I really recommend Ruby. The language is very easy understandable and consistent. Check out these links, that I bookmarked for myself:

Suggested links
Ruby on Rails
Ruby handbook (en)
Ruby Tutorials
Ruby Application Archive


Ich habe mich in der letzten Zeit ein wenig mit Ruby beschäftigt und fand die Sprache ziemlich elegant -- besonders die sehr schlanke Syntax. Beispielsweise das Ruby-Äquivalent für Loops oder das Sicherheits-Handling von Benutzer-Eingaben ist toll gelöst.
Ihr habt sicherlich auch schon vom Ruby-Entwickler Framework Rails gelesen. Das ist wirklich so gut wie sein Ruf. Es wurde vom Chefprogrammierer von 37signals entwickelt und ermöglichte es ihm, eine Anwendung wie Basecamp alleine in 2 Monaten zu programmieren (schaut euch das mal hier an, falls ihr es nicht glauben könnt).
Obschon der Ruby-Support sich bei deutschen Providern verbessert, wird man wohl im Moment auf den meisten Servern kein Ruby finden. Ich habe meinen Webspace bei Host Europe, die Ruby zwar anbieten, allerdings bur eine sehr veraltete Version 1.6.2 -- blank, ohne embedded Ruby oder so (schätzungsweise wird sich das erst ändern, wenn sie ihre Linux-Distris mal updaten).

Das folgende ist Voraussetzung für die Ruby-Installation: OS X 10.3.x und XCode Tools für das Kompilieren (findet sich auf der Mac Software CD), Ruby source und Rubygems (ein nützliches Tool, um Drittanbieter-Module für Ruby zu verwalten). es gibt auch vorkompilierte Rubydistributionen, bei mir liefen die allerdings nicht...
Besonders Windows-User können sich mal Instant Rails anschauen, eine komplett vorkonfigurierte Ruby-Rails-Apache-MySQL-Lösung.
Ausserdem solltet ihr vielleicht das MySQL/Ruby API Modul herunterladen, damit Ruby nachher auch auf Datenbanken zugreifen kann.

Kompilieren
Jetzt mal den Terminal öffnen und in den Ordner wechseln, in dem die Ruby-source liegt (mit dem Befehl cd und dem Pfadnamen). Ich schlage den Zielordner /usr/local vor. Auf diese Weise bleibt die originale Apple-Ruby-Distribution unangetastet. Folgende Zeilen eintippen:
./configure --prefix=/usr/local
make
sudo make install
Das war es schon. Testen kann man das ganze mit folgendem Kommando:
/usr/local/bin/ruby -v
Man sollte folgendes quittiert bekommen:
ruby 1.8.2 (2004-12-25) [powerpc-darwin7.8.0]
Damit die Shell unser neues Ruby aufruft, statt die alte Apple-Version, müssen wir die "path environment variable" ändern, und zwar in dem versteckten File .bash_login in unserem Root-Verzeichnis. die folgenden 2 Zeilen müssen per Texteditor hinzugefügt werden:
PATH="/usr/local/bin:/usr/local/sbin:~/bin:$PATH"
export PATH
Jetzt schließen wir das Terminal-Fenster und öffnen ein Neues, damit die Variable auch geupdatet wird. Nun mal folgendes Kommando eintippen:
ruby -v
Man sollte dieselbe Quittierung erhalten, wie vorher. Wenn nicht (z.B. eine ältere Versionnummer), dann ist irgendetwas schiefgelaufen.

Rubygems
Um Rubygems zu installieren, geben wir folgende Kommandozeilen ein:
tar xzvf rubygems-0.8.8.tgz
cd rubygems-0.8.8
sudo ruby setup.rb
Nun sollte eine Erfolgsmeldung auftauchen. Mit dem Befehl gem -v kann man das Ganze nochmal prüfen.

Rails
Dank Rubygems geht das Installieren von Rails sehr einfach mit:
sudo gem install rails
Zu den folgenden Fragen immer "Y" angeben. Damit ist die Installation eingentlich abgeschlossen. Aber Moment: das ganze ist ziemlich langsam! Das liegt daran, daß Ruby eine interpretierte Sprache ist. Apache muss jedesmal den Interpreter starten. Dies lässt sich aber glücklicherweise beschleunigen mit FastCGI (download 1, 2, 3).

FastCGI
Folgende Terminal-Kommandos installieren FastCGI:
tar xzvf fcgi-2.4.0.tar.gz
cd fcgi-2.4.0
./configure --prefix=/usr/local
sudo make
sudo make install
Und nun die FastCGI bindings für Ruby:
tar xzvf ruby-fcgi-0.8.5.tar.gz
cd ruby-fcgi-0.8.5
/usr/local/bin/ruby install.rb config --prefix=/usr/local/
ruby install.rb setup
sudo ruby install.rb install
Mit folgendem Befehl stellen wir sicher, daß Ruby auch problemlos auf diese Libraries zugreifen kann:
sudo gem install fcgi
Nun muss auch noch das entsprechende Apache Modul installiert und konfiguriert werden:
tar xzvf mod_fastcgi-2.4.2.tar.gz
cd mod_fastcgi-2.4.2
apxs -o mod_fastcgi.so -c *.c
sudo apxs -i -a -n fastcgi mod_fastcgi.so
Die Apache-Konfigurationsdatei liegt unter /etc/httpd/httpd.conf. Hier müssen folgende Zeilen eingefügt werden:
[IfModule mod_fastcgi.c]
FastCgiIpcDir /tmp/fcgi_ipc/
AddHandler fastcgi-script .fcgi
[/IfModule]
Um FastCGI auch für Rails-Anwendungen freizuschalten, muss in der .htaccess-Datei im Ordner Public die folgende Zeile:
RewriteRule ^(.*)$ /dispatch.cgi?$1 [QSA,L]
in
RewriteRule ^(.*)$ /dispatch.fcgi?$1 [QSA,L]
geändert werden. Jetzt nur noch Apache mit sudo apachectl graceful neustarten.

MySQL/Ruby API
Allerdings soll Ruby ja auch auf MySQL zugreifen können, hm? Also müssen wir noch das Ruby-MySQL Modul installieren:
tar xzvf mysql-ruby-2.5.2.tar.gz
cd mysql-ruby-2.5.2
/usr/local/bin/ruby extconf.rb --with-mysql-dir=/usr/local/mysql
make
Wenn MySQL schon läuft, kann man mal folgenden Test machen:
ruby -I. ./test.rb hostname username password
Wenn das funktioniert hat, dann einfach installieren mit:
sudo make install
Ruby greift auf MySQL mit den folgenden Befehlen zu:
require 'mysql'
con = Mysql.new(
"myserver.domain.com",
"username",
"password",
"mydatabase"
)
Ich kann Ruby wirklich empfehlen. Hier noch ein paar Links die ich mir selber als Ruby-Lesezeichen angelegt habe...

Mehr zum Thema
Ruby on Rails
Ruby handbook (de)
Ruby Tutorials
Ruby Application Archive

:) <- Lutz

2 comments:

Anonymous said...

Ach, wenn Weihnachten doch nur einen Monat dauern würde ... Ich versuche mal RoR auf meinem PB zwischen den Tagen ans Rennen zu bekommen. Hier gibt es eine (hoffentlich prima) Anleitung für Ror auf Tiger.

Lutz_W said...

Daumen-Drück für das PB... ich nehme an, Du hast es noch nicht wieder zurück? Ich glaube, ich werde auf meinem Notebook mal mein Glück mit Instant Rails machen...

Schöne Feiertage,
:) <- Lutz