Hitler jetzt liebende Mutter

Aus gut informierter Quelle (hochfrequente Engelwesen) weiß die Autorin Diana Cooper auf ihrer Webseite zu berichten, dass der weltweit verachteteste Mensch der Geschichte nun gar nicht mehr so furchteinflößend ist.

In dem Absatz “About Atlantis” bereitet sie die drängendsten Fragen über das legendäre Insel-Paradies auf und findet dabei bestechend einfache und schlüssige Antworten auf Fragen, die sich mir schon immer stellten:

Atlantis, Hitler, Titanic und 44 .

Velocity condensed

Velocity ist keine Fahrradstadt, sondern ein Java-basiertes Templatesystem, dass eine Trennung zwischen Java-Code und Oberflächenbeschreibung erlaubt. Die Velocity Template Language (VTL) erlaubt den Aufruf von an anderer Stelle in Java implementierten Objekten und Methoden. Velocity geht über den reinen Einsatz auf Webpages hinaus. Auch SQL (u.v.m.) läßt sich damit zusammenbauen.

Nach vergleichsweise langer Suche habe ich eine gute How-to-Seite gefunden, aus der ich im Folgenden das Wesentliche wiedergebe.

Sprachsyntax:

– jede Anweisung beginnt mit #, Referenzen mit $

-Variablen werden mit $ gekennzeichnet, sie können im HTML-Code oder im Java-Code definiert und initialisiert werden: #set ( $a = “bla”), Variablen beginnen mit Buchstaben, so dass die Angabe $2.40 nicht als Variable interpretiert wird.

– Escaping mit \

-Strings: ” “, wenn sowohl statischer Text, als auch zu interpretierende Variablen, ‘ ‘ wenn as-is.

– Comment: ## (single line), #* *# (multiline), #** *# (documentation)

-drei Typen von Referenzen: variables ($var), properties($object.Property ruft, wenn vorhanden die Methode getProperty() auf – nicht verwechseln mit Instanzvariable! Auf diese kann nicht ohne Getter zugegriffen werden), methods ($object.eatThis( “banana”) ), wobei die Übergabe zwischen Java und Velocity immer über Strings läuft

– werden Properties verwendet, gibt bestimmte Lookup-Rules um auf die richtige Methode zu kommen

– ist eine Referenz zum Zeitpunkt der Ausführung nicht definiert, wird die Referenz als Klartext ausgegeben. Um stattdessen blank auszugeben, ist ein ! zu notieren: $!justDontPrintMeIfNull

– die zu den Referenzen angegebene Schreibweise ist die shorthand-Schreibweise. Wenn nötig, kann der Ausdruck mit geschweiften Klammern versehen werden: $!{object.doFormal()}

– Escapen mit \

-Anweisungen: beginnen immer mit #, lassen sich auch über {} schreiben: #{if}

-#set: zum Wertzuweisen: #set ( $var = XXX) mit XXX als Property, Methodenrückgabe, Variable, Array ( [ “b”, “c”]), Map ({“a” : “appel”, “b” : “banane”}), arithmetischer Ausdruck

– Standardmäßig kann KEIN null zugewiesen werden! Die Referenz bleibt erhalten!

-Konditionen: #if #ifelse #else #end(!)

-Evaluierung im #if: $var ist true, wenn boolean und true ODER $var ist nicht boolean und nicht null

– == kann zum Vergleich von Strings, Numbers oder Objects verwendet werden

– logische Operatoren &&, || und ! äquivalent zu Java

-#foreach( $thingie in $things) #end

– interne Variable für die Nummer des Schleifendurchlaufs: $velocityCount startet bei 1

– #include (“bla.txt”) : ungerendertes Einbauen, #parse (“vtlText.txt”) : rendern und einbauen; Dateien müssen unter TEMPLATE_ROOT liegen

-#stop. Stoppt die Velocity-Interpretation, zu Debugging-Zwecken sinnvoll.

Soviel zu Velocity condensed. Es gibt auch die Möglichkeit Macros zu schreiben (Velocimacros). Darauf möchte ich an dieser Stelle nicht weiter eingehen. In oben verlinktem How-to wird darauf näher eingegangen.

Best practices: SQL-Repositories

Nachdem ich mich nun schon zum x-ten Mal durch Logfiles wühle, mal eine kleine Anregung: Werden die SQL-Statements einer Anwendung zentral in einer Datei gehalten (SQL-Repository/Statement-Repository), lohnt es sich, zu jedem Statement einen SQL-Kommentar aufzunehmen: Was macht das Statement und aus welchem Kontext wird es aufgerufen? Diese Kommentare werden typischerweise im Log gezeigt und vereinfachen die Analyse enorm. Gleichzeitig sinkt die Fehlerwahrscheinlichkeit bei Korrekturen durch allgemeines Verständnis. Was für das Anwendungsprogramm gilt, muss auch für Statements gelten: DOKU OR DIE!

Bei Statements empfiehlt sich die Kommentierung mit “/*” und “*/”, da der gebräuchlichere Einzellenkommentar mit “- -” ein blockweises Auskommentieren in XML-Dateien verhindert.

Java Webstart (JWS) Remote debugging

Nach blöder Rumprobiererei habe ich endlich eine Remote Debugging connection hinbekommen. Hintergrund: Entwicklungsrechner mit Windows, Probleme unter Linux. Der Umstand, dass es sich um ein Webstart-App handelt, macht es noch ein bißchen kniffliger. Nach der Konsultation von einigen Foren und Blogs hab ich es jetzt geschafft: Auf dem Linuxrechner läuft die JVM im Debug-Modus und mit dem unter Windows installierten Eclipse kann ich (fast) debuggen, als wäre es eine aus Eclipse gestartete Anwendung. Voraussetzung ist natürlich, dass man den Sourcecode zur Verfügung hat. Reverse-Engineering mittels JODE funktioniert nur teilweise sauber. Ein weiterer -leider einschneidender- Nachteil ist der, dass die Variablenwerte nicht auslesbar sind. Es ist also sinnvoll, den Code mit entsprechend vielen Log-Statements zu instrumentieren, die über die Java-Konsole ausgelesen werden können.

Mein Vorgehen:

1. Die VM muss mit bestimmten Flags gestartet werden. Dazu bietet sich die Umgebungsvariable JAVAWS_VM_ARGS an. Funktioniert hat es mit folgenden Parametern:

-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8888

Diese Konfiguration führt dazu, dass die VM auf Port 8888 hört. Firewalls sind ggf. auszuschalten bzw. zu konfigurieren. In einigen Foren habe ich gelesen, man müsse noch einen Servernamen angeben, wenn es sich nicht um localhost handelt. Das stimmt nicht.

2. Dann habe ich mir die bei einem vorherigen Start heruntergeladene JNLP-Datei geschnappt und lokal gestartet: javaws xxx.jnlp. Die Konsolenausgaben geben ein gewisses Feedback, ob alles geklappt hat. Unter Windows ging das bei mir übrigens nicht. Da meckert er, er könne die Main-Class nicht finden. Warum? Keine Ahnung… U.U. muss die JNLP-Datei noch ein bißchen überarbeitet werden.

3. Zum Test auf dem Linux-Rechner den Debugger starten: jdb -attach localhost:8888. Hier ist es wichtig, den Servernamen mitanzugeben, sogar wenn es sich um localhost handelt. Gelingt ein Connect ist alles in Butter. Gelingt er nicht: Viel Spass beim Wühlen im Netz.

4. Im Eclipse auf dem Windows-Rechner: Findet sich im, über “Debug…” geöffneten Menü im linken Teil ein Eintrag: “Remote Java Application”. Davon eine neue anlegen. Im Dialog den Port (8888) angeben und den Linux-Rechner eintragen (bei mir tat es nur die IP-Adresse). Projekt auswählen, Connection Type “Standard (Socket Attach)”. Alle anderen Einstellungen sind okay.

5. Bei gestarteter Linux-VM diese Konfiguration starten und fertig ist die Kiste. Es läßt sich debuggen wie gewohnt.

Delikate Geburtstagstafel

Anläßlich von Chaos-Command-Königs Geburtstag findet just in diesen Stunden ein oppulentes Long-time-Fratzeln in seinen mainzer Gemächern statt.

Das Menü ist folgernmaßen bestückt:

  1. Hungertreiber (Aperitif): Guacumole an Knusperstangen- Brot
  2. Einstieg (Antipasti): Überbackene Aubergine
  3. Grundlagen (Starter):Hähnchen-Stix mit gebumsten Erdnüssen
  4. Eskalation (Zwischengericht): Gnocchi-Roquefort-Bombe an Tomatenjus
  5. Segnung (Hauptspeise):Penne mit Rindfleischstreifen und Pfifferlingen
  6. Abgang (Dessert): Johanniscrepes mit Minze und Nektarinen
  1. Guacamole:

    man kaufe drei reife Avocados, eine Zwiebel, zwei große Tomaten, min. drei Knoblauchzehen (und als Variationsmöglichkeit noch schönen, bröckeligen Feta). Man schneide zunächst die Zwiebeln klein und gebe dann die Knoblauchzehen durch die Knoblauchpresse hinzu. Anschließend löffle man die Avocados aus und zerdrücke dat Janze auf den Zwiebeln und dem Konblauch, bis es eine schöne, cremige Masse ergibt. Zum Schluss werden noch die klein geschnittenen Tomaten und der Feta (oder auch nicht) untergerührt und alles mit Pfeffer und Salz gewürzt. Fertig! Zum servieren stelle man die Schüssel in die Mitte eines Tisches, mit einer Schale oder einem Teller mit Chips, Nachos oder Brotscheiben. Nachdem sich dann die “sich mässten wollende Menge” um den Tisch versammelt hat, zähle man den Countdown und bei 0, wird die Schüssel nicht mehr sichtbar sein. In den nächsten Sekunden wird die Luft von Mmh-Geräuschen erfüllt sein und nach 2:28 Minuten ist in der Mitte des Tisches nur noch eine sauber geleckte Schüssel vorzufinden. Dass bedeutet: Die Guacamole war genauso wie sie sein sollte. So war es jedenfalls bei uns heute abend. Mmh…..

  2. Auberginenscheiben mit Tomate und Mozarella:

    Zu Beginn aus Olivenöl, Balsamiko und Kräutern eine Marinade herstellen. Nun eine mit wenig Olivenöl ausgestrichene Reine oder ein Blech mit Auberginenscheiben belegen. Diese leicht salzen und mit der Marinade beträufeln. Nun mit Tomatenscheiben bedecken, diese abermals mit der Marinade beträufeln und die Reine in den Ofen schieben. Nach etwas 10 Minuten den in Scheiben geschnittenen Mozarella auf die Tomatenscheiben legen und nochmals 3-4 Minuten in den Ofen schieben. Wenn die Auberginen garr sind das ganze aus dem Ofen nehmen und mit Basilikumblättern garniert servieren.

  3. Hühnchenspieße an gebummsten Erdnüssen:

    Zu den Spießen: In einer kleinen Pfanne 1x Tl. Koriandersamen + 1x Tl. Kuminsamen (Kreuzkümmel) ohne Öl in der Pfanne erhitzen. Anschließend mit Mörser handbumsen. In einer Schüssel 2x El. helle Sojasauce, 1x Tl. Salz, 4 El. Öl, 1x El. Thai-Currypulver, 1x El. Kurkurma, 8x El. Kokosnussmilch, 3x El. Zucker vermengen. Fleisch in dünne Streifen schneiden und in der vorher angerührten Paste marinieren (Matsche acht Studen ziehen lassen). Anstatt wie gewohnt Holzstäbchen zu nutzen, nimmt man Zitronengrassstengel als Aufspießer.

    Zur Erdnusssauce: 2x El. Öl in einer Pfanner erhitzen. Drei gehackte Knoblauchzehen und 1x Tl. rote Currypaste anbraten und mit 8x El. Kokosnussmilch ablöschen. Danach 225 ml Hühnerbrühe dazu gießen, 1x El. Zucker, 1x Tl. Salz, 1x El. Limettensaft, halbe Packung gebumste salzige Erdnüsse. Fürs fein Tuning empfehlen Dana und Thomas Minze, Thai-Basilikum und Koriander. Bewerteung 1. Bon Appétit!

    Hühnchenspieße

  4. Gnocchi an Tomaten-Roquefort-Sauce:

    500g sehr reife, kräftig schmeckende Tomaten blanchieren und anschließend schälen, entkernen und kleinschneiden. Eine Frühlingszwiebel fein schneiden, in Olivenöl anbraten und die Tomaten dazugeben. Bei kleiner Flamme 20-30 Minuten kochen lassen bis eine sämige Tomatensauce entsteht. In der Zwischenzeit können die Gnocchi zubereitet werden. Wenn die Tomatensauce fertig ist den in kleine Würfel geschnittenen Roquefort (ca. 100 Gramm?) in diese hineingeben und locker unterrühren. Mit Pfeffer abschmecken und einen kleinen Schuss Rotwein hinzugeben. Eine Prise Chilli könnte auch nicht schaden. Fertig ist der Spass. Zum Garnieren bietet sich frische Petersilie an.

Die Timeline

17:30 Einkaufen erste Runde: Alnatura (Hühnchenfleisch, Wein, Aubergine und so), Asiate (Thai-Basil, Kokosmilch, Koreander)

18:10 Minze und Petersilie beim Türken. Alnatura-Tüte stehen gelassen.

18:20 Zuhause. Eier irgendwie nicht da. Und andere Sachen. Zum Türken gerannt, Tüte gefunden, Rückweg. Theo und Anna warten vor der Tür.

18:30 Saugen und Aufräumen, Theo und Anna spülen

18:45 Der Bonner Mob kommt

19:15 Einkaufen zweite Runde: Rewe (alles mögliche und Alkoholika), Rewe (Roquefort, Basilikum)

20:15 Hühnchenfleisch in Marinade einlegen, Rindfleisch mit Basilikum und Knoblauch

20:30 Aubergine fertigmachen

20:50 erste Runde Auberginen im Ofen

21:00 Guacuamole-Schlacht

21:15 Auberginen

21:40 Mehr Auberginen

21:50 Kaczyński ist doof

22:30 Hühnchenspieße deluxe!!

23:00 Nach den Hühnchenspießen tritt allgemeines Sättigungsgefühl und erste Alkoholisierung ein. Mit Barbara taucht ein neunter Mitesser auf.

00:21 Die Gnocchi-Bombe explodiert… Wird jemand noch irgendetwas in den nächsten 24 Stunden essen können?

00:37 Die Bombe ist eingeschlagen. Erst Kampf um jede einzelne Gnocchi, dann schnelle Verstopfung, abgeschlossen von DDR-Solidatirät; jeder teilt mit jedem.

01:15 Erste Runde Mokka wird gereicht. Dazu mehr oder weniger viel Halva.

02:23 Aufbruch zum Verdauungsspaziergang…

Einfache Passwörter sind schön…

Arrrgh. Heute mal zur Abwechslung den vergammelt Mac hochgefahren. Der wollte doch tatsächlich ein Passwort zum Zweck der Software-Aktualisierung haben. Leider kannte ich dieses nicht und hatte natürlich auch keine administrativen Rechte. Eine kurze Recherche im WWW führte mich schnell zu diesem Mac OS Brute Force Tool namens MHW – Macintosh Hacker’s Workshop. Derzeit aktuell in der Version 1.1.

Nach der Installation versuchte ich zuerst den Wordlist-Modus. Die Maustaste war noch nicht zurückgeschnellt vom Klick auf den Go-Button, da blinkte auch schon das gesuchte Passwort auf: anna. Quasi das MySpace-Syndrom. Über diese Sünde muss man wohl nicht weiter reden… mir konnte es nur recht und billig sein.

Der Unterschied zwischen nichts und nichts

Oracle bietet die schöne Funktion trim(), die Leerzeichen wegschneidet. Aber zum Teufel! irgendwie hat meine Abfrageklausel trim(table.field) <> '' NIE ein Ergebnis gebracht. Egal, ob field (ein char(10)-Feld) leer war oder nicht.
Die Lösung: trim() verwandelt leere Strings (z.B. ' ') in null und nicht wie beispielsweise in Java in den Leerstring "". Auch '' sieht Oracle als null. Und so ist null nie verschieden von null.

Mir war vorher noch nie aufgefallen, wie schwer es sein kann, DB-Admins von der Sinnhaftigkeit der Unterscheidung zwischen null und Leerstring zu überzeugen. Naja, Datenbanken sind halt selten objektorientiert.

Blinder pädophiler Maler

Ein weiterer Fund für die Kuriositätensammlung: Esref Armagan. Er ist Maler und das, obwohl er seit Geburt blind ist. Aber nicht nur das. Neben der Malerei ist er auch noch bekennender Pädophiler. Auf seiner Internetseite schreibt er: Mr. Armagan is currently forty-one years old, married with two children.

Wie man sieht, sind die Sitten in der Türkei wohl noch relativ weit vom europäischen Denken entfernt…