Rrrrrrrrrrhhh!

Manchmal wird man Zeuge bizarrer Schauspiele. Das bemerkt man zunächst nicht. Hinterher wird aber klar, daß was passierte so grell überzeichnet ist, als käme es direkt aus einem Comic oder von Al Djasira. Sitz ich in der Bahn heute morgen kommt ein Typ rein mit einem etwas zerfledderten Kampfhund? an kurzer Leine. Ich kann die Sorten nicht auseinanderhalten aber Typ breiter Rücken, kahler Schädel, kurze Beine. Nicht nur der Hund, sondern auch der Kerl mit dem Hund. Nun war die Bahn nicht gerade leer aber um diesen Herrn bildete sich gleich ein unsichbarer Kreis. Keiner wollte sich dazusetzen, schon allein weil der Hund ein Aroma ausstieß, als läge sein letzter Kontakt mit Wasser bis zum Welpenalter zurück. Hinzu kam ein unaufhörlicher Strom von Anweisungen oder eher Verwünschungen an den Hund, die dieser größtenteils geflissentlich ignorierte und die Umsitzenden mit traurigen Augen musterte. "eh, Platz jetzt, schpresch ich schinesisch oder was? .." Nicht gerade vertrauenerweckend. Ich mußte ihn dann auf dem Weg nach draußen überklettern und meine Vision eines abgefetzten Beins wurde fast Wirklichkeit.. aber er hatte mich nur angeleckt.

Remoting für Runaways

Ein jeder, der sich noch vage an Dinge wie Corba erinnern kann weiß, welch nette Idee hinter verteilten Objekten steckt: Ein Objekt wird als verteilt gekennzeichnet und wenn es mit einem geeigneten Parameter erzeugt wird, entsteht es auf einem anderen Rechner. Für die Anwendung sieht es aber wie ein lokales Objekt aus, auf das ganz normal zugegriffen werden kann. Hört sich toll an, führt in der Praxis jedoch zu allerlei Problemen, da die Zugriffe von den Launen des Netzwerks abhängig sind. Unter .NET wurde das Rad nochmal unter der Bezeichnung remoting neu erfunden.

Der Zugriff auf ein entferntes Objekt ist einfach, ein paar Zeilen genügen:

string url = string.Format("tcp://{0}:40506/LPT_IO_Server",

                    this.address);

this.remoteObj = (BaseRemoteObject)

   Activator.GetObject( typeof(BaseRemoteObject), url);

Aber jetzt kommt das dicke Ende: Wenn der Server unten ist, bleibt die Anwendung beim Zugriff auf eines der Felder einfach hängen. Es gibt keine Möglichkeit, einen connection timeout einzustellen. Es dauert dann etwa 45 Sekunden, bevor eine SocketException anzeigt, daß da was schiefging. Nicht gut für eine Anwendung mit Benutzerinteraktion. Man kann sich allerdings "dreckig" behelfen, indem man den Zugriff in einen eigenen Thread packt:

Exception setException = null;

System.Threading.Thread setThread = new System.Threading.Thread( delegate()

{

    try

    {

        this.remoteObj.setValue(value);

    }

    catch (Exception ex)

    {

        setException = ex;

    }

});

setThread.Start();

if (setThread.Join((int)5000))

{

    if (setException == null)

    {

        // everything seems to be A-OK

        return true;

    }

}

return false;

Das sieht nicht nur scheußlich aus sondern ist es auch. Aber so funktioniert es wenigstens. Jetzt bekommt man zwar auch eine Exception, aber asynchron. Ich finde es verwunderlich, daß M$ hier auf ein besseres Interface verzichtet hat. Hat man sich aber soweit vorgewühlt, ist die remoting Lösung eine sehr praktische Sache. Keine Socketprogrammierung, kein Marshaling, einfach nur die Objekte deklariert und es kann losgehen.
Meine Anwendung sieht folgendermaßen aus: Auf bis zu 8 entfernten Rechnern laufen Windows Services, die die Datenkanäle des LPT Ports schalten können. Das Interface besteht aus einer einzigen Funktion: setValue(byte). Auf einem zentralen Rechner kann man in einem Fenster alle entfernten Ports einzeln oder gleichzeitig schalten. Aus Remoting-Sicht ist dieser Rechner also der Client, der zu den entfernten Servern eine Verbindung aufbaut. Es ist wirklich phänomenal, wie schnell man zu einem Ergebnis kommt: Hätte ich o.g. Probleme nicht gehabt, wäre ich nach 5 Stunden (einschließlich der Setups) fertig gewesen.

Das Ende der Birne

Minister Gabriel zum Thema "Glühbirne" als politischer Trittbrettfahrer (hatte ich das nicht ein paar Tage vorher woanders gelesen? Welches Land will nochmal gleich die Glühbirnen abschaffen?) Was im Grunde richtig ist, ist aber genauso Lobbyarbeit wie das Editorial des ADAC Vizepräsidenten in der meistgelesenen Zeitschrift Deutschlands. Richtig, das ADAC-"Blättle". Da fordert er, daß die KfZ Besteuerung "umweltgerecht" nach CO2 Ausstoß berechnet werden soll. Das ist zwar auch nicht verkehrt, aber was soll das Ganze, wenn der CO2-reduzierte Neuwagen trotzdem 15l Super zieht? Das hilft höchstens als Daseinsberechtigung für die Bürokratie, neue Vergabeschlüssel für die KfZ zu vergeben und sich im allgemeinen wichtig zu machen. Es ginge doch so viel einfacher: Die KfZ-Steuer, so sie denn sein muß einfach über die Tankstellen einziehen! Die bei der Verbrennung entstehende Gasmenge ist direkt proportional zum Kraftstoffverbrauch. Ganz simpel, das muß man dem Wähler nicht mal extra erklären.
Allem Gemecker hier zum Trotz bin ich froh, daß das Thema Energie endlich die Medienpräsenz hat, die es schon lange verdient hat. Auch wenn meine Elterngeneration die Aufregung nicht nachvollziehen kann und sich gleich bevormundet fühlt, nur weil irgendjemand fordert, man solle nicht mehr nach Bangkok sondern umweltschonend in den Bayrischen Wald fliegen. Der Erholung wegen. Inzwischen müßten wir uns doch an die politischen Aktivisten gewöhnt haben um zu erkennen, daß hier nur jemand ganz schnell oderhochwassertypisch Punkte ziehen will.

OpenId

OpenId ist eine neue Technik zur Verwaltung von Online Identitäten. Dieser Artikel beleuchtet die Sache ein bißchen. Man muß sich beim Besuch anmeldepflichtiger Webseiten nicht mehr zig Id's und Passwörter merken, eine Anmeldung reicht. Diese muß man auch nicht bei Microsoft hinterlegen (weshalb deren letzter Versuch "Passport" wohl auch scheiterte), sondern kann sich dafür einen beliebigen Server aussuchen. Das dementsprechend dezentrale System soll helfen, daß jeder einen für seine Bedürfnisse passenden Service findet.
In den sog. online communities sorgt oft ein ausgeprägtes Karma-System dafür, den Troll-Faktor der Teilnehmer realistisch zu bewerten. Das Karma wird durch die Bewertung der Beiträge eines Mitglieds durch andere Mitglieder berechnet. Mitglieder mit viel Karma dürfen z.B. unmoderiert kommentieren oder erhalten lustige bunte Sterne (ebay).
Die Idee von OpenId ist es nun, nicht nur Id's und Passwörter zu vereinfachen, sondern auch Karma zentral zu speichern und damit anderen Sites zugänglich zu machen. Bei mir geht hier aber die Big Brother Lampe an. Ist ein Benutzer vertrauenswürdig, wenn er auf Site X 100 Punkte hat? Wenn es möglich ist, aus der OpenId direkt auf eine reale Person zu schließen, muß diese nun fürchten, daß zukünftige Arbeitgeber ihre Punktzahl als Indikator für soziale Verträglichkeit heranzuziehen? Wie geht das System mit Mißbrauch um? Kann ich einen OpenId Server faken oder andersherum ausgedrückt: Wie kann ein Anbieter einen OpenId Server verifizieren? Ein Hack einer OpenId oder schlimmer noch, eines Servers hat nun nicht mehr örtlich begrenzte Konsequenzen. Schneier würde sagen, das System wird dadurch brittle (spröde/brüchig). Ein Hack birgt die Gefahr eines class breaks, nicht nur die Kompromittierung einer Site. Ich denke man merkt es: Ich halte das Ganze für riskant und nicht zu Ende gedacht.

3 Char Produktname

Mein Arbeitgeber verfolgt eine etwas eigenartige Strategie die hauseigenen Kreationen zu benennen. Jedes Produkt hat nämlich keinen Namen, sondern eine Abkürzung. Damit der Kunde sich nichts darunter vorstellen kann. Die erste Ziffer muß natürlich dem Anfangsbuchstaben des Unternehmens entsprechen. Neulich durchzitterte das Beben einer Revolution die Firma: Die Produkte haben jetzt keine 4-stellige, sondern nur noch eine dreistellige Bezeichnung (der Kunde tat sich vielleicht doch etwas schwer mit dem Merken). Kurzerhand mußten wir uns ein paar griffige Namen ausdenken:

ABT, ALT, ABI, AXT, AOL, AXE, AUA, ARA, AYE, APO, ART, AUS, AUF, ANT, AST, AKA, ABC, AVE, ADE, AJA, ADA, ACK

Gibt's noch mehr Worte oder Abkürzungen mit 3 Buchstaben, die mit "A" anfangen?

EDIT:
ABM, ABS, ABB, ABO, AHA, ALI, ALG, AMI

Am Feierabend



Hätt ich tausend Arme zu rühren!
Könnt ich brausend die Räder führen!
Könnt ich wehen durch alle Haine!
Könnt ich drehen alle Steine!
Dass die schöne Müllerin
merkte meinen treuen Sinn!

Ach wie ist mein Arm so schwach!
Was ich hebe, was ich trage,
was ich schneide, was ich schlage,
jeder Knappe tut's mir nach.

Und da sitz ich in der großen Runde,
in der stillen kühlen Feierstunde,
und der Meister spricht zu allen:
Euer Werk hat mir gefallen;
und das liebe Mädchen sagt
allen eine gute Nacht.

(Wilhelm Müller)

css Kuriositäten

Seit ich die neue WordPress Version installiert habe, (2.1) funktioniert ein Teil der Bilder im Textverlauf nicht mehr. Bisher hatte ich diese immer in ein div eingeschlossen. Das Bild wird jetzt aber nicht mehr angezeigt, außer wenn man das width Attribut setzt. Seltsam. Setze ich "float:left;" z.B. direkt im Image, funktioniert es wie erwartet. Ich finde das nicht so besonders zufriedenstellend.

Datenkrake

Neue Geschäftsmöglichkeiten für Autoversicherer: Eine Kontaktvermittlung! Beim Abschluß eines Versicherungsvertrags muß der Name und das Alter des Partners mit angegeben werden, der das Auto mitnutzt. Wechselt man den Partner, teilt man das der Versicherung einschließlich einer Altersangabe mit. Damit ist das Auffinden von möglichen Partnern ein Kinderspiel. Man kann sogar nach der Automarke filtern. Einziges Problem ist es herauszufinden, ob der Fahrzeughalter verlassen wurde oder anders herum. Das könnte man allerdings durch Querverweis auf eine andere Ummeldung herausfinden. "eine 25-jährige Ex-Golfmitnutzerin bitte". No problemo!

Identicons

I really like the idea of Don Park's identicons.
His aim is largely to use it as a way to recognize commenters in blog posts by evaluating their IP address. Since the human eye or rather, the human brain is faster at telling images apart than it is at finding differences in written IP addresses, this makes commenter validation much easier. Alas, since I don't have many commenters I went for a different application. I implemented a .NET class that creates bitmaps from an integer input value, very much like Don described it here. The create method takes an integer and a size value and returns an Image.Bitmap which can be saved or used within the application. I didn't take a look at the source code provided since I don't understand like Java very much. I started from scratch using GDI+. There is a handy object available called GraphicsPath. It is a container for shapes like lines, polygons and so on. These objects can be manipulated through a transformation matrix. Just the right thing for the shapes that make up the identicon. The implementation is probably very ineffective in terms of runtime performance . I have tried to keep it as simple as possible in order to understand what's happening even later on! :-)

Here you can download the class. Feel free to use it. Feedback is appreciated.

Download identicon.zip

.NET 2.0 is required but only for the generic lists that hold the shapes, it should be easy to port it back to .NET 1.1.

Hitzewelle

Inzwischen haben die meisten gemerkt, daß mit dem Wetter etwas nicht ganz in Ordnung zu sein scheint. Am gestrigen Samstag war das Straßencafe unter unserem Wohnzimmerfenster voll mit Einkäufern, die ein paar Sonnenstrahlen bei 15° Außentemperatur erhaschen wollte. Gestern nacht steppte dann der Bär: Eine Horde Jugendlicher hatte sich halb entblößt und versuchte unter Geschrei und unter Zuhilfenahme einer halbem Plastikflasche sich gegenseitig naßzumachen. Soviel Heißblütigkeit war gar nicht nötig, es hatte immer noch 12°. Das war also der 13. Januar 2007.