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

MVC als EVA

kurz

Das Design-Pattern Model-View-Controller, kurz MVC, kann man sich als objektorientierte Ausprägung des allgemeinen Ablaufs von Eingabe, Verarbeitung und Ausgabe, kurz EVA, denken. Model bedeutet Verarbeitung, View Ausgabe und Controller Eingabe. Der Controller ist vom Model(-Interface) abhängig und der View beobachtet das Model.

Motivation
———

Ich arbeite gerade an einem Projekt, bei dem ein GUI im Spiel sein wird und natürlich auch Unit-Tests. Die Frage der klugen Aufteilung der Aufgaben stellt sich immer, und im Internet findet sich nur wenig wirklich hilfreiches und verständliches zum Thema MVC.

Beispiel für ein Model: Calcer
——————————

Nehmen wir als Beispiel ein taschenrechnerartiges Dings, genannt Calcer. Ein Calcer-Objekt bekommt als Eingabe zwei ganze Zahlen a und b. Ein Calcer habe eine Methode “calc”, die die Verarbeitung besorgt und vier Methoden, die unterschiedliche Ergebnisse aus a und b geben: getMul, getDiv, getAdd, getSub für Multiplikation, Division, Addition und Subtraktion.

Nebenbei: Wie das Modell, Calcer, seine Aufgabe erledigt, das interessiert hier nicht. Vielleicht googlet es, vielleicht implementiert es eigene Arithmetik-Routinen, vielleicht und wahrscheinlich benutzt es Möglichkeiten der zugrundeliegenden Programmiersprache. Man nennt das “Kapselung”.

Calcer ist ein Beispiel für ein Modell. Es nimmt Eingaben entgegen, aber “wer” die Eingaben macht, woher diese Eingaben kommen, das spielt keine Rolle. Man kann auch sagen: Calcer, das Modell, ist von den Eingaben unabhängig. Das ist gut und gewollt: So kann ich das immer dasselbe Modell benutzen, auch wenn ich unterschiedliche Eingabe-Arten benutze.

Und Calcer ist von Ausgaben unabhängig. Ein Calcer stellt Ergebnisse zur Verfügung. Ob diese Ergebnisse abgerufen werden, das “interessiert” einen Calcer nicht. Die Ergebnisse sind da. Basta.

Beispiele für Eingabe-Arten
—————————

Wenn ein Mensch einen Calcer benutzen möchte, dann wird das entweder mit einem GUI geschehen, oder mittels einer Konsole, beispielsweise der bash. Der Einfachheit halber und ohne Beschränkung der Allgemeinheit soll das reichen.

Für jede gewünschte Eingabe-Art werde ich eine eigene Klasse erschaffen. Hier also einen ConsoleController und einen GuiController. Der ConsoleController wird wohl die eingetippten Daten lesen und weitergeben, nachdem der User “Return” gedrückt hat. Der GuiController könnte zwei Felder haben, für jede Zahl eins und dann noch einen Button, der die Berechnung anstößt.

Eine andere Art ist eine Anfrage/ Nachricht die mittels Netzwerk an einen Server gestellt wird. Da wechseln Details, aber das Prinzip bleibt.

Beispiele für Ausgabe-Arten
—————————

Siehe oben “Beispiele für Eingabe-Arten”. Wer ein GUI benutzt, der möchte dort auch das Ergebnis sehen, entsprechendes gilt für die Konsolieros. Und genau wie oben wird es entsprechende unterschiedliche Klassen geben. Ein ConsoleView wird immer wieder vier Zeilen ausgeben, eine für jedes Ergebnis. Ein GuiView könnte vier Felder enthalten, deren Inhalt nach der Verarbeitung erneuert wird.

Konzept getrennt, Realisierung vereint
————————————–

Gleichgültig, ob mit Konsole oder Fenster gearbeitet wird: Der Mensch vor der Maschine merkt nicht, dass intern unterschiedliche Klassen werkeln, eine, die Eingaben entgegen nimmt, eine andere die verarbeitet, eine dritte, die Ausgaben macht. Er benutzt einen Calcer und freut sich über die Ergebnisse.

Wer kennt wen?
————–

Oben habe ich herausgestellt, dass das Model, Calcer, von Eingaben und Ausgaben unabhängig ist. Es “kennt” weder die Eingabe- noch die Ausgabe-Klassen. Aber irgendwelche Abhängigkeiten müssen bestehen, denn sonst ist keine Zusammenarbeit möglich. Also: Wer kennt wen?
Die Eingabe, sprich der Controller, kennt das Model. Denn der Controller “füttert” das Model mit Daten und “bedient” es, leitet User-Wünsche an das Model weiter. Und das ist auch schon alles.

Und – häh?!?! – wie kommen die Ergebnisse der Verarbeitung in die Ausgabe? Gute Frage, junger Padawan, Du hast gestellt. Einfach die Antwort ist: Observer-Pattern.

Fazit
—–

Im Internet finden sich andere Herangehensweisen an MVC. Mich überzeugt der dargestellte Ansatz wegen minimaler Kopplung und klarer Aufgabentrennung. Offene Fragen bleiben. Wer regelt das Zusammenspiel von Model, View und Controller? Oft ist die Antwort: Der Controller. Aber man kann sich auch ein viertes Element denken, etwa in der Art des Mediator-Patterns. Wer “sorgt” sich um die Validierung der Eingabe? Das Model? Der Controller? Vielleicht ein viertes. Wie kann der Controller eine Meldung an den User machen? Muss er das? Mach’ es halt clever. Aber nicht zu clever.

Veröffentlicht unter Allgemein | Kommentare deaktiviert für MVC als EVA

Frage kennen, Antwort verstehen

In der Philosophologie ist es so, dass es leichter fällt eine Antwort zu verstehen, wenn man die Frage kennt. Wenn man nur mit der Antwort konfrontiert wird, dann erscheint die oft bizzar.

Objektorientierte Programmierung und Objektorientierte Analyse und Design scheinen machen Menschen unnötig, kompliziert, neumodisches Zeugs. “Objektorientiert” ist eine Anwort. Die Frage lautet “Wie bohre ich mir bei der Entwicklung von Software möglichst wenig ins Knie?”.

Veröffentlicht unter Allgemein | Kommentare deaktiviert für Frage kennen, Antwort verstehen

Zettel, Stift, Journal

Um eine Idee zu skizzieren brauche ich Zettel und Stift. Beides trage ich immer bei mir, in der hinteren Hosentasche. Am Ende des Tages übertrage ich die Skizzen in ein gebundenes Journal.

Zettel in der Hosentasche werden schnell unansehnlich oder zerfetzt. Um dem entgegen zu wirken nutze ich (Alt-)Papier, gefaltet wie ein PocketMod. Das bringt Stabilität und Ordnung. Anders als beim PocketMod lasse ich die Mini-Seiten unbeschriftet. Es bietet sich an, Altpapier wiederzuverwenden, weil man bei der PocketMod-Faltung sowieso nur eine Seite des A4-Blattes nutzt. Neben den Skizzen finden auch Termine und Einkaufslisten Platz.

Einen passenden Stift zu finden, ist nicht einfach, denn die meisten sind zu lang. Ein Kuli ist entweder unbequem oder zerbricht. Ein Bleistift ist keine schlechte Wahl, weil die Länge anpassbar ist und er immer funktioniert. Aber die Kohlestriche verschwinden mal schneller, mal langsamer. Im Moment nutze ich Nachfüllmienen für Stabilo Easy Start.

Kladde: A5, blanko oder kariert, 96 Blatt oder ähnliches. Die Seiten sind nummeriert, meistens eigenhändig.

In der Kladde gibt es Einträge, deren Umfang wächst, Beispiele Inhaltsverzeichnis, Glossar und Literaturliste. Das bekomme ich mit einer gängigen Datenstruktur in den Griff: der verketteten Liste. Im Inhaltsverzeichnis steht die erste Seite des Eintrags. Am Ende des Eintrags steht ein Verweis auf die Fortsetzungsseite. Auf der Fortsetzungsseite steht wieder der Titel der Eintrags mit dem Zusatz “(Forts.)”. Beispiel: Glossar auf Seite 5, Fortsetzung auf Seite 15, dann verweist S. 5 auf S. 15, Seite 15 hat den Titel “Glossar (Fort.)” und wird nicht im Inhaltsverzeichnis gelistet.

So hilft Informatik im Alltag. Was ist hier das Ei und was die Henne?

Veröffentlicht unter Allgemein | Kommentare deaktiviert für Zettel, Stift, Journal