<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
   <title>/blog/wvk</title>
   <link rel="alternate" type="text/html" href="http://innoq.com/blog/wvk/" />
   <link rel="self" type="application/atom+xml" href="http://innoq.com/blog/wvk/atom.xml" />
   <id>tag:innoq.com,2011:/blog/wvk//26</id>
   <updated>2010-03-06T22:17:06Z</updated>
   <subtitle>$ cat `grep -eli &quot;ruby|rails|apache|linux&quot; /var/brain/wvk` &gt; /blog/wvk 2&gt;&amp;1</subtitle>
   <generator uri="http://www.sixapart.com/movabletype/">Movable Type 3.31</generator>

<entry>
   <title>Wenn MySQL mal gar nicht installieren will...</title>
   <link rel="alternate" type="text/html" href="http://innoq.com/blog/wvk/2010/03/wenn_mysql_mal_gar_nicht_insta.html" />
   <id>tag:innoq.com,2010:/blog/wvk//26.3536</id>
   
   <published>2010-03-06T22:12:11Z</published>
   <updated>2010-03-06T22:17:06Z</updated>
   
   <summary>...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...</summary>
   <author>
      <name>Willem van Kerkhof</name>
      
   </author>
         <category term="Linux" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="Philosophisches und anderer Schmalz" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="en" xml:base="http://innoq.com/blog/wvk/">
      ...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.
      
   </content>
</entry>
<entry>
   <title>Javascript-Bibliothek für den Umgang mit Währungsangaben</title>
   <link rel="alternate" type="text/html" href="http://innoq.com/blog/wvk/2010/02/javascriptbibliothek_fur_den_u.html" />
   <id>tag:innoq.com,2010:/blog/wvk//26.3535</id>
   
   <published>2010-02-20T12:21:47Z</published>
   <updated>2010-02-22T10:24:22Z</updated>
   
   <summary>Lange Zeit fehlte mir eine Javascript-Bibliothek, die mir den Clientseitigen Umgang mit Währungsangaben vereinfacht. Die typischen Use-Cases: Parsen von Angaben wie &quot;25.35 €&quot;, &quot;100.5 $&quot;, &quot;42,42&quot; und Überführen in ein einheitliches internes Format einfache formatierte Ausgabe solcher Werte, mit und...</summary>
   <author>
      <name>Willem van Kerkhof</name>
      
   </author>
         <category term="Coding" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="en" xml:base="http://innoq.com/blog/wvk/">
      <![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>)
]]>
      
   </content>
</entry>
<entry>
   <title>20% Rabatt für die Frozen Rails-Konferenz in Helsinki</title>
   <link rel="alternate" type="text/html" href="http://innoq.com/blog/wvk/2010/02/20_rabatt_fur_die_frozen_rails.html" />
   <id>tag:innoq.com,2010:/blog/wvk//26.3534</id>
   
   <published>2010-02-12T13:48:02Z</published>
   <updated>2010-04-04T13:11:05Z</updated>
   
   <summary>Wenn sonst noch jemand vor hat, die Frozen Rails-Konferenz in Helsinki am 7. Mai 2010 zu besuchen, kann hier 20% Preisnachlass bei der Ticketbuchung absahnen: http://www.amiando.com/frozenrails?discountCode=M3QGQMMR Ich selbst werde zusammen mit Tim vom 6. bis 9. da sein. Spread the...</summary>
   <author>
      <name>Willem van Kerkhof</name>
      
   </author>
   
   
   <content type="html" xml:lang="en" xml:base="http://innoq.com/blog/wvk/">
      <![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!]]>
      
   </content>
</entry>
<entry>
   <title>MyTether für das Palm Pre</title>
   <link rel="alternate" type="text/html" href="http://innoq.com/blog/wvk/2010/01/mytether_fur_das_palm_pre.html" />
   <id>tag:innoq.com,2010:/blog/wvk//26.3532</id>
   
   <published>2010-01-27T18:04:33Z</published>
   <updated>2010-01-27T18:12:07Z</updated>
   
   <summary>Heute installierte ich die neueste Version von MyTether (http://mytether.net/) 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...</summary>
   <author>
      <name>Willem van Kerkhof</name>
      
   </author>
         <category term="Hardware" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="Linux" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="en" xml:base="http://innoq.com/blog/wvk/">
      <![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!]]>
      
   </content>
</entry>
<entry>
   <title>JRuby Errno::ECONNREFUSED: Connection refused</title>
   <link rel="alternate" type="text/html" href="http://innoq.com/blog/wvk/2010/01/jruby_errnoeconnrefused_connec.html" />
   <id>tag:innoq.com,2010:/blog/wvk//26.3531</id>
   
   <published>2010-01-27T10:43:50Z</published>
   <updated>2010-01-27T14:55:28Z</updated>
   
   <summary>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...</summary>
   <author>
      <name>Willem van Kerkhof</name>
      
   </author>
         <category term="Ruby, Rails und &apos;drum und &apos;dran" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="en" xml:base="http://innoq.com/blog/wvk/">
      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.
      
   </content>
</entry>
<entry>
   <title>LaTeX und Regexen</title>
   <link rel="alternate" type="text/html" href="http://innoq.com/blog/wvk/2009/09/latex_und_regexen_1.html" />
   <id>tag:innoq.com,2009:/blog/wvk//26.3527</id>
   
   <published>2009-09-26T19:24:02Z</published>
   <updated>2009-09-27T10:53:30Z</updated>
   
   <summary>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...</summary>
   <author>
      <name>Willem van Kerkhof</name>
      
   </author>
         <category term="Coding" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="en" xml:base="http://innoq.com/blog/wvk/">
      <![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>
]]>
      
   </content>
</entry>
<entry>
   <title>Good old Legacy Systems (tm)</title>
   <link rel="alternate" type="text/html" href="http://innoq.com/blog/wvk/2009/06/good_old_legacy_systems_tm.html" />
   <id>tag:innoq.com,2009:/blog/wvk//26.3525</id>
   
   <published>2009-06-26T21:39:14Z</published>
   <updated>2009-06-26T21:50:10Z</updated>
   
   <summary>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...</summary>
   <author>
      <name>Willem van Kerkhof</name>
      
   </author>
         <category term="Philosophisches und anderer Schmalz" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="en" xml:base="http://innoq.com/blog/wvk/">
      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 ;)
      
   </content>
</entry>
<entry>
   <title>Ruby + Qt4</title>
   <link rel="alternate" type="text/html" href="http://innoq.com/blog/wvk/2009/06/ruby_qt4.html" />
   <id>tag:innoq.com,2009:/blog/wvk//26.3524</id>
   
   <published>2009-06-14T21:51:23Z</published>
   <updated>2009-06-14T22:27:25Z</updated>
   
   <summary>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 Qt4 API-Referenz. Fazit: Sehr cool, die Eleganz von...</summary>
   <author>
      <name>Willem van Kerkhof</name>
      
   </author>
         <category term="Coding" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="Ruby, Rails und &apos;drum und &apos;dran" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="en" xml:base="http://innoq.com/blog/wvk/">
      <![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!]]>
      
   </content>
</entry>
<entry>
   <title>Ruby + Subversion</title>
   <link rel="alternate" type="text/html" href="http://innoq.com/blog/wvk/2009/06/ruby_subversion.html" />
   <id>tag:innoq.com,2009:/blog/wvk//26.3523</id>
   
   <published>2009-06-03T20:50:27Z</published>
   <updated>2009-06-03T20:58:52Z</updated>
   
   <summary>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,...</summary>
   <author>
      <name>Willem van Kerkhof</name>
      
   </author>
         <category term="Ruby, Rails und &apos;drum und &apos;dran" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="en" xml:base="http://innoq.com/blog/wvk/">
      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.
      
   </content>
</entry>
<entry>
   <title>Live von der RailsWayCon Berlin</title>
   <link rel="alternate" type="text/html" href="http://innoq.com/blog/wvk/2009/05/live_von_der_railswaycon_berli.html" />
   <id>tag:innoq.com,2009:/blog/wvk//26.3522</id>
   
   <published>2009-05-26T08:49:44Z</published>
   <updated>2009-05-26T13:04:30Z</updated>
   
   <summary>Nach einem frühen aber entspannten Flug nach Berlin gibt&apos;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: Raum und...</summary>
   <author>
      <name>Willem van Kerkhof</name>
      
   </author>
         <category term="Ruby, Rails und &apos;drum und &apos;dran" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="en" xml:base="http://innoq.com/blog/wvk/">
      <![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!]]>
      
   </content>
</entry>
<entry>
   <title>Neue USV</title>
   <link rel="alternate" type="text/html" href="http://innoq.com/blog/wvk/2009/05/neue_usv.html" />
   <id>tag:innoq.com,2009:/blog/wvk//26.3518</id>
   
   <published>2009-05-15T15:19:32Z</published>
   <updated>2009-05-15T18:40:06Z</updated>
   
   <summary>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...</summary>
   <author>
      <name>Willem van Kerkhof</name>
      
   </author>
         <category term="Hardware" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="en" xml:base="http://innoq.com/blog/wvk/">
      <![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*
]]>
      
   </content>
</entry>
<entry>
   <title>Buttons oder Links?</title>
   <link rel="alternate" type="text/html" href="http://innoq.com/blog/wvk/2009/05/buttons_oder_links.html" />
   <id>tag:innoq.com,2009:/blog/wvk//26.3517</id>
   
   <published>2009-05-07T13:20:30Z</published>
   <updated>2009-06-03T21:11:03Z</updated>
   
   <summary> Delete vs. Delete 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 (&quot;lösche Blogeintrag&quot;,...</summary>
   <author>
      <name>Willem van Kerkhof</name>
      
   </author>
         <category term="Coding" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="Philosophisches und anderer Schmalz" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="Ruby, Rails und &apos;drum und &apos;dran" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="en" xml:base="http://innoq.com/blog/wvk/">
      <![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 ;-))]]>
      
   </content>
</entry>
<entry>
   <title>Petition gegen Stoppschilder im Internet</title>
   <link rel="alternate" type="text/html" href="http://innoq.com/blog/wvk/2009/05/petition_gegen_stoppschilder_i_1.html" />
   <id>tag:innoq.com,2009:/blog/wvk//26.3516</id>
   
   <published>2009-05-05T10:03:54Z</published>
   <updated>2009-05-05T14:26:45Z</updated>
   
   <summary>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,...</summary>
   <author>
      <name>Willem van Kerkhof</name>
      
   </author>
   
   
   <content type="html" xml:lang="en" xml:base="http://innoq.com/blog/wvk/">
      <![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>]]>
      
   </content>
</entry>
<entry>
   <title>Rails I18n heiß diskutiert</title>
   <link rel="alternate" type="text/html" href="http://innoq.com/blog/wvk/2009/04/rails_i18n_heiss_diskutiert.html" />
   <id>tag:innoq.com,2009:/blog/wvk//26.3515</id>
   
   <published>2009-04-27T19:51:09Z</published>
   <updated>2009-04-27T19:59:16Z</updated>
   
   <summary>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...</summary>
   <author>
      <name>Willem van Kerkhof</name>
      
   </author>
         <category term="Design" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="Ruby, Rails und &apos;drum und &apos;dran" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="en" xml:base="http://innoq.com/blog/wvk/">
      <![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!]]>
      
   </content>
</entry>
<entry>
   <title>Der Serverschrank ist da!</title>
   <link rel="alternate" type="text/html" href="http://innoq.com/blog/wvk/2009/04/der_serverschrank_ist_da.html" />
   <id>tag:innoq.com,2009:/blog/wvk//26.3514</id>
   
   <published>2009-04-17T23:30:57Z</published>
   <updated>2009-04-18T00:03:10Z</updated>
   
   <summary>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...</summary>
   <author>
      <name>Willem van Kerkhof</name>
      
   </author>
   
   
   <content type="html" xml:lang="en" xml:base="http://innoq.com/blog/wvk/">
      <![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>]]>
      
   </content>
</entry>

</feed>
