<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
   <channel>
      <title>/blog/wvk</title>
      <link>http://innoq.com/blog/wvk/</link>
      <description>$ cat `grep -eli &quot;ruby|rails|apache|linux&quot; /var/brain/wvk` &gt; /blog/wvk 2&gt;&amp;1</description>
      <language>en</language>
      <copyright>Copyright 2011</copyright>
      <lastBuildDate>Sat, 06 Mar 2010 23:12:11 +0100</lastBuildDate>
      <generator>http://www.sixapart.com/movabletype/</generator>
      <docs>http://blogs.law.harvard.edu/tech/rss</docs> 

            <item>
         <title>Wenn MySQL mal gar nicht installieren will...</title>
         <description>...oder Apache nicht auf localhost horchen möchte...
...oder Ejabberd sich nicht nach localhost connecten mag...
...oder Dienst XYZ nicht auf localhost ... will...

dann schau mal nach ob das loopback-device überhaupt &quot;up&quot; ist!

und wenn nicht: `ifup lo`

und dann mal nachsehen ob in /etc/network/interfaces vielleicht aus Versehen die Zeile mit `auto lo` auskommentiert ist.

Notitz an mich selbst: Netzwerkdienste setzen eine korrekte Netzwerkkonfiguration voraus. Wer diese Einstellungen zuerst überprüft, erspart sich womöglich einen Arbeitstag mit sinnloser Frustration.</description>
         <link>http://innoq.com/blog/wvk/2010/03/wenn_mysql_mal_gar_nicht_insta.html</link>
         <guid>http://innoq.com/blog/wvk/2010/03/wenn_mysql_mal_gar_nicht_insta.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">Linux</category>
                  <category domain="http://www.sixapart.com/ns/types#category">Philosophisches und anderer Schmalz</category>
        
        
         <pubDate>Sat, 06 Mar 2010 23:12:11 +0100</pubDate>
      </item>
            <item>
         <title>Javascript-Bibliothek für den Umgang mit Währungsangaben</title>
         <description><![CDATA[Lange Zeit fehlte mir eine Javascript-Bibliothek, die mir den Clientseitigen Umgang mit Währungsangaben vereinfacht. Die typischen Use-Cases:

  * Parsen von Angaben wie "25.35 €", "100.5 $", "42,42" und Überführen in ein einheitliches internes Format
  * einfache formatierte Ausgabe solcher Werte, mit und ohne Währungssymbol
  * für die ganzen deutschsprachigen Komma-Fetischisten: Transparentes Handling von Dezimal-"," \*graus\*

Aus dieser Not ward' currency.js geboren, eine kleine auf prototype.js aufbauende (und also davon abhängende) Lib. 

Anwendungsbeispiele:
---

Input-Parsing:

    var value_1 = $pM('42.23');
    var value_2 = $pM($F('my_input'));

Formatierte Ausgabe mit Währungssymbol:

    alert(value_1.to_s());

Formatierte Ausgabe ohne Währungssymbol:

    alert(value_1.to_val());

Für Berechnungen muss leider die interne cent-Repräsentation verwendet werden, da Javascript das Überladen arithmetischer Operatoren leider nicht erlaubt:

    var sum = $M(value_1.cents + value_2.cents)

Für weitere Dokumentation siehe (<a href="http://github.com/wvk/currency.js">currency.js auf Github</a>)
]]></description>
         <link>http://innoq.com/blog/wvk/2010/02/javascriptbibliothek_fur_den_u.html</link>
         <guid>http://innoq.com/blog/wvk/2010/02/javascriptbibliothek_fur_den_u.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">Coding</category>
        
        
         <pubDate>Sat, 20 Feb 2010 13:21:47 +0100</pubDate>
      </item>
            <item>
         <title>20% Rabatt für die Frozen Rails-Konferenz in Helsinki</title>
         <description><![CDATA[Wenn sonst noch jemand vor hat, die <a href="http://frozenrails.eu/">Frozen Rails</a>-Konferenz in Helsinki am 7. Mai 2010 zu besuchen, kann hier 20% Preisnachlass bei der Ticketbuchung absahnen: <a href="http://www.amiando.com/frozenrails?discountCode=M3QGQMMR">http://www.amiando.com/frozenrails?discountCode=M3QGQMMR</a>

Ich selbst werde zusammen mit <a href="http://www.innoq.com/blog/tk">Tim</a> vom 6. bis 9. da sein.

Spread the word!]]></description>
         <link>http://innoq.com/blog/wvk/2010/02/20_rabatt_fur_die_frozen_rails.html</link>
         <guid>http://innoq.com/blog/wvk/2010/02/20_rabatt_fur_die_frozen_rails.html</guid>
        
        
         <pubDate>Fri, 12 Feb 2010 14:48:02 +0100</pubDate>
      </item>
            <item>
         <title>MyTether für das Palm Pre</title>
         <description><![CDATA[Heute installierte ich die neueste Version von MyTether (<a href="http://mytether.net/">http://mytether.net/</a>) auf dem Palm Pre und siehe da, diesmal funktioniert die Anwendung wie sie soll. Nun sitze ich im RE4 von Düsseldorf nach Witten und habe endlich vernünftigen Internetzugang auf dem Notebook über das Pre -- Wahlweise via USB oder WiFi, bevorzugt natürlich ersteres.

Die Installation ist beliebig einfach:

    quantino:~# novaterm
    quarkino:/# wget -qO- http://mytether.net/install.php | /bin/sh

Um Tethering über USB zu verwenden, muss USBnet aktiviert sein. MyTether kann dies über einen Schiebeschalter, aber wenn man schonmal auf der Konsole ist, kann man das auch gleich dort erledigen:

    quarkino / # usbnet enable
    Usbnet will be enabled after reboot. Type "reboot" now.
    quarkino / # reboot

Und lossurfen!]]></description>
         <link>http://innoq.com/blog/wvk/2010/01/mytether_fur_das_palm_pre.html</link>
         <guid>http://innoq.com/blog/wvk/2010/01/mytether_fur_das_palm_pre.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">Hardware</category>
                  <category domain="http://www.sixapart.com/ns/types#category">Linux</category>
        
        
         <pubDate>Wed, 27 Jan 2010 19:04:33 +0100</pubDate>
      </item>
            <item>
         <title>JRuby Errno::ECONNREFUSED: Connection refused</title>
         <description>Nun endlich war es so weit: ich versuchte es auch einmal mit JRuby. Beim Versuch, erste Gems zu installieren, bekam ich aber den hier:

    quantino:~# jruby -S gem update --system
    Updating RubyGems
    ERROR:  http://gems.rubyforge.org/ does not appear to be a repository
    ERROR:  While executing gem ... (Gem::RemoteFetcher::FetchError)
      Errno::ECONNREFUSED: Connection refused - Connection refused (http://gems.rubyforge.org/yaml)

Ich ließ es links liegen und wandte mich anderen Dingen zu. Später am selben Tag versuchte ich das WebOS-Docor-JAR zum Verarzten meines Palm Pre zu starten, welches erst einmal eine Verbindung ins Welt Weite Netz suchte -- Verbindung fehlgeschlagen.

Da musste es einen Zusammenhang geben! Und den gibt es: es sind *nicht* die Proxy-Einstellungen, wie lange vermutet, sondern seit einem nicht besonders lange zurück liegenden System-Upgrade (Debian unstable/experimental) muss folgender Parameter der JVM mit übergeben werden, sofern man sein System nicht für IPv6 eingerichtet hat:

    -Djava.net.preferIPv4Stack=true

JRuby reicht Kommandozeilen-Parameter hinter -J an die JVM weiter, aus obigem Kommando wird demnach:

    quantino:~# jruby -J-Djava.net.preferIPv4Stack=true -S gem update --system
    Updating RubyGems
    Nothing to update

Um die -J Option nicht ständig angeben zu müssen, tut es auch ein

    export JAVA_OPTS=&quot;$JAVA_OPTS -Djava.net.preferIPv4Stack=true&quot;

in ~/.bashc

Und damit läuft die Sache dann auch.</description>
         <link>http://innoq.com/blog/wvk/2010/01/jruby_errnoeconnrefused_connec.html</link>
         <guid>http://innoq.com/blog/wvk/2010/01/jruby_errnoeconnrefused_connec.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">Ruby, Rails und &apos;drum und &apos;dran</category>
        
        
         <pubDate>Wed, 27 Jan 2010 11:43:50 +0100</pubDate>
      </item>
            <item>
         <title>LaTeX und Regexen</title>
         <description><![CDATA[Bei der Vorbereitung zu meinem nächsten Vortrag zum Thema Regular Expressions musste ich schmerzerfüllt feststellen, dass LaTeX beim Versuch, Regexen vernünftig zu formatieren, ein ganz schön widerwärtiges Biest sein kann. Um diese Aufgabe etwas zu erleichtern und außerdem den Aufbau der Regexen dem Publikum etwas strukturierter vorstellen zu können, bediene ich mich nun folgender LaTeX-Kommandos:

    \definecolor{White}{rgb}{1,1,1}
    \definecolor{Grey}{rgb}{0.5,0.5,0.5}
    \definecolor{Brown}{rgb}{0.3,0.3,0}
    \definecolor{Red}{rgb}{0.7,0,0}
    \definecolor{Green}{rgb}{0,0.7,0}
    \definecolor{Darkblue}{rgb}{0,0,0.5}
    \definecolor{Violet}{rgb}{0.8,0,0.9}
    \definecolor{Orange}{rgb}{0.8,0.4,0}

    \newcommand{\RegEx}[1]{/#1/}
    \newcommand{\LargeRegEx}[1]{{\large /#1/}}
    \newcommand{\Or}{\textcolor{Brown}{\textbar}}
    \newcommand{\Kleene}{\textcolor{Violet}{*}}
    \newcommand{\OneOrMore}{\textcolor{Violet}{+}}
    \newcommand{\ZeroOrOne}{\textcolor{Violet}{?}}
    \newcommand{\Begin}{\textcolor{Brown}{\^{}}}
    \newcommand{\End}{\textcolor{Brown}{\textdollar}}
    \newcommand{\MLBegin}{\textcolor{Brown}{\Escape{A}}}
    \newcommand{\MLEnd}{\textcolor{Brown}{\Escape{Z}}}
    \newcommand{\Escape}[1]{\textbackslash{}#1}
    \newcommand{\Wordchar}{\textcolor{Darkblue}{\Escape{w}}}
    \newcommand{\Space}{\textcolor{Darkblue}{\Escape{s}}}
    \newcommand{\Nonwordchar}{\textcolor{Darkblue}{\Escape{W}}}
    \newcommand{\Digit}{\textcolor{Darkblue}{\Escape{d}}}
    \newcommand{\Match}[1]{$($#1$)$}
    \newcommand{\Matches}[1]{\textcolor{Darkblue}{\textbackslash{}#1}}
    \newcommand{\Repeat}[1]{\textcolor{Violet}{$\{$#1$\}$}}
    \newcommand{\AnyOf}[1]{\textcolor{Green}{$[$#1$]$}}
    \newcommand{\NoneOf}[1]{\textcolor{Red}{$[$\^{}#1$]$}}
    \newcommand{\AnyNumberOf}[1]{#1\Kleene}
    \newcommand{\OneOrMoreOf}[1]{#1\OneOrMore}
    \newcommand{\ZeroOrOneOf}[1]{#1\ZeroOrOne}
    \newcommand{\Modifier}[1]{\textcolor{Orange}{#1}}

Diese Anweisungen müssen for dem `\begin{document}`-Stanza stehen, damit man innerhalb des Dokuments dann z.B. folgende Regex inklusive Syntaxhighlighting darstellen kann:

    /^[\w\d._%+-]+@[\w\d.-]+\.\w{2,4}$/

wird in LaTeX zu:

    \RegEx{\Begin\OneOrMoreOf{\AnyOf{\Wordchar\Digit.\\_\%+-}}@\OneOrMoreOf{\AnyOf{\Wordchar\Digit.-}}\Escape{.}\Wordchar\Repeat{2,4}\End}

Gerendert wird das dann in etwa so:

<img alt="regex1.png" src="http://innoq.com/blog/wvk/regex1.png" width="374" height="27" />

Bei der Darstellung der Sonderzeichen in LaTeX hat mir dieses Dokument sehr geholfen: <a href="http://www.hci-matters.com/blog/2008/04/23/everybody-loves-regular-expressions/">Everybody Loves Regular Expressions!</a>
]]></description>
         <link>http://innoq.com/blog/wvk/2009/09/latex_und_regexen_1.html</link>
         <guid>http://innoq.com/blog/wvk/2009/09/latex_und_regexen_1.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">Coding</category>
        
        
         <pubDate>Sat, 26 Sep 2009 20:24:02 +0100</pubDate>
      </item>
            <item>
         <title>Good old Legacy Systems (tm)</title>
         <description>Da will man einfach nur eine Wegbeschreibung ausdrucken. Doch da stellt man fest, dass der Drucker ja nur einen Parallelport hat, das Notebook aber nicht. Zu neu. Der Arbeitsrechner... dito, zu neu. Aber ganz unten im Schrank steht ja noch ein alter Rechner, der hat sowas. Ist ja auch eigentlich der Printserver. Aber dieser wiederum hat ein Netzwerkproblem, will heißen: Hänger und Segfaults bei Netzwerkoperationen, keine Ahnung warum. Kernelupdate? ohne Netzwerk schwierig. Live-CD? Gute Idee, hätte die Kiste denn ein Laufwerk eingebaut -- lang lebe LVM über 5 eingebaute Festplatten, einfach eine herausnehmen ist eher als Experiment anzusehen. USB-Stick + Live-System + .....? Ach vergiss es einfach.

Good old Legacy System (tm): Papier und Stift. Funktioniert immer. Wer braucht schon Mainframes, SOA und RoR ;)</description>
         <link>http://innoq.com/blog/wvk/2009/06/good_old_legacy_systems_tm.html</link>
         <guid>http://innoq.com/blog/wvk/2009/06/good_old_legacy_systems_tm.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">Philosophisches und anderer Schmalz</category>
        
        
         <pubDate>Fri, 26 Jun 2009 22:39:14 +0100</pubDate>
      </item>
            <item>
         <title>Ruby + Qt4</title>
         <description><![CDATA[Ich habe heute wieder einmal ein Wenig mit Qt4 gespielt, diesmal jedoch nicht mehr mit C++, sondern Ruby. Die Voraussetzungen dazu beschränken sich auf die zu installierende Bibliothek libqt4-ruby und natürlich die <a href="http://doc.trolltech.com/4.3">Qt4 API-Referenz</a>. Fazit: Sehr cool, die Eleganz von Ruby gepaart mit der mächtigen Qt-Bibliothek macht richtig Lust auf schöne Multiplatform-Desktop-Applikationen. 

Die von QtRuby (`libqt4-ruby`) zur Verfügung gestellten Qt-Bindings orientieren sich zu sagen wir mal 98% an den Original-APIs, mit der Ausnahme dass das "Q" in denn C++-Klasssennamen durch ein "Qt::"-Prefix ersetz wurde. Was ich allerdings als weniger hübsch empfinde, ist die konsequente Weiterverwendung von `camelCase` auch bei Methodennamen -- es steht keine Rubyesquere `under_score`-Variante zur Verfügung.

Anders sieht das aus bei den Qt-/KDE-Ruby-Bindings in der <a href="http://techbase.kde.org/Development/Languages/Ruby">Korundum-Bibliothek</a>. `korundum4` ist eine m.E. etwas weiter fortgeschrittene Qt-Schnittstelle für Ruby, die zusätzlich die umfangreichen KDE-Erweiterungen der Qt-Bibliotheken zur Verfügung stellt. Außerdem wird Camelcase und Underscore-Schreibweise bei allen Methodennamen gleichermaßen unterstützt und "Setter" werden wie gewohnt über "value = " (und zusätzlich über "setValue()") angeboten.

Während QtRuby konsequent auf Ruby-Datentypen setzt, verwendet Korundum (noch) eigene Wrapper-Datentypen an Stellen, wo die C++ API einen Pointer erwartet. So würde ein Aufruf von `Qt::FontDialog.getFont(my_boolean, Qt::Font.new("Helvetica", 10), self)` in Korundum so aussehen: `Qt::FontDialog.getFont(Qt::Boolean.new, Qt::Font.new("Helvetica", 10), self)`. Dies soll sich laut Dokumentation aber in Zukunft ändern. Bis auf diese Dinge lassen sich Programme, die für QtRuby geschrieben wurden, auch mit Korundum weitestgehend ohne Änderungen auch mit Korundum betreiben.

Ein paar hilfreiche HowTos:

  * Einführung mit QtRuby: <a href="http://developer.kde.org/language-bindings/ruby/tutorial/tutorial.html">http://developer.kde.org/language-bindings/ruby/tutorial/tutorial.html</a>
  * Eigene Widgets mit QtRuby oder Korundum: <a href="http://usefulfor.com/ruby/2007/06/04/ruby-qt-custom-widget-example/">http://usefulfor.com/ruby/2007/06/04/ruby-qt-custom-widget-example/</a>
  * Qt-Anwendungen mit Ruby und .ui- (Qt Designer-) Dateien: <a href="http://www.arachnoid.com/ruby/RubyGUIProject/index.html">http://www.arachnoid.com/ruby/RubyGUIProject/index.html</a>

Happy Hacking!]]></description>
         <link>http://innoq.com/blog/wvk/2009/06/ruby_qt4.html</link>
         <guid>http://innoq.com/blog/wvk/2009/06/ruby_qt4.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">Coding</category>
                  <category domain="http://www.sixapart.com/ns/types#category">Ruby, Rails und &apos;drum und &apos;dran</category>
        
        
         <pubDate>Sun, 14 Jun 2009 22:51:23 +0100</pubDate>
      </item>
            <item>
         <title>Ruby + Subversion</title>
         <description>Wer sich wie ich dieses Wochenende im großen weiten WWW vergebens auf die Suche nach Dokumentation für die äußerst praktischen Ruby-Subversion-Bindings (libruby-svn) macht, dem sei an dieser Stelle gesagt: die Bibliothekt *ist nicht dokumentiert*.

Das Einzige, was mir weitergeholfen hat, sind folgende Blogs:

 * http://icepick.info/2008/09/25/using-rubys-svn-bindings/ (das einfachste beispiel)
 * http://www.oneofthewolves.com/2007/03/06/ruby-subversion-bindings-finally-some-documentation/ (schöne Einführung)
 * http://www.oneofthewolves.com/2007/12/22/ruby-subversion-bindings-better-documentation/ (Code und Unit Tests)

Das und ein Wenig Subversion-Anwenderwissen reicht bei Weitem aus, um z.B. Datenbankeinträge mit einem Subversion-Repository zu synchronisieren.</description>
         <link>http://innoq.com/blog/wvk/2009/06/ruby_subversion.html</link>
         <guid>http://innoq.com/blog/wvk/2009/06/ruby_subversion.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">Ruby, Rails und &apos;drum und &apos;dran</category>
        
        
         <pubDate>Wed, 03 Jun 2009 21:50:27 +0100</pubDate>
      </item>
            <item>
         <title>Live von der RailsWayCon Berlin</title>
         <description><![CDATA[Nach einem frühen aber entspannten Flug nach Berlin gibt's jetzt im Laufe des Tages immer mal das eine oder andere Bild von der RailsWayCon im BCC am Alexanderplatz. Natürlich ist die innoQ mit einigen Rails-Spezialisten vor Ort vertreten:

<a href="http://innoq.com/blog/wvk/webinale.html" onclick="window.open('http://innoq.com/blog/wvk/webinale.html','popup','width=599,height=398,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://innoq.com/blog/wvk/webinale-thumb.jpeg" width="300" height="199" alt="" /></a>

Raum und Zeit für Diskussionen mit den "üblichen Verdächtigen":

<a href="http://innoq.com/blog/wvk/diskussionen1.html" onclick="window.open('http://innoq.com/blog/wvk/diskussionen1.html','popup','width=600,height=398,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://innoq.com/blog/wvk/diskussionen-thumb.jpeg" width="300" height="199" alt="" /></a>

Einen sowohl abgedrehten als auch außerordentlich kompetenten Vortrag über Ola Binis neueste Programmiersprachenkreation namens "Ioke" gab's vom Meister persönlich:

<a href="http://innoq.com/blog/wvk/olabini.html" onclick="window.open('http://innoq.com/blog/wvk/olabini.html','popup','width=600,height=398,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://innoq.com/blog/wvk/olabini-thumb.jpeg" width="300" height="199" alt="" /></a>


Mehr gibt's später!]]></description>
         <link>http://innoq.com/blog/wvk/2009/05/live_von_der_railswaycon_berli.html</link>
         <guid>http://innoq.com/blog/wvk/2009/05/live_von_der_railswaycon_berli.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">Ruby, Rails und &apos;drum und &apos;dran</category>
        
        
         <pubDate>Tue, 26 May 2009 09:49:44 +0100</pubDate>
      </item>
            <item>
         <title>Neue USV</title>
         <description><![CDATA[Langsam füllt sich der Serverschrank: Heute um 11:20 MESZ wurde die vorgestern bestellte neue USV geliefert. Es handelt sich dabei um ein 2U-1500VA-Modell von APC (SC1500I) mit RS232-Anschluss zur Überwachung, 4 Last-Ausgängen sowie je einen RJ11- und RJ42-Ein- und Ausgang für Netzwerk-Überspannungsschutz.

Wider meiner schlimmsten Befürchung ist der eingebaute Lüfter nur dann in Betrieb, wenn die Kiste wirklich warm wird -- bislang also noch nicht. Mit der vierfachen Kapazität und dreifachen Leistung der bisherigen USV können nun endlich alle angeschlossenen Rechner gleichzeitig betrieben werden, die Überbrückungszeit dürfte dabei rund 30 Minuten betragen.

Das beigelegte Zubehör kann sich sehen lassen: neben zweier Anschlusskabel lag ein RS232/USB-Konverter, Montagewinkel für alle möglichen Rackmonunt-Variationen, Käfigmuttern und (unerwartet und sehr sympathisch) ein loser C14-Stecker. Die mitgelieferte Software ist zwar nur für SuSE und RH- Linuxe ausgelegt, aber dafür hat Debian ja seinen eigenen apcupsd.

<a href="http://innoq.com/blog/wvk/DSC_2810-m.html" onclick="window.open('http://innoq.com/blog/wvk/DSC_2810-m.html','popup','width=800,height=548,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://innoq.com/blog/wvk/DSC_2810-m-thumb.jpg" width="300" height="205" alt="" /></a>

<a href="http://innoq.com/blog/wvk/DSC_2820-m.html" onclick="window.open('http://innoq.com/blog/wvk/DSC_2820-m.html','popup','width=531,height=800,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://innoq.com/blog/wvk/DSC_2820-m-thumb.jpg" width="199" height="300" alt="" /></a>

So, jetzt dreht mir den Saft ab! ;)


**Nachtrag**: Wie zu erwarten war, funktionierte die standard-Konfiguration für apcupsd nicht auf Anhieb, was auf den USB-nach-RS232-Konverter zurückzuführen war.

Hier meine Einstellungen, die den erhofften Erfolg brachten:

    modprobe usbserial pl2303

in /etc/apcupsd/apcupsd.conf:

    UPSCABLE smart # NICHT usb
    UPSTYPE apcsmart # ebenfalls NICHT usb
    DEVICE /dev/ttyUSB0

Nach einem Neustart von apcupsd erschien keine Fehlermeldung mehr und beim Ziehen des Netzsteckers erschien ganz selbstverständlich ein 'Power Failure' und 'Running on UPS Batteries' in /var/log/apcupsd.events. Damit einher gehend wurde eine entsprechende Broadcast-Nachricht übers Netz geschickt.

*/me wartet nun auf ein schweres Unwetter*
]]></description>
         <link>http://innoq.com/blog/wvk/2009/05/neue_usv.html</link>
         <guid>http://innoq.com/blog/wvk/2009/05/neue_usv.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">Hardware</category>
        
        
         <pubDate>Fri, 15 May 2009 16:19:32 +0100</pubDate>
      </item>
            <item>
         <title>Buttons oder Links?</title>
         <description><![CDATA[<div style="background: #ccc; padding: 1.5em; margin: 0 .5em; text-align: center;">
  <button onclick="alert('42'); return false;" style="font-size: 2em; margin: .3em">Delete</button>
  vs. 
  <a  style="font-size: 2em; margin: .3em" href="javascript:alert('42'); return false;">Delete</a>
</div>

Wenn wir alle vorgeben, das Prinzip von REST verstanden zu haben, warum taucht dann immer wieder die Frage auf, warum (besonders zu Zeiten von Javascript, Ajax und Web 2.0) Links als Verweise auf Aktionen ("lösche Blogeintrag", "sende Formular ab"...) so schlimm seien.

Dabei ist es doch nur eine Hilfe für den Benutzer UND den Entwickler:

  * *Links* kann man (noch!) ohne Gefahr zu laufen, unerwünschte Nebeneffekte zu erzeugen, folgen. In REST-Sprech: Links verweisen auf Repräsentationen von Ressourcen.
  * *Buttons* verweisen auf Aktionen, die per definitionem (?) Nebeneffekte aufweisen. In REST-Sprech: Ihre Betätigung leitet Veränderungen an Ressourcen ein.

Will ich einem Benutzer also zeigen, was er sich alles ansehen kann, so biete ich ihm eine Liste von Links an. Will ich ihm hingegen die Möglichkeiten zur Veränderung der dargestellten Ressource(n) anbieten, so biete ich ihm eine Sammlung an Buttons.

Dieses Prinzip konsequent angewendet nimmt dem Entwickler m.E. sowohl im UI-Design als auch bei der Umsetzung einer RESTful Webanwendung (Denk-)Arbeit ab. Dem Benutzer der Anwendung macht es die Interpretation der UI ebenfalls erheblich leichter.

Was die Implementierung selber angeht, also ob Buttons nun Formulare abschicken oder ob die Aktionen via JavaScript eingeleitet werden, ist bei dieser Betrachtung erst einmal unerheblich. Ersteres ist der Accessibility von Webanweniungen natürlich bedeutend zuträglicher, zweiteres ist für "flashy" Web 2.0-Anwendungen wohl das Mittel der Wahl. Den Königsweg zu beschreiten und die Formulare per "unobtrusive Javascript" nach dem Laden der HTML-Seite zu verändern, um sie durch Ajax-getriebenes Verhalten zu ersetzen, ist aber auch kein bedeutender Mehraufwand (der sich aber auszahlt).

Leider wird o.g. Verhalten durch gewisse Standardmethoden in Ruby on Rails nicht unbedingt gefördert: `link_to_remote` setzt per default einen POST-Request ab, `link_to_function` existiert und `button_to_remote` existiert erst seit Rails 2.0 oder 2.1.

Sieht das jemand anders? Was sind dafür die Gründe? Diskussionsbeiträge sind willkommen!

Anmerkungen zu Michaels Kommentar (Danke dafür!): Ich gebe dier zu 100% recht, dass einen die richtige technische Lösung nicht davon entbindet, das Interface-Design derart zu gestalten, dass der Benutzer klar sieht wo er ohne Nachzudenken hinklicken darf und wo Vorsicht angebracht ist. Jedoch führt meines Erachtens die o.g. Regel, konsequent umgesetzt, automatisch zu besserem Interfacedesign: einfach nur deswegen, weil man eine einfache Regel umsetzt, an die sich der Benutzer gewöhnen kann. Siehe dazu auch die immer wieder geführte Diskussion, ob in einem Dialog der mit einem [OK] und einem [Abbrechen]-Button [OK] links oder rechts von [Abbrechen] angebracht werden sollte: es spielt keine Rolle, Hauptsache man wendet ein einziges Schema konsequent an.

Ich behaupte jedenfalls, dass es keinem Entwickler weh tut, konsequent Buttons für Aktionen und Links für "Ansichten" zu verwenden. Spätestens seit CSS 2.0 lassen sich beide ohnehin beliebig stylen. Und dann gibt's ja noch die Textbrowser... (nein, die sind beileibe nicht tot ;-))]]></description>
         <link>http://innoq.com/blog/wvk/2009/05/buttons_oder_links.html</link>
         <guid>http://innoq.com/blog/wvk/2009/05/buttons_oder_links.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">Coding</category>
                  <category domain="http://www.sixapart.com/ns/types#category">Philosophisches und anderer Schmalz</category>
                  <category domain="http://www.sixapart.com/ns/types#category">Ruby, Rails und &apos;drum und &apos;dran</category>
        
        
         <pubDate>Thu, 07 May 2009 14:20:30 +0100</pubDate>
      </item>
            <item>
         <title>Petition gegen Stoppschilder im Internet</title>
         <description><![CDATA[Da surft man unschuldig im WWW und jede drite Seite, die man besucht, wurd durch ein großes STOPP-Schild gesperrt. Die IP-Adresse und diverse weitere Daten landen automatisch auf einer schwarzen Liste beim BKA und man muss im ständigen glauben leben, als Kinderschänder oder politischer Störer durchzugehen. Fiktion? Bald nicht mehr. "Da oben" im Bundestag überlegt man sich eine gesetzliche Grundlage für solche Zensurmaßnahmen.

Jeder sei hiermit aufgerufen, die entsprechenden Petition hiergegen mitzuzeichnen: <a href="https://epetitionen.bundestag.de/index.php?action=petition;sa=details;petition=3860">https://epetitionen.bundestag.de/index.php?action=petition;sa=details;petition=3860</a>.

Die eigene Freiheit wird es einem danken.

Nachtrag: man sieht wie kompetend die Onlineplattform des Bundestags an der Stelle implementiert ist: bei der <irony>unglaublichen Zahl</irony> von 2 Zeichnungen pro Sekunde arbeiten die Server am Anschlag, so dass noch nicht einmal Captchas angezeigt werden. Zwei Reloads waren nötig um mich anmelden zu können:
<a href="http://innoq.com/blog/wvk/visuelle-verifizierung-epetition.html" onclick="window.open('http://innoq.com/blog/wvk/visuelle-verifizierung-epetition.html','popup','width=1082,height=349,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://innoq.com/blog/wvk/visuelle-verifizierung-epetition-thumb.png" width="300" height="96" alt="" /></a>]]></description>
         <link>http://innoq.com/blog/wvk/2009/05/petition_gegen_stoppschilder_i_1.html</link>
         <guid>http://innoq.com/blog/wvk/2009/05/petition_gegen_stoppschilder_i_1.html</guid>
        
        
         <pubDate>Tue, 05 May 2009 11:03:54 +0100</pubDate>
      </item>
            <item>
         <title>Rails I18n heiß diskutiert</title>
         <description><![CDATA[Die halbherzig implementierte I18n-API des Rails 2.3-Frameworks bedarf dringend einer grundlegenden Überarbeitung, wenn Rails es einmal ernsthaft in Großunternehmen schaffen soll. Ich hoffe, dass am Ende die Vernunft siegen wird und Gettext es in den Rails-Kern schafft. Ein Versuch der Evangelisierung und eine angeregte Debatte zu dem Thema findet zur Zeit auf der <a href="http://groups.google.de:80/group/rubyonrails-core/browse_thread/thread/e9e219ff318fa6e7">Rails Core-Googlegroup</a> statt. Kommentare und Einsichten sind willkommen!]]></description>
         <link>http://innoq.com/blog/wvk/2009/04/rails_i18n_heiss_diskutiert.html</link>
         <guid>http://innoq.com/blog/wvk/2009/04/rails_i18n_heiss_diskutiert.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">Design</category>
                  <category domain="http://www.sixapart.com/ns/types#category">Ruby, Rails und &apos;drum und &apos;dran</category>
        
        
         <pubDate>Mon, 27 Apr 2009 20:51:09 +0100</pubDate>
      </item>
            <item>
         <title>Der Serverschrank ist da!</title>
         <description><![CDATA[Nach längerem Gehabe mit der Spedition Maier in Hagen (\*hmpf\*) ist er nun endlich angekommen und aufgebaut: der lange ersehnte Rittal-Serverschrank! Mit einem Liefergewicht von 75 kg inklusive Palette frage ich mich zwar, wie das Paket es bis zur ersten Zwischenetage im Treppenhaus geschafft hat, aber solcherlei Fragen sollte man besser nicht stellen.

Aufgebaut umfasst das 21U-Gehäuse jedenfalls 700x700x1025mm<sup>3</sup> und bietet eine abschließbare Fronttür sowie zwei abnehmmare Seitenwände. Ich bin begeistert von der Fertigungsqualität, die Montage konnte komplett ohne Werkzeug erfolgen und dauerte keine 20 Minuten.

Natürlich lagen keine Käfigmuttern bei, ebenso muss ich mich noch um Geräuschdämm-Matten kümmern. Die Server und Switche konnten heute nach Lieferung der Käfigmuttern aber schon erfolgen, wie die Bilder bezeugen. Die nächste geplante Anschaffung ist nun ein KVM-Switch und eine 1.5kVA-USV, da 500VA leider nicht mehr ausreichen, um beide Rechner und die Switche zu betreiben.

<a href="http://innoq.com/blog/wvk/DSC_2285-m.html" onclick="window.open('http://innoq.com/blog/wvk/DSC_2285-m.html','popup','width=643,height=840,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://innoq.com/blog/wvk/DSC_2285-m-thumb.jpeg" width="300" height="391" alt="" /></a>

<a href="http://innoq.com/blog/wvk/DSC_2287-m.html" onclick="window.open('http://innoq.com/blog/wvk/DSC_2287-m.html','popup','width=579,height=797,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://innoq.com/blog/wvk/DSC_2287-m-thumb.jpeg" width="300" height="412" alt="" /></a>]]></description>
         <link>http://innoq.com/blog/wvk/2009/04/der_serverschrank_ist_da.html</link>
         <guid>http://innoq.com/blog/wvk/2009/04/der_serverschrank_ist_da.html</guid>
        
        
         <pubDate>Sat, 18 Apr 2009 00:30:57 +0100</pubDate>
      </item>
      
   </channel>
</rss>
