Kleine Helfer #1: alias_method_chain
31. Januar 2008
Ich entdecke immer mal wieder kleine Helferlein, die mir bis dato noch nicht untergekommen waren. In der heutigen Episode: alias_method_chain
Die Methode wurde mit Revision 4276 in Rails eingeführt und dient dazu eine oft benutze Kombination von alias Aufrufen zu vereinfachen.
1 2 3 4 5 6 7 8 9 10 11 |
def example end def example_with_put puts 'ping' example_without_put end alias_method :example_without_put, :example alias_method :example, :example_with_put |
Was passiert hier?
Wir erstellen ein Alias meiner alten Methode example und leiten alle Aufrufe an example_with_put weiter. Diese Methode wiederum tut was Sinnvolles und ruf dann meine originale example Methode via _example_without_put auf. Eigentlich nichts besonderes..
Da dieser Trick recht oft verwendet wird, erhielt Rails mit der Rev 4276 die Methode alias_method_chain, die dieses “Doppel-Aliasing” übernimmt. Ich kann die beiden alias_method Aufrufe auch folgendermaßen erstellen:
1 2 |
alias_method_chain :example, :put |
Mehr Information finden sich im Code von Rails.
has_many :downloads, :through => :Rails
24. Januar 2008
Rails kann alles vieles. Und, zu den vielen Sachen die es kann, gehört auch das Ausliefern von Dateien. Diese Problematik erledigt das Framework in der Regel zwar ganz gut, aber sobald die Größe der Dateien zunimmt kann es mitunter zu merkwürdigem Fehlverhalten und Downloadfehlern kommen.
Eine Ursache dafür ist Rubys Gargabe Collector. Da Rails die Dateien, bevor es sie ausliefert, in den Speicher lädt, greift er ganz gerne mal dazwischen und sorgt für Unruhe im Speicherwald. Es scheint mir allerdings generell recht fragwürdig 100 Mb in den Speicher zu laden. Es muss also eine andere Lösung her.
Im Normalfall besteht ein Railsstack aus mehreren Mongrel Instanzen und einem lokalen Proxy der die Anfragen auf diese Instanzen verteilt. Sind mehrere App Server im Einsatz wird noch ein weiterer Proxy/Loadbalancer benötigt, der die Requests auf die einzelnen Server verteilt. Es bietet sich also an, die Dateien direkt durch den jeweiligen lokalen Proxy (i.R. Nginx, Lighty, Pound oder Apache) ausliefern zu lassen.
Um das zu erreichen, lassen wir Rails anstatt der eigentlichen Datei einen modifizierten, internen Header in die Antwort zum Client einsetzen. Diese wird vom Proxy erkannt und veranlasst ihn dann eine Datei aus einem definierten Ort zu verschicken. Dieser interne Header wird in der Regel vom Proxy aus den Headern entfernt, bevor die Antwort an den externen Client weitergereicht wird.
Am Beispiel Nginx könnte der Code dafür so aussehen:
1 2 3 4 5 6 7 8 9 10 |
case RAILS_ENV when 'production' response.headers['X-Accel-Redirect'] = "/protected/" + File.basename(file.path) response.headers['Content-Disposition'] = "attachment; filename=file.tar" render :nothing => true else # Directly send in development env send_data(file.read, :filename => File.basename(file.path)) end |
Die Konfiguration des Nginx ist recht einfach:
1 2 3 4 5 |
location /protected/ { internal; alias /path/to/file/directory/; } |
In ‘Multi-Server’ Umgebungen sollte man darauf achten, dass Downloads nicht durch den First-Proxy geleitet werden, sondern direkt auf den jeweiligen App-Server. So lässt es sich vermeiden, dass der Loadbalancer die längeren Anfragen/Antworten als Timeouts deutet und die Verbindung kappt.
Neu: Hoe 1.3.0
15. August 2007
Hoe ist eine Sammlung von Tools zur Unterstützung von Ruby Projekten. Es generiert alle grundlegenden Rake Tasks die in den verschiedenen Projektzyklen benötigt werden: RDoc, Testing, Verpacken und Veröffentlichen.
Mehr Ruby, weniger Windows.
3. Juli 2007
Zugegeben, die Überschrift klingt ein wenig merkwürdig. Dennoch hat sie eine Bedeutung. Laut Evans Data verlor Windows im vergangen Jahr 12% (auf 64,8%) an Entwicklern, die ihre Arbeit auf Microsoft Plattformen fokussieren. Im gleichen Zeitraum konnte Linux 34 Prozent (auf 11,8%) dazu gewinnen.
Die gleiche Studie untersuchte auch die Beliebtheit von Skriptsprachen. Demnach hat Javascript drei mal mehr Entwickler als PHP, Ruby oder Python. Allerdings prognostizieren die Marktforscher von Evans Data, dass Ruby im kommenden Jahr um 50% zulegen wird.
YouTube Gem 0.8.6 veröffentlicht
13. Juni 2007
Das YouTube Gem bildet ein Interface zur REST Api von YouTube. Mit der Bibliothek lassen sich Videoinformationen aus dem System auslesen. So kann man z.B. mit
videos = youtube.featured_videos
die Top Videos auslesen, oder nach bestimmten Tags suchen mit:
videos = youtube.videos_by_tag('heel toe technique')
Das Gem installiert sich via sudo gem install youtube
Wer mehr wissen will, findet Informationen auf der Projektseite oder im Blog des Entwicklers.
Ruby, WMI und die Erkennung von USB Geräten auf Windows
12. Juni 2007
Gute Artikel über Ruby und die Integration in das Innenleben von Windows findet man selten. Dieser hier ist so einer. Es wird beschrieben wie sich mittels Ruby die angeschlossenen USB Geräte eines Windowssystems auslesen lasse
Text to Speech für Ruby und Rails
12. Juni 2007
Die Bibliothek Festival TTS for Ruby machts möglich. Sie steht als Gem für Ruby und als Plugin für Rails zum Download zur Verfügung. Das Projekt verwendet zur Laufzeit die nativen Bibliotheken festival und lame.
Die Installation auf einem Ubuntu Linux gestaltet sich sehr einfach. Hinweise dazu finden sich auf der Projektseite.
Im Ruby sprechen die Texte mit "Hello Ruby".to_speech
.
Für die Verwendung unter Rails wird der ViewHelper
<%= text_to_flash_player "Talk me!" %>
verwendet.
JRuby 1.0 veröffentlicht
12. Juni 2007
Die zu 100% auf purem Java basierende Laufzeitumgebung für Ruby, JRuby, wurde in der Version 1.0 veröffentlicht. Viele Neues gibt es nicht, da seit der Version 0.9x hauptsächlich an unterschiedlichen Inkompatibilitätsproblemen gearbeitet wurden.
JRuby 1.0 steht hier zum Download bereit.
Jobs per Feed
11. Juni 2007
Das Job Board railsjobs.de bietet nun auch einen Feed für aktuelle Angebote. Vielleicht findet der Eine oder Andere so eine neue Heimat?