Urbild

Schau Dir die Uhr in der Taskleiste deines Betriebssystems an. Manchmal muss man ‘draufklicken, um ein Ziffernblatt zu sehen. Ziffernblatt oben, darunter zwei Ziffernpaare mit Doppelpunkt dazwischen. Zwei Uhrzeiten? Nein, eine Uhrzeit mit zwei Ansichten. Wenn der Minutenzeiger 1/60stel weiterspringt, dann ändert sich zeitgleich die Ziffer ganz rechts.

In der Welt der Programmierung wird das mittels MVC-Muster implementiert. Es gibt einen Code, der die Uhrzeit “ist”, implementiert; eine Programmierung der grundlegenden Datenstruktur für die fachliche Beschreibung dessen, was wir “Uhrzeit” nennen. Das, was Du siehst, ist nicht die Uhrzeit. Es ist es Darstellung der Uhrzeit, das “V” in MVC.

Das Ziffernblatt ist eine Darstellung, ist ein Abbild eines Urbildes, des Models. Ebenso die zwei Ziffernpaare. Beide sind Abbilder des selben Modells. Das merkst Du daran, dass sich beide zeitgleich veränden.

In der Welt der Philosophie werden die Begriffe “Urbild” und “Abbild” mit Platons Ideenlehre verbunden. Die Uhrzeit, deren Darstellung Du siehst, könnte ein Objekt einer Klasse sein. Hier wiederholt sich das Ideenmuster. Das Objekt ist Abbild des Urbildes UhrzeitKlasse. Hier wiederholt sich das Ideenmuster. Die UhrzeitKlasse ist Abbild des Urbildes Uhrzeit. Was auch immer das sein mag. Was auch immer Du auf Deinem Monitor siehst – es ist sehr weit von der Wirklichkeit entfernt. Was auch immer das sein mag.

DSC_0977

(Münster, Dortmund-Ems-Kanal, ca. 67.2km, 4.Juli 2018)

Veröffentlicht unter Allgemein | Kommentare deaktiviert für Urbild

Dokumenten-Typen mit Metadaten

Kurz

Mittels einer Filter- und einer Factory-Methode werden unterschiedliche Objekte erzeugt, die ein gemeinsames Interface implementieren. Anlass war das Refactoring einer Software-Komponente, die Metadaten für unterschiedliche Dokumenten-Typen geschrieben hat. If-Orgien wurden entfernt.

Ausgangssituation

Es gibt sechs unterschiedliche Typen von Dokumenten. Der Einfachheit und Diskretion halber nenne ich sie hier “Typ-1″ bis “Typ-5″ und “Standard-Typ”. Jeder dieser Typen wird durch neun Werte charakterisiert, die ich unkompliziert aus Feldern der konkreten Lotus-Notes-Dokumente entnehmen kann. Die Felder nenne ich hier “Feld-1″ bis “Feld-9″. Einige Felder werden für allen Typen gebraucht, andere sind jeweils unterschiedlich, und manchmal werden keine Feldwerte ausgelesen, sondern Konstanten benutzt.

Der bestehende Code wiederholt mehrfach dieses Muster, hier in Pseudocode:

Das funktioniert zweifellos. Aber es hat zwei Nachteile.

Erstens: Wenn ich möchte, dass ein neuer nicht-Standard-Dokumenten-Typ verarbeitet werden kann, dann muss ich alle diese if-Blöcke finden und anpassen. Das ist aufwändig und fehleranfällig, weil dieser Code nicht alleine steht, sondern von anderem Code umgeben ist, der auch if-Blöcke hat.

Zweitens: Es ist nur schwerlich zu erkennen, welche Felder für welchen Typen benutzt werden. Das bremst Antworten für andere Entwickler aus, die mangels Dokumentation bei mir anklopfen. Und das macht es langwierig, Änderungen einzupflegen. Dieser Code ist so interessant wie ein fingernagelgrosses Stück Millimeter-Papier, aber leider ist er unentbehrlich.

OOAD und Pattern

Aus Sicht Objekt-Orientierter-Analyse-und-Designs liegt es nahe, den typenspezifischen Code in eigene Klassen zu kapseln, anstelle der Erbsenzählerei in den if-Blöcken. Also schaffe ich in Java ein Interface >>DocType<< mit der Methode “String getFeldwert ( int feldx )“. Die sechs Dokumenten-Typen stelle ich als Klassen “Typ-1-DocType” usw. dar, die dieses Interface implementieren.

Wie komme ich an ein jeweils passendes Objekt? Ich erschaffe einen DocTypeCreator. Der erzeugt für ein gegebenes Notes-Dokument ein passendes Objekt. Mit langem if-Block wie oben?

Nein, eleganter: Der DocTypeCreator hat eine Liste von DocType-Objekten, eins für jede implementierende Klasse des Interfaces >>DocType<<. Das Interface erweitere ich um zwei Methoden. Erstens um die Filter-Methode “boolean acceptDoc ( NotesDocument doc )“. So kann jede implementierende Klasse Auskunft darüber geben, ob sie für das fragliche Dokument zuständig ist. Zweitens um die Factory-Methode “DocType createDocType ( NotesDocument doc )“. So erzeugt ein DocType-Objekt ein weiteres DocType-Objekt seiner eigenen Klasse, das das gegebene Notes-Dokument als Datenquelle nutzt. Der DocType-Creator iteriert über die Liste seiner DocType-Objekte. Es braucht genau eine if-Abfrage: Wenn das aktuelle Objekt in der Iteration das Notes-Dokument akzeptiert, dann lasse es ein neues Objekt seiner Klasse mit eben diesem Notes-Dokument erzeugen.

Kröte

Diese Implementierung hat meines Erachtens nur einen Nachteil: Jede implementierende DocType-Klasse braucht einen parameterlosen Konstruktor, damit der DocTypeCreator an Objekte der unterschiedlichen Klassen kommen kann. Ein DocType-Objekt, das mit einem parameterlosen Konstruktor erzeugt wurde, kann nur dazu benutzt werden, um weitere gleichklassige DocType-Objekte zu erzeugen. Es hat aber kein Notes-Dokument als Datenquelle. So besteht die Gefahr, dass ein DocType-Objekt falsch verwendet wird. Dieser Gefahr begegne ich mit aussagekräftiger Dokumentation.

Vanille

Jeder DocType gibt nun übersichtlich Auskunft darüber, welche Feldwerte er liefert. Und um einen neuen Typen zu verarbeiten, braucht es nur zwei gefahrlose Schritte: Die Implementierung einer entsprechenden Klasse nach Muster >>DocType<< und das Erweitern der Liste im DocTypeCreator. Alle anderen Stellen bleiben unangetastet. Die Liste im DocTypeCreator könnte auch mittel Java-Reflections erzeugt werden.

Veröffentlicht unter Allgemein | Kommentare deaktiviert für Dokumenten-Typen mit Metadaten

Schuh

Ein bizarres Phänomen, das jeder beobachten kann, der offenen Auges durch die Welt geht, ist das des verlorenen einzelnen Schuhs. Da liegt ein einzelner Schuh in der Weltgeschichte. Vom Besitzer weit und breit nichts zu sehen. Wie ist dieser Schuh dahin gekommen? Wem gehörte er? Und wenn das, was vom Wagen fällt, dem gehört, der dem Wagen folgt – wem gehört er dann jetzt? Wie konnte dieses Kleidungsstück verloren gehen? Ein Taschentuch kann man verlieren, ein Feuerzeug, einen Schlüsselbund, Schal, Handschuhe – aber einen Schuh?! Das ist fast so, als verlöre man seine Unterhose. Soll ich ihn ins Fundbüro bringen?  Ist da jemand aus den Latschen gekippt?

DSC02239      Gorges d’Infernet 2010

Ich beobachte diesen Sachverhalt schon einige Zeit. Und weil jedes dieser Artefakte eine Geschichte hat und erzählt, habe ich angefangen, sie zu fotografieren. Immerhin geht es bei einer Fotografie auch darum: Um die Geschichte, die das Bild erzählt.

DSC_0536 Dortmund-Ems-Kanal ca. km 67.2, 2018

Ich schwöre: Nicht ich lege die Schuhe irgendwo hin, um sie dann zu fotografieren. Sie kommen genau so vor die Linse und auf den “Film”, wie ich sie vorfinde. Manche Tage sind sehr ergibig, aber ich konnte noch kein Muster dabei feststellen. Meine Hypothese war, dass man nach einem sonnigen Wochenende in der Nähe einer Party-Stelle mehr finden kann. Das kann ich aber nicht ausreichend belegen. Manchmal habe ich eine Intuition, fahre einen kleinen Umweg und – schupps – wieder ein Schuh. Fast scheint mir, als fände der Schuh mich.

DSC_0537 Dortmund-Ems-Kanal, Münster 2018

Bisher habe ich nur Männer-Schuhe gefunden, es scheint also eine geschlechtsspezifische Eigenart zu sein. Kinderschuhe ausgenommen. Das rosa Ballerinaschüchen hat das kleine Mädel vielleicht schon immer gehasst. Deswegen hat es es in einem günstigen Moment abgestreift. Mammi hat nichts gemerkt, prima. Zuhause angekommen gibt es keine Schelte, denn nur der Verlust beider Schuhe kann auf Vorsatz beruhen, der bestraft werden muss.

DSC_0570 DSC_0576
In einer russischen Erzählung, deren Titel und Autor mir leider entfallen ist, wird “berichtet”, dass ein Busfahrer auf einer entlegenen Landstrasse einen Weizenberg rammt. Wutschnaubend stellt er die örtlichen Bauern zur Rede. Die entgegnen, dass erstens es nun mal so sei, weil eine Hydraulik versagt hatte, was letztlich den Berg erzeugte und zweitens alle Sicherheitsmassnahmen ergriffen worden waren, man habe nämlich einen einzelnen Stifel vor die Kurve gestellt, hinter der der Berg sich verbarg, ob er den denn nicht gesehen hätte. Schon vor Jahren habe ich einzelne Schuhe in Frankreich beobachtet, ohne sie zu fotografieren.

Weniger beziarr ist es, ein Paar zu finden, das ein paar Meter auseinandergerissen ist – die sind zusammen aus irgendeiner Tasche gefallen und Autos, Hunde, Kleinkinder und sonstwas hat sie mehr und mehr getrennt. Natürlich finde ich immer zuerst den einen und freue mich schon auf eine neue Geschichte. Dann halte ich aber doch Ausschau nach dem zweiten, um sicherzustellen, dass es eine lohnenswerte Geschichte ist.

DSC_0582 DSC_0581 neben der B51, Münster

Ist der Badelatschen zufällig auf der Bank? Manchmal scheinen Finder seltsame Dinge mit den verlorenen Einzelstücken zu tun …

DSC_8514 Haus-Kleve-Weg, Münster 2018

Einige verschwinden schneller, als ich sie ablichten kann.

Ich habe schon etliche Schuhe gesehen und einige fotografiert, aber ich konnte nie beobachten, wie einer verloren ging. Gibt es dazu eine passende Verschwörungstheorie? Und eine Community im Web, die sich dieser Sache annimmt? Vergiß “lost places” und “urban exploring”. Finde “lost shoes” und “fashion exploring” ;)

Veröffentlicht unter Allgemein | Kommentare deaktiviert für Schuh

Windowbuilder Kapriolen

Der Windowbuilder für eclipse ist ein feines Tool. Damit kannst Du unkompliziert ein gui bauen, das nur den Standard “Lieferumfang” von Java nutzt. Das wiederum hilft, die auszuliefernde Datenmenge klein zu halten und befreit von der Notwendigkeit, sich um externe Bibliotheken kümmern zu müssen.

Du kannst eine Eingabemaske nach eigenen Wünschen und Erfordernissen zusammenklicken, ohne die Details zu Rahmen und LayoutManagern und und und zu kennen.

Entscheidende Einschränkung: Wenn Du die so erstellte Eingabemaske im Windowbuilder weiter verwenden möchtest – und Du möchtest das, weil eine Maske selten alleine kommt – dann darf diese Maske nichts anderes sein, als Erbe von JPanel. Sobald ein weiteres Interface implementiert wird, kann der Windowbuilder Dein Panel nicht mehr darstellen.

Beispiel: Ich lasse gui-Komponenten gerne java.util.Observer implementieren. Eine gui-Komponente hat ein Model und stellt diesem Model eine Möglichkeit zum Callback bereit. Aber das versaubeutelt dann leider die weitere Verwendung im Windowbuilder. Schade.

Nachtrag: Die Einschränkung ist nicht uneingeschränkt vorhanden. Auf einm Linux Debian mit eclipse 4.5.2 und Windowbuilder 1.8.0.r45 ist sie nicht zu finden. Glück gehabt ;)

Und, liebe Windows-User, so werdet ihr diese Klippe umschiffen: Die gui-Komponente DatenPanel erbt beispielsweise von JPanel, wie gehabt. DatenPanel hat eine anonyme Klasse, die Observer implementiert. DatenPanel hat ausserdem ein DatenGuiModel, das ein Observable ist. Das DatenGuiModel wrappt ein DatenModel, bei implementieren ein gemeinsames Interface. UML-Skizze:

DSC_7708_klein

Funktionierendes Codebeispiel auf Anfrage.

Veröffentlicht unter Allgemein | Verschlagwortet mit | Kommentare deaktiviert für Windowbuilder Kapriolen

eclipse zaubert Dekorator

Du hast eine Klasse K und möchtest das Observer-Pattern anwenden, beispielsweise um Änderungen der Instanz-Daten an ein gui zu melden. Mit eclipse geht das flott:

1. Nutze Menü “Refactor” – “Extract Interface” für K und erstelle KInterface.

2. Erstelle eine neue Klasse KGui, die von java.util.Observable erbt.

3. Erschaffe eine private Member-Variable k vom Typ K.

4a. Nutze Menü “Source” – “Generate Delegate Methods …” für k in KGui.

4b. Bei den Methoden, die Daten ändern, ergänze setChanged () und notifyObservers (), nachdem die Daten im “Backend”-Objekt geändert wurden.

5. Ergänze KGui um die Angabe “implements KInterface”. Das ist erfüllt, denn in Schritt 4 hast Du dafür gesorgt.

6. Nutze in Deinem Gui die Klasse KGui statt K. Mach das Gui zu einem Observer von KGui, reagiere passend auf update-Meldungen.

Deine Namen für das Interface und die Gui-Klasse werden vielleicht nicht dem obigen Muster folgen. Je mehr Attribute der Datencontainer hat desto mehr stupide Schreibarbeit erledigt eclipse für Dich.

 

Veröffentlicht unter Allgemein | Kommentare deaktiviert für eclipse zaubert Dekorator

Preißel, Stachmann: Git

René Preißel, Bjørn Stachmann: Git. Dezentrale Versionsverwaltung im Team. Grundlagen und Workflows. 3., aktualisierte und erweiterte Auflage. Heidelberg 2016, 327 Seiten, Paperback, 32,90€.

Neulich hat mein Chef dem Team einen Git-Workshop spendiert. Vielen Dank dafür und an den Referenten Bernd Hort. Zum vertiefen, festigen und nachschlagen habe ich das Git-Buch von Preißel und Stachmann ausgesucht.

Die meisten der 31 Kapitel umfassen 10 Seiten oder weniger und gliedern sich in Grundlagen (Kapitel 1-3),  tägliche Arbeit (Kapitel 4-14), Workflows (Kapitel 15-28) und Weiterführendes (Kapitel 29-31).

Im Vorwort finden sich wertvolle Hinweise zum Umgang mit dem Buch: Was muss ich lesen? Was kann ich als fortgeschrittener weglassen? Wo finde ich was? Und sie zeigen, dass sie den Stier Komplexität bei den Hörnern fassen wollen – mit Workflows. Das ist ein pragmatischer Ansatz. Beide Daumen hoch meinerseits, denn es ist genau das, was ich bei Loeliger als fehlend bemängel. Preißel und Stachmann bieten keine Befehlsreferenz – wollen sie auch gar nicht, sondern eine Hilfe für den Projektalltag. Der wird entweder mit der git-Konsole gemeistert oder mit einem GUI, und die zwei erklären, wie’s geht. Bei Klickibunti fiel ihre Wahl auf SourceTree – volle Punktzahl dafür, denn das setzen wir auch bei uns ein.

In der ersten Hälfte des Buches finden sich Erläuterungen zu grundlegenden Funktionen von git. Die einzelnen Kapitel sind in sich abgeschlossen und kurz und knackig ohne, dass es ihnen an Tiefe mangelt. Am Ende steht jeweils eine Zusammenfassung – das ist hilfreich.

Die andere Hälfte des Buchs befasst sich mit dem Thema “Workflows” und zeigt Vorgehen in alltäglichen Situationen: Wie fange ich an? Wann wird ein neuer Branch erstellt? Wie hilft git bei der Fehlersuche? Wie sorgen wir für die Auslieferung unseres Produkts? Was tun, wenn’s unübersichtlich wird? Wie kann man git und cvs gemeinsam nutzen? Wie kann ich auf git umsteigen? Es gibt ein Verzeichnis, das zu jedem beschriebenen Workflow eine aussagestarke Skizze zeigt und jeweils eine ganz kurze Beschreibung – als Gedächtnisstütze bestens geeignet.

Ein kurzes Kapitel behandelt die “Integration mit Jenkins”, anschließend werden noch einige Anregungen gegeben, was git sonst noch so kann: Themen wie “Patches”, “Archive”, “Hooks” und einiges mehr. Das letzte Kapitel behandelt in gewohnter Knackigkeit, wo es bei git hakelt.

Das Layout ist angenehm, keine Bleiwüste, aufgelockert durch Skizzen und “Schritt für Schritt”-Anleitungen. Die “Schritt für Schritt”-Anleitungen sind im Sinne von HowTos verfasst und haben ein eigenes Verzeichnis – toll. In der Marginalspalte finden sich Querverweise – praktisch.

Abgerundet wird das ganzen durch einen brauchbaren Index. Der listet nicht einfach alle Vorkommen aller Begriffe auf, sondern enthält 1) nur die interessanten Begriffe und 2) erwähnt er nur die wichtigen Seiten zum jeweiligen Begriff. So muss es sein.

Negatives? Ja. Die Haptik ist unangenehm, das Buch ist rutschig und kantig. Aber das gibt sich hoffentlich nach einiger Zeit steten Gebrauchs ;) Und es ist ein Paperback. Ein fester Einband wäre mir lieber gewesen.

Fazit: Praxisnah, alltagtauglich, gut zu lesen. Gutes Buch.

Veröffentlicht unter Bibliographie | Kommentare deaktiviert für Preißel, Stachmann: Git

SqlMonitor

Wie bemerkst Du, dass sich ein Wert in einer SQL-Datenbank geändert hat?
Du benutzt ein SQL-Tool, vielleicht Squirrel, und stellst eine passende Abfrage.
Diese Abfrage ungefähr 48 Mal am Tag auszuführen scheint Dir notwendig, aber wenig attraktiv.

Meine Abhilfe für dieses Problem besteht aus drei Teilen:

  • Der erste Teil ist der Scheduler, der für alle Betriebssysteme verfügbar ist. Bei Windows heisst das “Aufgabenplanung” oder “geplante Tasks”, bei Linuxoiden ist es oft “cron”. Wie auch immer es heissen mag: Es ist etwas, das auf Wunsch regelmäßig Programme starten kann.
  • Der zweite Teil ist das Programm, das durch den Scheduler gestartet wird. Dieses Programm ist sehr allgemein gehalten. Es liest eine Konfigurationsdatei ein und “weiss” dadurch, a) zu welcher Datenbank und wie es sich verbinden soll, b) welcher SQL-Befehl ausgeführt werden soll und c) was im Erfolgsfall zu tun. “Erfolgsfall” bedeutet hier, dass der gegebene SQL-Befehl ein nicht-leeres Ergebnis hat. Das “zu tun” ist etwas, das sich als ein Befehl auf der Kommandozeile darstellen läßt, beispielsweise das Senden einer Email.
  • Der dritte Teil ist die Konfigurationsdatei. Sie enthält alle Informationen, die das Programm braucht, um den jeweiligen Job zu erledigen.

Die drei Teile werden kombiniert: Erstelle eine passende Konfigurationsdatei und stelle den Scheduler so ein, dass er das Programm regelmäßig startet und ihm die Konfigurationsdatei als Parameter mitgibt. N unterschiedliche Überwachnungen brauchen dann n geschedulte Aufgaben und n Konfigurationsdateien.

Ich mag dieses Konzept, weil es einfach ist. Es nutzt die Bordmittel des Betriebssystems. Die Konfigurationsdatei ist gut für Menschen erstell- und veränderbar. Das Progrämmelchen selbst ist einfach gestrickt. Und nützlich :-)). Auf Anfrage erhältlich bei Matthias.Kopp@aysx.de.

Veröffentlicht unter Allgemein | Kommentare deaktiviert für SqlMonitor

Programmieren ist …

… wie Motorradfahren.
In der Kurve kommt es nicht darauf an, wieviele PS man hat. Man muss Augenmass haben, die Kurve richtig anfahren, im richtigen Winkel und in der richtigen Geschwindigkeit. Natürlich gibt es viele Fahrstile und “anders” bedeutet nicht zwingend “schlecht”. Eins ist sicher: Viele PS erhöhen weder den Spass noch die Geschwindigkeit, wenn man den Bogen nicht ‘raus hat.
Planung und Umsicht sind das A und O. Ich weiss _vor_ der Kurve, dass und wie ich rauskomme. Manchmal kommt es vor, dass mich etwas überrascht: Tiere, Geröll, sonstwas, das sich versteckt. Da hilft Erfahrung und Fahrkönnen.

Was nutzt ein Zertifikat? Nichts.
Wer will ein Projekt im Blindflug? Niemand.
Was tun, wenn’s brennt? Ruhe bewahren.

Veröffentlicht unter Allgemein | Kommentare deaktiviert für Programmieren ist …

Notes mit Java-GUI und jdbc

Jede Installation von Lotus Notes 8.5 bringt eine Java-Umgebung mit. Das freut, weil ich mehr Java und weniger LotusScript benutzen kann.

Es gilt allerdings, folgendes zu beachten:

* gui: Ich habe eine standalone Anwendung, eine die auch ohne Notes funktioniert. Das Anwendungsfenster ist ein JFrame und nutzt EXIT_ON_CLOSE. EXIT_ON_CLOSE bewirkt ein System.exit() und beendet so die zugrundeliegende Java-VM. Notes verhindert mittels SecurityException, dass irgend jemand anders die VM beendet als Notes selbst. Also implementiere zwei Close-Strategien, eine “normale” und eine für den Notes-Kontext mit JFrame.DISPOSE_ON_CLOSE statt EXIT_ON_CLOSE.

* jdbc: Nutze den ClassLoader einer bereits geladenen Klasse oder eines Objekts. Denn das ist der ClassLoader mit dem passenden Sicherheitskontext. Der Weg mit ClassLoader.getSystemClassLoader() wird standalone funktionieren, aber in Notes fehlschlagen.

* Nebenbei für jdbc: Es ist flexibel, die Jar-Datei mit dem jdbc-Treiber nicht in den Classpath zu legen, sondern den Pfad zu ihr durch den Admin konfigurieren zu lassen. Dann kann man die passende Klasse aus der Jar-Datei nachladen. Aber nicht mit dem ClassLoader des Systems. Und deswegen verweigert der DriverManager – unabdinngbar für jdbc – den Dienst mit dieser Klasse. Abhilfe: Proxy-Pattern benutzen, siehe bei kfu

Veröffentlicht unter Allgemein | Kommentare deaktiviert für Notes mit Java-GUI und jdbc

Netbeans 8.1 und git 1.7.9.5

Wenn ich ein neues Projekt in Netbeans anlege und das dann mit git verwalten möchte, patzt Netbeans, wenn die git-Daten in einem anderen Verzeichnis untergebracht werden sollen als dem Stammverzeichnis des Projekts.

Woran das liegt, habe ich noch nicht herausgefunden. Aber zum Glück gibt es einen einfachen Workaround:

1) Projekt in Netbeans anlegen im Verzeichnis /code/projekte/dasNeueProjekt

2) Git-Verzeichnis im Dateimanager anlegen /repos/projekte/dasNeueProjekt

3) Auf der Shell im Projekt-Verzeichnis den Befehl git init --separate-git-dir /repos/projekte/dasNeueProjekt benutzen.

Netbeans “bemerkt”, dass das Projekt unter Versionsverwaltung steht und das git-Plugin läßt sich ganz wie erwartet benutzen.

Veröffentlicht unter Allgemein | Kommentare deaktiviert für Netbeans 8.1 und git 1.7.9.5