About March 2009

This page contains all entries posted to /blog/wvk in March 2009. They are listed from oldest to newest.

February 2009 is the previous archive.

April 2009 is the next archive.

Many more can be found on the main index page or by looking through the archives.

Powered by
Movable Type 3.31

« February 2009 | Main | April 2009 »

March 2009 Archives

March 17, 2009

wvk goes hardware again

Nachdem alle Geeks um mich herum mehr und mehr der Hardware-Bastelei verfallen sind, entschied ich mich auch dazu, mal wieder dem alten Hobby nachzugehen. Statt aber diesmal alle Drecksarbeit wie Platinenlayout entwerfen, Ätzen und dergleichen mehr einzuschließen, bestellte ich unlängst bei Think Geek die YBox2, ein Minzdosengroßes PCchen zum selber zusammenlöten.

Dieses kleine Wunderwerk verwendet den Propeller-Chip von Parallax (eindeutig erkennbar an seinem netten Aufdruck ;)), einem 32bit, 80MHz, 8-Kern-Prozessor mit 32KByte RAM und ebensoviel EEPROM. Besagtes PCchen besitzt einen Ethernetanschluss, Summer, Mehrfarben-LED, IR-Empfänger, TV-Ausgang (umschaltbar zwischen NTSC und PAL) und jede Menge nutzbarer IO-Pins. Programmiert wird die Kiste über eine wahlweise auf dem Chip interpretierten oder vorher kompilierten Hochsprache namens Spin, oder aber in Maschinensprache. Was man damit anstellen kann, werde ich wohl in den nächsten Wochen erkunden...

Kaum mehr als eine Stunde hat das Zusammenlöten gedauert, nicht zuletzt dank der hervorragenden Bauanleitung. Beim Anschließen der YBox an die 9V-Spannungsversorgung gab sie auch gleich schon ein freundliches Piepsen von sich und die Mehrfarben-LED zeigte ihr psychedelisches Farbenspiel. Der über DHCP konfigurierte Netzwerkanschluss funktionierte ebenfalls auf Anhieb, was die abgebildete Statusseite dokumentiert.

Jetzt gilt es nur noch, zwecks sinnvoller Nutzung des Videosignals einen alten Fernseher aufzutreiben. Aber bitte nicht weitersagen, sonst steht morgen wieder die GEZ vor der Türe ;-)

March 18, 2009

Rails Cells: was bringt's?

Am heutigen Tage durfte ich das vielversprechende Rails-Pluging Rails Cells einmal genauer inspizieren. In einem aktuellen Projekt wären alle Voraussetzungen erfüllt, die den Einsatz dieses "Mini-MVC"-Frameworks im MVC-Framework rechtfertigen würden:

  • aufwändige Display-Logik mit einer großen Menge an bedingten Ausgaben
  • Datenbank-Abfragen in Views (á la Users.find_by_trallalla.each {...})
  • Helper-Methoden, die nur an einer Stelle aufgerufen werden, um dort die View zu entrümpeln
  • Controllermethoden, die assoziierte Resourcen der eigentlich darzustellenden Resource laden, weil "sie" wissen, dass sie irgendwo in der entsprechenden View verwendet werden (was zu Fehlern führen kann, wenn die View in einem anderen Kontext wiederverwendet wird)
  • Partials, die nur an einer stelle verwendet werden, um die "Haupt-View" "übersichtlicher" zu halten

Cells verspricht in solchen Fällen Besserung, da es ein ähnlich Komponentenbasiertes Oberflächendesign erlaubt wie es in Desktopanwendungen oder JSF etc. schon lange verwendet wird: einzelne Komponenten (Cells) enthalten sowohl eine Logik- als auch eine Darstellungsschicht und kapseln so Helper und Templates für einen abgegrenzten Oberflächenbereich. Cells agieren wie stark abgespeckte Rails-Controller, ihre Methoden werden States genannt. So kann man sich z.B. eine Login-Box als GUI-Komponente vorstellen, die wie folgt verwendet wird:

in /app/cells/loginboxcell.rb:

class LoginBoxCell < Cell::Base
  def logged_out
    # lots of display logic
    # ...
    # If a string is returned, it will be shown as the result.
    # However, we want the template logged_out.html.erb to be rendered
    # so we return nil here:
    nil
  end

  def logged_in
    # lots of display logic
    nil
  end

  def super_special_login_button
    "<button #{complex_stuff_here}>Yay!</button>"
  end
end

in /app/cells/loginbox/loggedout.html.erb:

<div class="login_box">
  <!-- here goes lots of HTML and a login form -->

  <!-- cells can include cells -- this makes them SO useful -->
  <% render_cell :login_box, :super_special_login_button %>
</div>

in /app/views/layout/application.html.erb:

<!-- lots of HTML -->
<%= render_cell :login_box, (logged_in? ? :logged_out : :logged_in) %>
<!-- more lots of HTML -->

Wie man sieht, ist in der "herkömmlichen" View nicht mehr oder weniger zu sehen als beim Aufruf eines render :partial-Aufrufes. Jedoch stellt die Cell an dieser Stelle eine in sich abgeschlossene Komponente dar, die ihre eigene Displaylogik kennt und von anderen Bereichen der Applikation abkoppelt. So wird man keine Partials und Helper-Methoden mehr zusammensuchen müssen, wenn man die Loginbox an anderer Stelle (z.B. in einem anderen Projekt?) wiederverwenden möchte.

Ich höre schon leise Schreie aus dem Hintergrund, Wiederverwendung werde maßlos überbewertet. Diese Meinung pflege ich durchaus zu teilen, mehr noch nachdem ich Heute in besagtem Projekt einige Teile der UI nach Cells Refactor'd habe (kennt jemand dafür bitte auch ein deutsches Wort?). Vorläufiges Fazit der Aktion:

  • der Code wird insgesamt nicht sauberer oder aufgeräumter
  • man wundert sich, wie wenig signifikante Wiederholung in einem Rails-Projekt auftritt, die man nicht schon sehr effektiv durch den geschickten Einsatz von Helpermethoden erschlagen kann.
  • im Zusammenspiel mit Rails 2.1 erscheint Cells noch sehr unausgereift. der Aufruf von render_cell aus einem Controller heraus (was im Zusammenspiel mit XmlHttpRequests sehr attraktiv wäre) funktioniert z.B. noch nicht. Auch das Zusammenspiel mit dem Rails-Routing, Gettext-internationalisierung und Helper-Modulen klappt noch nicht reobungslos. Vielleicht sieht das in Rails 2.3 besser aus, was sich in den nächsten Tagen zeigen wird.
  • Eine Oberfläche im Nachhinein in Komponenten zu zerlegen macht wenig Sinn, vielmehr sollte man seine Oberfläche aus Komponenten aufbauen.
  • ein Totschlagargument für dieses Projekt: Cells verwendet eine eigene, modifizierte Version des Rails-Template-Finder-und-Rendering-Systems, genauso wie das verwendete Dynamime-Plugin. Somit können beide Plugins nicht ohne Monkey-Patching miteinander spielen.

Insgesamt sieht dieses Fazit etwas negativ-lastig aus, was jedoch nicht meinen Gesamteindruck widerspiegelt. In Cells steckt durchaus großes Potential, wenn man sich frühzeitig in seiner Applikation dafür entscheidet und seine Oberflächen entsprechend Aufbaut. Gerade wenn die Reise etwa in Richtung Web2.0-Ajax-Rich-UI-$foo geht, kann ich mir einen enormen Gewinn an Modularität vorstellen.

Ich könnte mir vorstellen, dass Cells in Rails 2.3 im Zusammenspiel mit Metal eine interessante und performante Lösung für Ajax-Anwendungen mit viel Client-Server-Kommunikation darstellen könnte. Die Ecke gilt es in den nächsten Wochen zu erkunden.

Weitere Seiten zu Cells:

March 19, 2009

Neue Dynamime-Version

Unter http://github.com/wvk/dynamime ist seit gerade die neue Version 0.9.1 des Dynamime-Railsplugins zu haben, die nun auch mit Rails 2.3 zusammenarbeitet.

Dynamime erweitert die in Rails verwendete Mime-Handling und Template Rendering-Infrstruktur um eine hierarchische Komponente. So können "Unter"-MIME-Typen definiert werden, die z.B. HTML auf speziellen (mobilen) Endgeräten abbilden. Damit ist es möglich, Views für verschiedene Geräte zu definieren, die jeweils (auch nur vereinzelt) spezielle Anforderungen an Inhalte oder Header stellen.

Dynamime verfügt über einen WURFL-Import Rake-Task, der aus WURFL-XML-Dateien Geräteklassen-Hierarchien importieren kann, die als Datengrundlage für die Browsererkennung herangezogen werden können.

Installiert wird Dynamime wie jedes Railsplugin:

ruby script/plugin install git://github.com/wvk/dynamime.git

Für nähere Informationen siehe README.rdoc.

March 31, 2009

Der Rails 2.3-Murks

Hier ein paar Notizen, die heute bei der Migration einer "enterprisey"-Rails-2.1-Anwendung auf Rails 2.3.2 entstanden sind. Vielleicht dienen sie dem einen oder anderen als kleine Hilfe:

  • ActionController::AbstractRequest doesn't exist anymore
  • relative_url_root has moved to ActionController::Base
  • Test Helpers must now ALL inherit from ActiveSupport::TestCase instead of e.g. Test::Unit::TestCase
  • instead of accessing/subclassing ActionController::AbstractRequest in tests etc, use ActionController::Request
  • String#truncate(str, len, omit) is now String#truncate(str, :length => len, :omission => omit)
  • ActionController::AbstractRequest.parse_query_parameters is now Rack::Utils.parse_query
  • to be able to use fixture_file_upload, post, get etc. in (functional) tests, ActionController::TestProcess has to be included in the test case
  • ActionController::TestCase::Assertions has to be included into ActiveSupport::TestCase to enable e.g. assert_redirected_to
  • request.headers['type'] is now empty in tests -- use request.headers['Content-Type'] instead.

Diese Liste wird sicherlich noch erweitert werden, wir sind ja erst am Anfang der Migration...