Categories
Verschiedenes

Zweitblog

Es war ein wenig Still im Blog in letzter Zeit. Das lag daran, daß ich an meinem Zweitblog gearbeitet habe. Acts_as_blog ist ein Blog rund um Ruby on Rails und verwandte Themen.

Categories
Programmierung Software

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.

Categories
Mac Programmierung Software

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
Categories
Internet Programmierung Software

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.

Categories
Programmierung

SQL ohne Schleifen

Manche Aufgaben schreien geradezu danach, mit Schleifen gelöst zu werden. In SQL ist dies selten nötig. In meinem Beispiel wollten wir für jeden Monat des letzten Jahres die Häufigkeit eines bestimmten Ereignisses errechnen um es graphisch darzustellen. Mein Kollege, der an dieser Stelle besser anonym bleiben möchte, schlug schon vor, die Abfrage 12× mit unterschiedlichen Bedingungen abzuschießen.

Mir fiel ein, daß PostgreSQL über Funktionen verfügt, mit denen man aus einem Datum Jahr/Monat/Tag (und einiges Mehr) extrahieren kann. Die Funktion heißt sinnvollerweise extract. Damit kann man das Problem mit einer einzigen Abfrage erschlagen. Dies sieht dann so aus:

SELECT EXTRACT(month FROM created_on) AS month, COUNT(*) AS occurences
FROM my_event_log
WHERE EXTRACT(year FROM created_on)=2006
GROUP BY EXTRACT(month FROM created_on)
ORDER BY EXTRACT(month FROM created_on)

Dies läßt sich auch prima in Rails verwenden.

events = MyEventLog.count(:conditions => [ "EXTRACT(year FROM created_on)=?", 2006],
                          :group => "EXTRACT(month FROM created_on)",
                          :order => "EXTRACT(month FROM created_on)")

Es sollte an dieser Stelle jedoch nicht unerwähnt bleiben, daß durch die Verwendung von Funktionen wie extract in Verbindung mit ActiveRecord, der datenbankagnostische Aspekt von ActiveRecord verloren geht, da nicht alle Datenbanken die gleichen Funktionen unterstützen. Aber vermutlich ist datenbankagnostische Programmierung eh eine utopische Vision.

Categories
Verschiedenes

Rails Edge + Gettext = Frust

Notiz an mich selbst: Ruby-Gettext vorerst nur mit stabilem Rails verwenden.