Hack!! Arrrgh

Womit man so seinen Nachmittag verbringen kann. Alles fing damit an, daß der GeoURL Button unten rechts nicht mehr funktionierte. Die Tags waren drin, also an was konnte es liegen? Der GeoURL Support schlug vor, doch mal den W3 Validator auszuprobieren. Hä? Ich verwende doch Software von der Stange, aber warum nicht.. und siehe da, der Validator sagt, er könne mit Content-Type null nichts anfangen. Ich schaue in den Header des Themes, der Content-Type wird explizit gesetzt, genauso wie im Quellcode der Seite. Doch irgendwas ist komisch mit dem header.php..
Dann sehe ich es: In der ersten Zeile steht was völlig merkwürdiges:

<?php /**/eval(base64_decode(‘aWYoZnVuY3Rpb25 …

Etwas primitive Tarnung, das Skript (ziemlich obfuscated) in einem Base64 String. Das wiederum rief ein in einem entlegen Winkel meiner Webseite plaziertes Skript auf, das wiederum eine 100kb Datei dekodierte und dann evaluierte. Was das genau tut habe ich noch nicht herausgefunden. Eins jedenfalls hat die Infektion geschafft: Alle meine PHP Seiten waren damit infiziert (.php5 Seiten aber nicht!) Das hatte anscheinend nichts mit WordPress zu tun. Dem Änderungsdatum zufolge war das bereits vor einem halben Jahr geschehen. Ich hatte nichts bemerkt!
Wie das ganze hereingekommen ist weiß ich leider noch nicht. Ich vermute, daß es an der sehr alten WordPress-Version vom Blauen Heft liegt, speziell den dort verwendeten Javascript Editor (in dessen Unterverzeichnis das “Mutter-Skript” untergebracht war).
Ich mußte das natürlich zum Anlaß nehmen beide Blogs auf WordPress 3.0 anzuheben, alle anderen PHP Skripte manuell zu bearbeiten und mal wieder kräftig aufzuräumen. Aufräumen ist ja immer eine super Sache. Man muß es nur ab und zu tun. Danach funktionierte auch der GeoURL Knopf wieder.

Zusammenfassung:

  • Ab und zu in den PHP Quellcode schauen
  • Regelmäßige Backups der Files und Datenbank
  • Nie alte Versionen herumliegen lassen

Links dazu aus dem Web, hier und hier. Peinlich wenn man sich anschaut wie alt das schon ist..

Denglish for Programmers

In vielen Software-Firmen gibt es die Anweisung, daß Variablennamen, Kommentare und ähnliche Dinge in der Software auf Englisch verfaßt sein müssen. Bei uns beispielsweise auch. Warum eigentlich? Um den Chinesen die Einarbeitungszeit nach der Raubkopie zu verkürzen? Ich persönlich bin der Ansicht, daß diese Regel eher kontraproduktiv ist. Vor allem deshalb, weil die wenigsten Entwickler in meinem Kollegenkreis über die notwendige Fähigkeit verfügen, verständliche Kommentare zu setzen. Oft gleichen die Einträge dann Wort-für-Wort Übersetzungen aus Leo. Das hat schließlich einige dazu getrieben, einen Art Sprach-Kompromiß einzugehen. Hier eine Perle, die ich heute entdeckt habe:

private const string pleaseChoiseALiefernachweisText = "textSelectLiefernachweis";

Yeah! Ich soll bitte einen Liefernachweis wählen, äh, ich meine natürlich choisen. Muahaha. Also, das ganze ist wirklich völliger Quark. Setzt die Kommentare doch so, daß diejenigen sie verstehen, für die sie gedacht sind. Genau, die Kollegen. Die meisten von denen verstehen zwar auch denglisch, nur besteht immer das Risiko eines Mißverständnisses. Ich für meinen Teil habe von jeher diese Arbeitsanweisung ignoriert.

Daily WTF

Die Überschrift habe ich hier geklaut. Inzwischen ist es so daß das Monster, welches ich schon seit Jahren betreue, der meisten Schauerlichkeiten beraubt wurde. Aber hin und wieder tauchen einzelne Perlen auf, so wie das hier:

public bool Enthalten
{
     get { return !this.entity.Enthalten.Value; }
     set
          {
            if (!this.entity.Context.IsChangeTrackingEnabled)
                   this.entity.Context.EnableChangeTracking(true);
            this.entity.Enthalten.Value = !value;
          }
}

Die entsprechende Datenspalte trug übrigens den bedeutungsschwangeren Namen “Nicht“. Nicht was? Nicht geglückt? Nicht rechtzeitig ins Bett gekommen? Wir werden es nie erfahren.

Tippsler

Als Fan des gleichsam sehr unterhaltsamen wie oftmals arschgeigenmäßig arroganten, aber gewiß genialen Steve Yegge möchte ich an dieser Stelle auf seinen neusten Artikel hinweisen. Den kann man auch lesen ohne vorher einen 10-jährigen Lisp Kurs gemacht zu haben. Es geht darum daß Leute, die mit Rechnern arbeiten, unwillkürlich in Tipper und Tipp-Legastheniker (Suchsystem) unterteilt werden, anhand dessen ihre Produktivität intuitiv eingeschätzt wird. Ich will das jetzt nicht nacherzählen, ich habe mich nur gefragt wie man das herausbekommt. Jeder hat sein eigenes System und seine eigene Einschätzung. Ein entscheidendes Merkmal ist sicher ob man tippen kann ohne hinunterzusehen. Und dann natürlich die Geschwindigkeit. Eine extrem heitere Methode etwas darüber zu erfahren ist der Typeracer. Leider gibt es nur englische Texte, so daß wir mit unseren deutschen Tastaturen etwas benachteiligt sind, aber ich kann nur empfehlen es einmal auszuprobieren. Wer’s wissen will: Mein persönlicher Durchschnitt liegt zwischen 60 und 70 W(ords) P(er) M(inute). Um es an die Spitze zu schaffen sind allerdings astronomische 140 WPM (!) nötig.

Steinchenregen

Die “Technopolis” in der Nähe von Antwerpen ist ein großes Technikmuseum zum Anfassen. Dort gibt es Wasserspiele, optische und akustische Versuche, die man machen kann und die vor allem Kindern erklären, wie die Sachen funktionieren. Mittendrin habe ich etwas gefunden, daß man sicher mit nicht allzu aufwendigen Mitteln selbst bauen könnte. Vorausgesetzt, man hat Zeit. Der Effekt ist jedenfalls beeindruckend. Man benötigt: Einen PC, einen Beamer, eine Leinwand und eine Kamera. Ham wa schon daheim? Na super. Mir fehlt noch der Beamer und die Leinwand. Der Beamer stellt eine Simulation dar, z.B. fallende Steinchen. Die Kamera nimmt das Bild auf der Leinwand auf und filtert alles heraus, das nicht von der Simulation erzeugt wird, z.B. der Schatten einer Person, die vor der Leinwand steht. Das daraus resultierende Objekt wird in die Simulation als Festkörper mit eingebunden, auf dem die fallenden Steinchen dann liegenbleiben.
Der Effekt ist phänomenal: Man steht vor der Leinwand, breitet die Arme aus und über einem wächst der Steinhaufen immer mehr an. Tritt man beiseite wird das Objekt aus der Simulation entfernt und die aufgestauten Steinchen fallen herunter. Das ganze gab es dann noch als Variation bei der durch die Simulation feste Objekte auf einer Oberfläche dargestellt wurden (z.B. Billardkugeln auf einem Tisch). Mit Gesten konnte man dann die Kugeln anstoßen, sobald der eigene Schatten das projizierte Bild berührte. Nächster logischer Schritt wäre dann die Implementierung eines “Pong” Clones.

Sterne Plugin: neue Version 1.1

Ein kleines Update für das Sterne Plugin:
Die Farben sollten jetzt etwas besser rüberkommen als in der Version 1.0.
Gelbe Sterne sind jetzt wirklich gelb: SterneSterneSterneSterneSterneSterneSterne :-)
Zur Installation: Wer bereits Version 1.0 einsetzt muß nur die Datei Sterne.php ersetzen. Außerdem sollten die bereits erzeugten Sterne gelöscht werden (werden bei der nächsten Anzeige der betreffenden Seite neu erzeugt). Das sind die Dateien unter /wp-content/plugins/Sterne/.. und zwar alle in der Form:

icon-rating-star_f_Zahl_Zahl_Zahl.png also z.B. icon-rating-star_f_255_255_0.png

Bitmap vs. Image

In C# existiert eine abstrakte Basisklasse für Bilder genannt Image. Speichere ich nun ein geladenes Bild als Image in einer anderen Klasse, scheint es irgendwann vom GarbageCollektor abgeräumt zu werden.
d.h. sowas:

class Ship {
private Image image;
// ..
}

Am Anfang wird das Bild geladen und mehrfach verwendet. Nur irgendwann ist es weg (null)!. Ernsthaft, ich dachte ich spinne. Speichert man das Bild als Bitmap funktioniert alles wie erwartet. Ich habe recht lange gegoogelt und nichts gefunden bis ich durch Zufall diese Änderung gemacht habe und auf einmal funktionierte alles. Zum Haareraufen! (daher paßt es gut hierher ;-) )

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.

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.

Mitternachtsdebugging

Wieder mal ein Stück teuer erworbenes, aber fast nutzloses Wissen: In .NET spielen dll’s unterschiedlicher Versionen normalerweise prima zusammen, man kann z.B. ein Executable mit der Version 1.9.1.0 mit einer älteren Library 1.8.0.0 zusammen laufen lassen. Aha! Aber es gibt eine Ausnahme.. ist die Anwendung ein Windows Service, so stürzt sie beim Start mit einer älteren Libraryversion mit dem nicht gerade sehr hilfreichen Fehler ab:
Error 1053: The service did not respond to the start or control request in a timely fashion
Wie bitte, timely fashion? Die Meldung erscheint nach etwa 3-4 Sekunden! Da mußte was faul sein, aber es hat wirklich gedauert bis ich drauf gekommen bin :-\