i76 webdesign, Sittard
Ruby on Rails
woensdag, 11 juni, 2008
“Ruby, ruby, ruby, ruby!”
galmt het lied van de Kaiserchiefs nog door mijn hoofd de volgende dag. Gisteren om 5:00 opgestaan om de trein naar Amsterdam te nemen waar op de Hogeschool van Amsterdam de Ruby en Rails 2008 conferentie te bezoeken.

- Badges van Tom-Eric en Gerard voor Ruby en Rails 2008
Veel internationaal bekende sprekers waren aanwezig, zoals Zed Shaw die de spits afbeet. Zed is onder andere bekend door het schrijven van Mongrel en bekender door zijn Rails is a Ghetto rant. Een bevlogen programmeur die, om een punt te maken, in twee weken een virtual machine basis heeft gemaakt voor assembly die nog werkt ook nog.
Obie Fernandez, de schrijver van het boek The Rails Way, had stukken voorbeeldcode in rails die zo slecht in elkaar stak dat de tranen je in de ogen sprongen. Helaas waren deze voorbeelden op waarheid berust en werden we nogmaals gewezen op het feit dat het voor de meeste klanten niet mogelijk is om de kwaliteit van IT-producten te beoordelen en daarmee vaak een kat in de zak kopen.
De jongens van Phusion vertelden over hun schokkend coole product Phusion Passenger. De lang met spanning verwachte mod_rails voor Apache! De snelheid gaat omhoog, geheugengebruik naar beneden, maar, voor ons in elk geval, nog belangrijker een sterke vereenvoudiging van deployment en stabiliteit van applicaties. Weg met mod_proxy, extra webservers voor Ruby en de oplossing die mijn oude baas classificeerde als: “Von hinten durch die Brust ins Auge”. Een mooi schone nette oplossing op het spoor van de Rails Way.
Charles Oliver Nutter, die voor Sun werkt aan het JRuby project, heeft geprobeerd een aantal vooroordelen weg te nemen met betrekking tot Java en gesproken over een aantal details van het JRuby project. Hoewel ik me kan voorstellen dat het handig is om Ruby en Rails op deze manier bij grote bedrijven binnen te krijgen, is het niet iets dat past in mijn straatje. Wat dat betreft ben ik wellicht te zwaar bevooroordeeld om van mening te kunnen veranderen.
In de pauze werden de winnaars uitgeroepen van de Ruby contest die werd gehouden door Finalist. Uit een grote database van vragen kon je er 5 beantwoorden en de winnaar is degene met de meeste juiste antwoorden in de kortste tijd. Van de 260 Ruby programmeurs die aanwezig waren is onze Tom-Eric derde geworden!

- De prijzen die Tom-Eric binnenhaalde
Tijdens de lighting talks werd onder andere verteld over de scaling issues die projecten zoals Wakoopa en Soocial zijn tegen gekomen op het moment dat de projecten wel erg populair worden of op Techcrunch worden genoemd.
Last, but not least, was er een videoverbinding met David Heinemeier Hansson in Chicaco die zich tijdens het Q&A uitweide over zijn opvattingen over Rails, de bedrijfsvoering bij 37 Signals en de Mac die elke Rails programmeur lijkt te hebben.
Het is leuk om weer helemaal geïnspireerd en gehyped terug te komen van zo’n conferentie. Plannetjes en ideeën borrelen omhoog. Benieuwd wat daar uit gaat komen.
Geschreven door:
Gerard
Geplaatst in Ruby on Rails |
Geen reacties »
donderdag, 6 september, 2007
Dit is een vertaling en uitbreiding van mijn orginele artikel, over association extensions in RoR.
Stel je bent een model aan het maken, en je wilt graag je messages koppelen aan je user. Dat is natuurlijk heel makkelijk in Ruby on Rails:
class User < ActiveRecord::Base
has_many :messages
end
Vervolgens kan je op eenvoudige manier de berichten van een gebruiker benaderen. Alles wat nodig is is het vinden van de user en daarna kan je ze direct aanroepen om er leuke dingen mee te doen. Bijvoorbeeld het weergeven van de hoeveelheid berichten die een gebruiker heeft:
>> user = User.find :first
=> #<User:0xb715586c @attributes={"nickname"=>"tomeric", "id"=>"1", "first_name"=>"Tom-Eric", "last_name"=>"Gerritsen"}>
>> user.messages.length
=> 7
Maar nu heeft een gebruiker ongelezen berichten, en je wilt graag weten hoeveel dat er zijn. Je kan natuurlijk hier naar gaan zoeken:
>> user.messages.find(:conditions => 'unread = 1').length
=> 3
Of je kan een nieuwe relatie aanleggen:
class User < ActiveRecord::Base
has_many :messages
has_many :unread_messages, :conditions => 'unread = 1'
end
Zodat je nu met user.unread_messages.length de hoeveelheid ongelezen berichten kan opvragen, maar er is een nettere manier, namelijk met association extensions (documentatie op de Associations documentatie pagina).
Een passend voorbeeld van hoe je code er dan uit zou zien:
class User < ActiveRecord::Base
has_many :messages do
def unread(reload = false)
@unread_messages = nil if reload
@unread_messages ||= find(:all, :conditions => ‘unread is 1′)
end
end
end
Nu kan je de hoeveelheid ongelezen berichten opvragen met behulp van deze association extension; user.messages.unread.length. Het oogt meteen veel netter!
Geschreven door:
Tom-Eric
Geplaatst in Ruby on Rails |
Geen reacties »
donderdag, 6 september, 2007
De titel lijkt nikszeggend, maar probeer maar eens een pakkende titel te vinden die in het kort samenvat dat je artikel gaat over het hosten van Ruby on Rails applicaties op mongrel, gebruik makend van Apache en mod_proxy voor het serveren van je statische content (zoals afbeeldingen, scripts en stylesheets). Op dit moment een van de beste manieren om RoR applicaties te hosten.
Er komt namelijk een tijd dat je je prachtige web applicatie online wilt plaatsen, en alhoewel er meer dan genoeg providers zijn die RoR hosting aanbieden, is het natuurlijk veel leuker om het zelf te doen!
Allereerst een lijstje van dingen die je nodig hebt:
Aangezien het installeren van deze packages op elk OS anders is, gaan we hier niet te diep op in. Wij draaien zelf debian stable op onze servers, en hebben Apache en mod_proxy via apt-get geinstalleerd, mongrel en mongrel_cluster hebben we echter via Ruby Gems geinstalleerd.
Nu komt het leuke gedeelte, het configureren van je server!
Laten we eerst een mongrel configuratie bestand genereren. We gaan in onze voorbeelden even uit van een voorbeeld rails applicatie die we webwinkel noemen.
$ cd /home/webwinkel
$ mongrel_rails cluster::configure -e production -p 5000 -N 1
-c /home/webwinkel -a 127.0.0.1
Wat doet het mongrel_rails cluster::configure gedeelte precies? En wat betekenen de argumenten die we meegeven?
-e : Geeft de environment aan. in rails zijn dit development, production en testing. In principe wil je alle applicaties die via apache draaien als production laten draaien, aangezien je je development meestal met Webrick doet.
-p : Geeft de start poort aan van mongrel server aan. In ons geval starten we met poort 5000. Je moet er natuurlijk wel voor zorgen dat er geen andere applicaties zijn die deze poort gebruiken!
-N : Geeft aan hoeveel servers je wilt starten. We willen nu maar 1 server gebruiken, omdat we nog niet verwachten dat onze webwinkel veel bezoek gaat trekken. Niet dat we pessimistisch zijn, maar je wilt natuurlijk ook niet dat al je beschikbare geheugen opgaat aan niet gebruikte mongrel processen!
-c : De directory waar de rails applicatie zich bevind. In ons geval is dit dus /home/webwinkel.
-a : Het IP adres waar de mongrel server zich aan bindt. We zetten dit op 127.0.0.1, zodat het alleen lokaal beschikbaar is.
Als het goed is hebben we nu in /home/webwinkel/config een bestand staan dat mongrel_cluster.yml heet. Aangezien we straks het liefste al onze rails applicaties tegelijk opstarten, gaan we hiervoor een startup script schrijven. Hiervoor willen we alle configuratie bestanden het liefste op 1 centrale plek. Wat ik persoonlijk de makkelijkste oplossing vind is een directory /etc/mongrel_cluster te maken, en onze configuratie bestanden hier in te symlinken.
$ mkdir /etc/mongrel_cluster
$ ln -s /home/webwinkel/config/mongrel_cluster.yml
/etc/mongrel_cluster/webwinkel.yml
Nu nog een script dat hier gebruik van maakt. Ik heb dit in /etc/init.d/mongrel_cluster staan:
#!/bin/bash
CONF_DIR=/etc/mongrel_cluster
RETVAL=0
case "$1" in
start)
mongrel_cluster_ctl start -c $CONF_DIR
RETVAL=$?
;;
stop)
mongrel_cluster_ctl stop -c $CONF_DIR
RETVAL=$?
;;
restart)
mongrel_cluster_ctl restart -c $CONF_DIR
RETVAL=$?
;;
*)
echo "Usage: mongrel_cluster {start|stop|restart}"
exit 1
;;
esac
exit $RETVAL
Nu kan ik door /etc/init.d/mongrel_cluster start aan te roepen, al mijn mongrel servers starten!
Aangezien mongrel een fijne webserver is voor rails applicaties, maar niet zo heel snel is in het serveren van statische content (afbeeldingen, scripts, stylesheets, ed.), gaan we nu Apache zo configureren, dat deze alle aanroepen naar statische content behandeld, en de resterende aanroepen doorsluist naar mongrel.
Open het bestand waar je je virtual host in configureert (in debian bijvoorbeeld /etc/apache2/sites-enabled/webwinkel.i76.nl), en voeg, uiteraard aangepast naar eigen instellingen, onderstaande tekst toe:
<VirtualHost *:80>
ServerName webwinkel.i76.nl
DocumentRoot /home/webwinkel/public/
<Directory /home/webwinkel/public/>
Options +FollowSymlinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
ProxyRequests Off
ProxyPass / http://127.0.0.1:5000/
ProxyPassReverse / http://127.0.0.1:5000/
ProxyPreserveHost On
# Voor statische files
RewriteRule "^/(images|stylesheets|javascripts)/?(.*)" "$0" [L]
# Als een pagina gecached is, vraag die dan op
RewriteRule ^([^.]+)$ $1.html [QSA]
# Anders dan ...
RewriteCond %{REQUEST_FILENAME} !-f
# Sturen we het door naar onze mongrel
RewriteRule "^/(.*)" "http://localhost:5000/$1" [P,QSA,L]
</VirtualHost>
Een herstart van Apache 2 later, en alles werkt precies zoals je het wilt. Mocht je website zeer populair worden, dan heeft het zeker zin om te kijken naar mongrel cluster configuraties. Hieronder een aantal gerelateerde links:
Geschreven door:
Tom-Eric
Geplaatst in Ruby on Rails |
2 reacties »