Passenger für Rails-3-Entwicklung

Wie man den Phusion Passenger für die Entwicklung benutzt wurde schon an einigen Stellen beschrieben. In Verbindung mit Rails 3 gibt es eine kleine Falle. Folgt man diesen Anleitungen, wird die eigene Rails-3-Anwendung immer im Production-Mode laufen. Grund dafür ist die config.ru-Datei im Hauptverzeichnis der Anwendung. Damit erkennt Passenger die Anwendung nicht als Rails- sondern als Rack-Anwendung. Die Lösung des Problems ist einfach. Man benennt die Datei um, damit Passenger es nicht mehr für eine Rack-Anwendung hält. Möchte man aus irgendeinem Grund, diese Datei nicht nicht anfassen, muß man Passenger mitteilen, daß es die Rack-Anwendung im Development-Mode starten soll. Dazu muß man in der Apache-Konfiguration folgende Zeile einfügen:

RackEnv development

Damit sollte die Anwendung nach dem Restart auch tatsächlich im Entwicklungsmodus laufen.

Zahlenspiele in Ruby

Für mich bislang eher unbekannt geblieben war die Methode, Zahlen aus unterschiedlichen Zahlenbasen umzurechnen. Ich hatte bislang angenommen, ich müßte mich dazu mit pack/unpack herumschlagen. Einfacher (und auch intuitiver) geht es mit String#to_i und Fixnum#to_s.

GitHub: FaceBook für Hacker

Für mich nahezu unbemerkt hat sich GitHub zu einem Mekka für Hacker entwickelt. Jeder kann eigene Projekte starten, andere Projekte abzweigen und die Änderungen wieder an den ursprünglichen Autor zurückgeben. Open Source, wie es sein sollte. Alles basierend auf der Revisionsverwaltung, die Linus Torvalds zur Verwaltung des Linux-Kernels ins Leben gerufen hat: Git.

Und wer heutzutage immer noch keine Revisionsverwaltung für seine Software-Projekte verwendet, sollte sich wirklich schämen!

NetBeans 6

Wer es an anderer Stelle noch nicht mitbekommen hat, NetBeans 6 ist erschienen. Die Rails-Unterstützung ist fantastisch und hat bei mir TextMate als Editor für Rails abgelöst. (Allerdings auch nur für Rails)

NetBeans 6 als Rails-IDE

Als ich mir das letzte Mal NetBeans angeschaut habe, war das während meiner äußerst kurzen Java-Phase. Es war irgendwann im letzten Jahrhundert, noch bevor Sun NetBeans erwarb. NetBeans war eine reine Java-Entwicklungsumgebung — für und in Java. Bis vor kurzem sah ich auch keinen Grund, mich mit NetBeans wieder zu befassen. Doch vor ein paar Tagen sah ich dann diesen Artikel in meinem Feed-Reader.

Da sich Sun vor kurzem die JRuby-Entwickler ins Haus geholt hat, wurde Ruby-Support in das kommende NetBeans 6 eingebaut. Derzeit ist NetBeans 6 noch eine Entwicklerversion und es gibt noch hier und da ein paar scharfe Ecken und Kanten, doch die Software ist durchaus benutzbar.

Ich habe einen Versuch gestartet und eine kleine Rails-Anwendung komplett mit der NetBeans-IDE entwickelt. NetBeans macht es möglich, komplette Anwendungen zu erstellen, ohne auf die Konsole zu müssen. Alle Generatoren lassen sich aus der IDE aufrufen. Auch der Mongrel/WEBrick läßt sich hier starten und stoppen. Subversion/CVS-Support muß ich wohl nicht extra erwähnen, da ich das heutzutage als selbverständlich ansehe. Sogar Autotest läßt sich bequem aus einem Menü starten. Der eingebaute SQL-Client (eigentlich fast ein kleiner Datenbankmanager) ermöglicht es sich direkt mit Datenbanken zu verbinden. Die Entwickler haben sogar einen Gem-Manager eingebaut. Damit lassen sich bequem mit einer GUI Ruby-Gems installieren, deinstallieren und updaten. (Dazu unten noch mehr)

Negativ aufgefallen ist mir, daß die IDE sich auf meinen PowerPC PowerBook ab und zu eine kleine Auszeit nimmt. Dies geschieht meistens, wenn NetBeans 6 versucht mir seine Hilfe anzubieten und dazu alle möglichen Methoden auflistet, die ich an das Objekt senden könnte. Dies ist mir auf dem Mac mini mit Core Duo in der Firma nicht so aufgefallen. Man sollte also schon eine schnelle CPU haben. Ab und zu poppen auch Fenster mit irgendwelchen Java-Exceptions auf. Da es sich noch um eine Entwicklerversion von NetBeans handelt, ist das verzeihlich. Trotz dieser Exceptions läuft jedoch die Software weiter und stürzt nicht ab.

Hier noch ein paar Tips: NetBeans 6 bringt sein eigenes JRuby mit ein paar Gems mit. Ich hatte natürlich schon ein voll lauffähiges Ruby 1.8.6 mit einem Haufen an Gems auf dem Rechner installiert. Glücklicherweise haben die Entwickler daran gedacht. In den Einstellungen findet sich unter Ruby -> Platform die Möglichkeit, einen eigenen Ruby-Interpreter anzugeben. Wählt man hier sein bisheriges Ruby aus, findet NetBeans auch die dazugehörigen Gems. NetBeans erzeugt für diese Gems einen Index, der für die Codevervollständigung benutzt wird.

Der eingebaute Gem-Manager ist zwar angenehm, funktioniert aber bei einer normalen Ruby-Installation nicht, weil normale User in der Regel nicht über Schreibrechte in /usr(/local)/lib/ruby/gems verfügen. Erst wenn man sich die nötigen Rechte verschafft, funktioniert der Gem-Manager.

Autotest, Growl und RSpec

John Nunemaker beschreibt in Autotest Growl Pass/Fail Notifications wie man mit Growl sich die Ergebnisse von Autotest darstellen lassen kann. Hierzu muß man nur eine ~/.autotest-Datei anlegen, die die Benachrichtigunren anzeigt. Anscheinend haben jedoch letzte Änderungen in RSpec diese Beispielskripte unwirksam gemacht. Schuld ist das Ausgabeformat des Testlaufs. Doch mit wenigen Änderungen kann man das wieder hinbiegen. Nun klappen die Growl-Benachrichtigungen bei mir. Hier ist die ~/.autotest-Datei, die ich benutze. (Ich habe auch die Bilder an einen anderen Ort abgelegt)

require 'autotest/redgreen'
require 'autotest/timestamp'

module Autotest::Growl

  def self.growl title, msg, img, pri=0, sticky=""
    system "growlnotify -n autotest --image #{img} -p #{pri} -m #{msg.inspect} #{title} #{sticky}"
  end

  Autotest.add_hook :ran_command do |at|
    image_root = "~/Library/Autotest/Images"
    results = [at.results].flatten.join("
")
    output = results.slice(/(\d+)\sexamples*,\s(\d+)\sfailures*/)
    if output
      if $~[2].to_i > 0
        growl "FAIL", "#{output}", "#{image_root}/fail.png", 1
      else
        growl "Pass", "#{output}", "#{image_root}/pass.png"
      end
    end
  end
end

Latexspiele auf den Schienen

Wer jetzt einen Artikel über außergewöhnliche Sexualpraktiken erwartet hat, der wird enttäuscht. Vielmehr geht es darum, aus einer Rails-Anwendung ein ansehnliches PDF herauszubekommen. Es gibt einen Haufen Wege, um PDFs in einer Rails-Anwendung zu erzeugen, aber irgendwie fand ich alle unbefriedigend. Die meisten sind einfach zu Low-Level. Ich will nicht festlegen müssen, an welchen Koordinaten ein Text erscheinen soll.

Wieso nicht etwas nehmen, was sich seit Jahrzehnten bewährt hat und das ich auch kann? LaTeX erzeugt seit 1984 angenehm lesbare Dokumente. Anscheinend bin ich nicht der einzige, der diese Idee hatte. Mit Rtex existiert bereits ein Plugin für Rails, was genau das erledigt. Damit kann man einfach LaTeX-Dokumente als Views verwenden. Da das Dokument vorher durch Erb geschleust wird, kann man natürlich auf die gewohnten <%= %>-Marker zurückgreifen.

Tote Externals in SVN entfernen

Ich hatte in einem meiner Rails-Projekte validates_as_email benutzt. Dazu hatte ich es via Externals in das in mein Projekt importiert. Das funktionierte prima, bis vor einer Weile der externe Server seine Arbeit einstellte. Ich bekam beim Commit sowie bei neuen Checkouts immer Fehlermeldungen wegen dieser externen Referenz. Das ging mit nach einer Weile auf die Nerven und ich entschloß mich, diese Plugin wieder rauszuschmeißen.

Mein erster Versuch mit einem svn remove funktionierte nicht, da svn versuchte den nicht mehr vorhandenen Server wieder zu kontaktieren. Glücklicherweise konnte mir in #svn im Freenode geholfen werden.

Externals sind eine Property des Elternverzeichnisses. Um also die Referenz für validates_as_email manuell zu entfernen reicht ein einfaches svn propedit svn:externals vendor/plugins. Ich mußte nur die Zeile löschen, in der sich die Referenz für dieses Plugin befand. Danach muß das Elternverzeichnis wieder commited werden, und die Referenz ist endgültig weg.

Das nächste Mal benutze ich gleich Piston.

Zebra-Tables zum dritten

Zebra-Tabellen scheinen sowas wie ein Steckenpferd von mir zu sein. (s. hier und hier) CSS3 ist leider immer noch nicht weiter vorangekommen. Aber dafür habe ich in der Zwischenzeit Prototype für mich entdeckt. Prototype ist ein Framework für Javascript, was die Programmierung von Anwendungen in Javascript erheblich vereinfacht. Ich hatte ja schon mal hier angedeutet, daß sich mit ein wenig Javascript eine Zebra-Tabelle dynamisch — ohne extra Markup — erzeugen läßt. Das ganze endete mit ca. 20 Zeilen Javascript Code. Das gleiche mit Prototype sind weniger als 10 Zeilen. (und auch nur so lang, weil ich es lesbar machen wollte)

var ZebraTable = {
  load: function() {
    $$('table.zebra tbody > tr:nth-child(2n+1)').each(function(elt) {
      elt.addClassName('rowodd');
    })
  }
}

Event.observe(window, 'load', ZebraTable.load);

Ja, das ist alles. Wer sich den Code ein wenig genauer anschaut, wird dort einen CSS3-Seketor finden. Dieser Selektor ist jedoch komplett in Javascript innerhalb von Prototype implementiert und somit Browserunabhängig. Der Browser muß also kein CSS3 beherrschen.

Wer den Code ausprobieren möchte, muß einfach nur Prototype und den Code oben in sein HTML-Dokument einbinden. Und schon werden alle ungeraden Zeilen, die sich im Tabellenrumpf (<tbody>) einer jeder Tabelle mit der Klasse zebra befinden, mit der Klasse rowodd versehen. Nun ist es nur noch eine Sache von einfachstem CSS, diese Klasse mit einer anderen Hintergrundfarbe auszustatten.

Schriftwahl für Programmierer

Ein Nicht-Programmierer wird vermutlich nicht verstehen können, wie eigensinnig ein Softwareentwickler bei der Wahl der richtigen Schrift für seinen Texteditor sein kann. Ein Programm soll nicht nur gut funktionieren, auch der Programmcode soll schön aussehen. Und da spielt die Schrift eine entscheidende Rolle. Gerade heute fielen mir gleich 2 Artikel in meinem Feed-Reader auf, die sich mit diesem Thema beschäftigen. More Fonts und TextMate Fonts. Ich habe mich also auf meiner Platte umgeschaut, was ich so an Entwicklertauglichen Schriften installiert habe. Hier meine Auswahl:

Andale Mono
Andale Mono (Teil des Microsoft Core Fonts Pakets)
Lucida Sans Typewriter
Lucida Sans Typewriter (mitgeliefert bei Mac OS X)
Consolas
Consolas (mitgeliefert bei Windows Vista)
Inconsolata
Inconsolata
image
Monaco (mitgeliefert bei Mac OS X)
image
DejaVu Vera Sans Mono
image
Courier (mitgeliefert bei Mac OS X)
image
Courier New (mitgeliefert bei Mac OS X und Windows)

Die letzten beiden habe ich als abschreckende Beispiele aufgeführt. Für welche Schrift man sich letztenendes entscheidet ist eine sehr persönliche Geschmackssache. Ich werde wohl weiterhin bei Monaco bleiben.

Nachtrag: Es gibt einen Trick, um Consolas und andere Vista-only Fonts (außer Segoe UI) ohne Vista zu bekommen.