Der Lauf der Zeit

Eine der vielen Anwendungen in unserem Haus schiebt jeden Morgen Daten von A nach B. Dieser Import geschieht einmal täglich. Die Datenmenge ist klein. Änderungen gegenüber dem Vortag liegen im Promille-Bereich  – wenn es überhaupt Änderungen gibt. Bemerkenswert ist, was in der importierenden Datenbank-Maschine geschieht: Jeden Morgen werden drei neue Tabellen angelegt. Die eingelesenen Daten werden dort verteilt abgelegt. Die drei Tabellen von gestern werden umbenannt und erhalten im Namen den Datumsstempel von heute. Klingt bizzar. Ist aber so. Das führt dazu, dass die Datenbank-Datei so lange wächst, bis sie platzt. Wenn das geschieht, ist die Schweinerei  mit der von Mr Creosote vergleichbar.

Was um alles in der Welt hat den Programmierer dazu veranlasst, so zu tun? Er hat das Unternehmen lange verlassen, also scheidet nachfragen aus . Soviel ist klar: Einen fachlichen Hintergrund hat es nicht. Die gesammelten Daten werden nicht verarbeitet, nicht abgefragt oder sonstwie genutzt. Es wird immer mit den tagesaktuellen Daten gearbeitet.

Was folgt? Man muss das Ding einmal im Jahr anfassen und die alten Tabellen entfernen.

Was gelernt? Paare – Lesen und schreiben, starten und stoppen, ying und yang – kommen überall vor. Symmetrie ist ein Metaprinzip in der Programmierung. Erzeugen und Zerstören gehören zusammen.

Abhilfe in Sicht? Offensichtlich wird es helfen, die fehlende Löschroutine zu implementieren. Statt hektisch das Offensichtliche zu tun, denke ich gerne einen Augenblick länger nach. Der Blick über den Tellerrand legt nahe, eine ganz andere neue Implementierung durchzuführen, die sich geschmeidig in die bestehende Infrastruktur einfügt. Der Lauf der Zeit ist unsymmetrisch. Und Zeit ist die Schwester der Entropie.

Veröffentlicht unter Allgemein | Kommentare deaktiviert für Der Lauf der Zeit

Masken für Anfänger

Nur ein fauler Programmierer ist ein guter Programmierer. (Anonymous)

“BASIC” ist die Abkürzung von “Beginner’s All-purpose Symbolic Instruction Code”. In Microsoft’s Office kann man Macros mit VisualBasic, kurz VB, erstellen. Der Name ist anders, der Prinzip dasselbe. Was kann man mit dieser Anfänger-Sprache anstellen? Ein kleines Helferlein in Word programmieren. Ein Beispiel.

Ich habe beschrieben, wie man von Daten in einer Tabelle über die Seriendruck-Funktion zu LotusNotes’ “Structured Text” gelangt. Unabdingbar dazu ist eine Word-Vorlage, die entsprechende Platzhalter hat. In “Hilfe, Seriendruck” habe ich zwei Platzhalter gezeigt, “Name” und “Vorname”. Stell’ Dir vor, da müssen 100 Platzhalter hin. Will ich deren Bezeichner von Hand eintippen? Nein, denn das ist a) fehlerträchtig und b) langweilig. Also schnell etwas Code gezaubert, der das erledigt.

Vorgehen:

Ich habe eine Textdatei. In jeder Zeile steht nichts ausser einem Bezeichner. Ziel ist, nach dem Bezeichner einen Doppelpunkt, ein Leerzeichen und einen Platzhalter gleichen Namens zu ergänzen. Das erledigt das folgende Makro, wenn der Cursor vor dem Makro-Aufruf oben links im Dokument steht.

Das charmante an VB ist, dass man keine Ahnung von VB haben muss, um in VB zu programmieren. Es reicht aus, eine echte Programmiersprache zu beherrschen. Anfänger sollten C oder C++ oder Java lernen.

Veröffentlicht unter Allgemein | Kommentare deaktiviert für Masken für Anfänger

Hilfe, Seriendruck!

Wie immer brennt der Boden. “Das muss jetzt schnell gehen: Bitte bring die Daten aus einer Microsoft Access-Tabelle nach Lotus Notes. Programmier’ halt ‘was …”

Erster Ansatz: Export als csv. Problem: Ich finde kein geeignetes Trennzeichen. Die Daten sind alt und “schmutzig”. Damals hat sich niemand über erlaubte und unerlaubte Zeichen Gedanken gemacht. Sackgasse.

Zweiter Versuch: Lotus Notes importiert etwas, das in der Notes-Sprache “Structured Text” genannt wird. Ein Structured Text enthält Blöcke von Schlüsselwort-Wert-Paaren. Die Struktur eines Blocks ist immer gleich. Sie besteht aus beliebig vielen Schlüsselworten, jedes in einer eigenen Zeile, mit dem zugehörenden Wert dahinter. Die Schlüsselworte wiederholen sich in jedem Block, die Werte können in jedem Block unterschiedlich sein. Die Blöcke sind voneinander durch ein besonderes Zeichen getrennt, meistens benutzt man dazu ASCII dez 12, hex 0c, aka “FormFeed” aka “Seitenumbruch”. Jeder importierte Block wird zu einem Notes-Dokument.

Im folgenden Beispiel kann das Zeichen für “Seitenumbruch” nicht dargestellt werden, deswegen schreibe ich statt dessen “(S)”.

Name: Rilke
Vorname: Rainer Maria
(S)
Name: Uhland
Vorname: Ludwig
(S)
Name: Allesch
Vorname: Elly

Wie komme ich von einer Tabelle mit tausenden Zeilen, die Name und Vorname in jeweils einer Zeile enthält zu einer Darstellung als Structured Text? Die Überschrift legt es nahe: Ich habe Microsoft Word’s Seriendruck-Funktion genutzt. Die kann Access-Datenbanken ansprechen und liefert das gewünschte Ergebnis. Als Vorlage habe ich etwas benutzt, das in Word ungefähr so aussieht:

Name: <<Name>>
Vorname: <<Vorname>>
(S)

In dieser Vorlage erkennt man das wieder, was ich oben “Block” genannt habe. Nach den Schlüsselworten “Name” und “Vorname” folgen Doppelpunkt und Leerzeichen und danach ein Platzhalter für den echten jeweiligen Wert aus der Tabellenzeile. Der Seriendruck kombiniert diese Vorlage mit den Tabellendaten und schreibt seine Ausgabe in eine neue Datei. Und diese neue Datei ist eben genau so, wie Lotus Notes sie für den Import von Structured Text braucht.

Ich will nicht lügen. Die Datei musste angepasst werden, ebenso die notwendige Notes-Maske. Problem ist, dass Notes versucht, schlau zu sein. Wenn es von einem importierten Wert meint, er sei eine Zahl, und ich will nicht, dass dieser Wert als Zahl interpretiert wird, dann muss ich tricksen: Die nicht-Zahl-Werte bekommen ein Dollar-Zeichen vorangestellt. Das veranlasst Notes, den Wert als Zeichenkette zu interpretieren. Aber nun ist der Wert falsch! “$3.2001″ ist ganz anders als “3.2001”. Das Dollar-Zeichen wird durch eine Eingabeumsetzung in der Notes-Maske entfernt. Beim Import muss deshalb die Option “Felder erneut berechnen” aktiviert sein. Details, Details …

Ich bin Programmierer und deswegen immer froh, wenn mein Chef Programmierung verlangt. Aber Denksport und Tüfteln mag ich auch. Wenn ich so einen Eigenlob-stinkt-pfiffigen Weg finde, dann ausnahmsweise ;-) ohne Programmierung. Ausserdem denke ich, dass dies ein allgemeiner Weg ist, um von relationalen Daten zu NoSQL-Daten zu kommen.

Veröffentlicht unter Allgemein | Kommentare deaktiviert für Hilfe, Seriendruck!

Watt is n Dampfmaschin

In der objektorientierten Art zu programmieren gibt es zwischen Klassen die Beziehung “ist ein”. Diese Beziehung wird in Krüger’s Handbuch der Javaprogrammierung anhand eines Beispiels im Umfeld von Automobilien erklärt: Ein Cabrio ist ein Auto. So entsteht eine Vererbungshierachie – die Klasse “Auto” steht in dieser Hierarchie höher als die Klasse “Cabrio”, technische Details sind in Kapitel 9 nachzulesen.

Und was ist ein Auto? Als Philosophie-Interessierter kennt man die Möglichkeiten unendlicher Fragerei. Ich kann mich leider nicht mehr an die Quelle folgender Geschichte erinnern: Ein westlicher Geistlicher fragt einen indischen Guru, wie die Welt beschaffen sei. “Nun”, sagt der, “die Welt wird von einer Schildkröte getragen.”

Geistlicher: Und was ist unter der Schildkröte?
Guru: Ein weisser Elefant.
Geistlicher: Und unter dem Elefanten?
Guru: Na, wieder ein weisser Elefant.
Geistlicher: Und was ist unter  d i e s e m  Elefanten? (Der Geistliche denkt, dass der den Guru jetzt intellektuell ‘drankriegt)
Guru: Sie können ganz beruhigt sein. Es sind lauter weisse Elefanten – bis ganz unten hin.

So ein “ganz unten” ist oft gern gesehen, ob als Weltfundament oder als Möglichkeit, die Welt aus den Angeln zu heben. Java beantwortet die Frage profan: In der Hierarchie ganz oben steht die Klasse “Object”.
Objektorientierung ist gut und schön. Aber oft interessiert mich die Vererbungshierachie gar nicht. Wenn ich ein Objekt vor mir habe, dann will ich meistens wissen, was “es kann”, was “es tut”, was es mir “bietet”. Und ich frage nach dem, was passiert, wenn ich ein Objekt dieser Klasse so-und-so nutze. Kurz: Mich interessiert das Verhalten eines Objekts.

Sprung in die Arbeitswelt: Heute wurde ich mit einer mir neuen extrem bizarren, komplizierten Fachanwendung konfrontiert. Voll von Wenns und Abers und Regeln, die mir willkürlich erscheinen. Zudem scheinen diese Regeln willkürlichen Änderungen unterworfen zu sein. Systematisieren lassen sich die Regeln nicht, und die Anwendung/ der bisherige Programmierer tut sein bestes, alles unter einen Hut zu bringen. Aber die Anwender sind nie zufrieden. Wie einfach ist ein Passwort-Generator!

Die schlichte Eleganz von Java-Konzepten, die Einfachheit des Passwort-Generators und die Kompliziertheit der Fachanwendung, für die ich bald verantwortlich sein werde, brachten mich auf folgenden Gedanken:  Auf die Frage nach dem Wesen des Menschen könnte man Verhalten als den Archimedischen Punkt benutzen – “Behaviorismus” wäre wohl ein passender Name für diesen Ansatz … gibt es schon ;)

Was kann man zum menschlichen Verhalten im allgemeinen sagen? Der Mensch stoffwechselt und stirbt irgendwann, frei nach dem Motto “man muss nur sterben und auf’s Klo”. Und sonst? Natürlich noch so viel, dass es Bibliotheken füllt. Aber das geht immer damit einher, vom Bereich der Biologie in den der Kultur zu wechseln.
Programmieren gehört in den Bereich Natur und Technik. Hier “funktioniert” Programmierung – es ist sinnvoll, nach einem Programm zu suchen. Sobald man diesen Bereich verläßt, wird es müssig, nach einer immer gültigen Form zu suchen, denn diese Form gibt es nicht. Und ich muss sagen: Zum Glück. Solange Anforderungen kompliziert sind und sich ändern, so lange habe ich Arbeit. Schön zu wissen, dass diese Sisyphos-Arbeit in der besten aller Welten stattfindet.

Ohne gesucht zu haben fand ich einen interessanten Artikel und ein Online-Buch, das mir lesenswert scheint.

Veröffentlicht unter Allgemein | Kommentare deaktiviert für Watt is n Dampfmaschin

Immer wieder Sonntags …

Eine Technik, die der Programmierungs-Adept sehr früh lernt, ist einen Ablauf mit einem Namen zu versehen. So muss man den Quelltext nur einmal schreiben und kann ihn immer wieder verwenden. Beispiel: Statt immer wieder m/(s*s) zu schreiben erstellt man eine Funktion beschleunigung (m, s). Dann implementiert man diese Funktion, so dass sie eben genau diese Rechnung ausführt. Man muss sich nicht an die konkrete Formel erinnern, sondern nur an den Namen der Funktion. Überall, wo ein Beschleunigungswert errechnet werden soll, kann man die Funkion benutzen. Um die Bedeutung der Parameter m und s zu wissen, schaut man in der Dokumentation der Funktion nach.

Eine weitere “frühe” Technik ist die Wiederholung, aka Schleife, aka Iteration. Zweck davon ist es, einen bestimmten Ablauf viele Male durchzuführen, ohne es jedes Mal explizit auszuformulieren. Beispiel:
Brot kaufen!
Brot kaufen!
Brot kaufen!
Brot kaufen!
Brot kaufen!
kann man auch mit Hilfe einer Iteration formulieren:
Tue dies fünf mal:
Brot kaufen!

Ein echter Kracher ist, daß man die beiden Techniken kombinieren kann. Statt Brot kaufen! kann ich für eine Reihe von unterschiedlichen Paaren von Strecken m und Zeiten s errechnen, wie groß jeweils beschleunigung (m, s) ist.
Für alle (m, s) aus einer Menge P tue dies:
beschleunigung (m, s)

Tolle Sache. Der herauskristallisierte Ablauf ist die Grundlage für etliche weitere Berechungen. Der “Kern” der Lösung ist das einzelne Verfahren, die Iteration ist eine Ausprägung der Anwendung des Verfahrens.

In Lotus Notes beschäftige ich mich gerade mit
Für alle Dokumente d aus einer Menge V tue dies:
schreibePdfDatei ( d )

Reflexartig habe ich es so aufgebaut, wie die obige Beschreibung es nahe legt. Grundgedanke “Wenn ich in der Lage bin, das PDF für ein Dokument zu erzeugen, dann kann ich darüber beliebig oft iterieren”.

Wo ist der Haken

Ein PDF zu erzeugen braucht sehr lange Zeit, weil etliche Initialisierungen stattfinden. Deswegen habe ich das Pferd von hinten aufgezäumt: Das allgemeine Verfahren erzeugt PDF-Dateien für eine ganze Latte von Dokumenten. Und es kann vorkommen, daß “die ganz Latte” nur ein einziges Dokument enthält. Der Einzelfall wird verstanden als Besonderheit der Iteration. Da lugt wieder die Symmetrie um die Ecke. ‘Mag das.

Wenn man immer zuerst eine Liste erzeugen muss, um ein Verfahren auf Elemente anwenden zu können, dann ist das für den Programmierer unkomfortabel. Aber wenn man sowieso meistens mit Listen von Elementen arbeitet, so wie in diesem Fall, dann ist das kein Argument gegen so eine Implementierung. Und es lohnt sich, weil die Laufzeit enorm verkürzt wird.

Schlager sind Texte …

… die gesungen werden müssen, weil sie zu blöd sind, um gesprochen zu werden. Meine Oma hat sich immer über Zeilen wie diese aufgeregt: “das Mädel kennst du doch // Die ist kaum 13 Jahr …“. “Das Mädchen. ES! ist kaum …”, sagte sie immer. Wie auch immer – kommen die Musikanten zu uns oder wir zu denen? Kann beides zugleich immer wieder Sonntags geschehen?

Veröffentlicht unter Allgemein | Kommentare deaktiviert für Immer wieder Sonntags …

Schnittstelle und Konfiguration

Was ist eine Schnittstelle?

Eine Schnittstelle ist die Möglichkeit, zwei Systeme miteinander zu verbinden.

Ich verwende hier eine naive Vorstellung von “System”, im Hinterkopf habe ich immer Software-Bestandteile. Vermutlich passen die Aussagen auf alle technischen Artefakte.

Warum verbindet man zwei Systeme?

Damit das eine System das andere System nutzen kann.

Beispiel: Wandsteckdose für 220V im Wohnzimmer. Die Dose ist eine Schnittstelle. Sie ermöglicht es, ein elektrisches Gerät (das eine System) an das Stromnetz (das andere System) anzuschließen. Die Gegenseite, der Stecker, gehört zu einer anderen Schnittstelle, denn für die Beschreibung der Wandsteckdose ist es unwichtig, ob ein Kaltgerätestecker, ein Eurostecker oder zwei blanke Drähte verwendet werden, um das System “Stromnetz” zu nutzen.

Problem: unabsichtliche Änderungen an der Schnittstelle.

Beispiel für so ein Problem: Es gehört wesentlich zur Beschreibung der Schnittstelle “Wandsteckdose”, dass dort 220V Wechselstrom anliegen. Man kann sich leicht die Katastrophe vorstellen, wenn plötzlich 440V dort anliegen. Und genau das habe ich im Arbeitsalltag schon erlebt – bildlich gesprochen.

Ursache: Man sieht der Schnittstelle nicht an, dass es eine Schnittstelle ist, ob und wie sie genutzt wird. In der Software-Komponente, die die Schnittstelle enhält, wird die Schnittstelle nicht genutzt. Ist das Kunst oder kann das weg? Man versteht nicht, warum ein bestimmtes technisches Artefakt vorhanden ist. Dokumentation fehlt natürlich, der letzte ursprüngliche Programmierer hat längst das Unternehmen verlassen – also weg damit, denn es ist für nichts zu gebrauchen. Drei Tage später macht es an einer unerwarteten Stelle “Peng” und alle schauen sich fragend an. Konkret: Änderung eines Ansicht-Namens in einem Lotus-Notes-System.

Die erste und einfachste Art der Abhilfe ist Dokumentation. Aber aufmerksam geworden bin ich auf dieses Thema, weil mir ein Kniff untergekommen ist: Man denke sich ein System A, das eine Schnittstelle anbietet und ein System B, das sie nutzt. Und es gibt Konfigurationsdateien für beide Systeme. In der Konfiguration für System B sind Parameter für die Nutzung von System A hinterlegt. Das dokumentiert ausserhalb von System B, dass es System A nutzt. Ausserdem liegen die Konfigurationsdateien an einer gemeinsamen Stelle. Anstatt grossse Mengen Quelltext zu durchforsten muss ich auf die Idee kommen, einen Blick auf die Konfigurationen zu werfen.
Sehr schön wäre eine sich selbst beschreibende Schnittstelle.

“Ordnung braucht nur der Dumme, das Genie beherrscht das Chaos” – Albert Einstein.
Küsschen, Albert.

Veröffentlicht unter Allgemein | Kommentare deaktiviert für Schnittstelle und Konfiguration

Passwort-Generator

“Matthias”, sagte mein Chef, “wir brauchen mal eben einen Passwort-Generator” und schickte mir diese Anforderungen

Das ist nicht schwer, oder? Die Kommentare im Java-Quelltext sind etwas ausführlicher als für mich üblich, weil ich hoffe, es allgemein unterhaltsam zu machen. LotusScript ist unkommentiert – quick’n’dirty.

Der gezeigte Java-Quelltext entstand, nachdem ich die Aufgabe in LotusScript erledigt hatte. Die Variante in Java gefällt mir, weil sie deutlich zeigt, welche Anforderungen erfüllt werden. Der Quelltext in Java ist viel länger – das kann man als Nachteil werten. Aber er ist flexibler – dem LotusScript-Code kann man wegen der Starrheit keinen Vorwurf machen, denn schließlich musste es fertig werden.

Im grossen und ganzen beruhen beide auf derselben Idee, man erkennt viele Ähnlichkeiten, beispielsweise Definition der Menge auszuwählender Zeichen, beispielsweise zufallsgeleitetes finden einer freien Position.

WordPress erlaubt es mir nicht, jar-Dateien hochzuladen. What a crap! Anyway, hier ist der Quelltext. Du willst diesen Code benutzen? Erzeuge ein PasswordGenerator-Objekt und rufe getPassword auf. Deadsimple.

Im folgenden die wichtigsten Klassen.

PasswordGenerator

Konstanten

Auffueller

Bedingungserfueller

Die konkreten Implementierungen von Auffueller und Bedingserfueller finden sich in der jar-Datei.

Und nun zu etwas ganz anderem: Ein Password-Generator in LotusScript. Entstanden ist er nach einer Skizze an der Tafel. So sind einige Grobheiten enthalten, Beispiel die Variablen S, T, G, K, Z, die zugehörenden *unten und *oben und deren Initialisierung. Die Java-Implementierung hat davon “gelernt”. Änderungen werden an diesem Quelltext nicht mehr vorgenommen: Er funktioniert, ist ausreichend schnell und leserlich, so daß auch die Kollegen ihn warten können. Mission erfüllt.

Im LotusScript hat man einen guten Überblick über den gesamten konkreten Algorithmus, in Java erkennt man nur Umrisse. Die Java-Klassen kann ich an anderer Stelle wiederverwenden a) falls so etwas wieder gebraucht wird – mit der Perspektive “nie” und b) falls ich mich daran erinnere, dass die genau passenden Klassen genau hier zu finden sind. Das LotusScript ist “nur” als ganzes wiederverwendbar. Nur weil es nicht objektorientiert ist, heisst das nicht, dass es schlecht ist. Just because you’re paranoid it don’t mean they’re not after you. Have a nice day.

Veröffentlicht unter Allgemein | Verschlagwortet mit , , , | Kommentare deaktiviert für Passwort-Generator

sepa-Datei in csv umwandeln

Buchhalter lieben LibreOfficeCalc und andere Tabellenkalkulationen. Die Maschinen im Kreditinstitut lieben sepa. Eine Webanwendung bei einem Kunden erzeugt eine sepa-Datei,  die anschließend an das Kreditinistitut übermittelt wird. Nun möchte der Buchhalter wissen, was in der sepa-Datei steht, möchte die Buchungen überprüfen etcpp. Mach’ ‘mal ‘nen Plan!

Woher die Daten nehmen?

Ich denke, es gibt zwei Herangehensweisen: Die sepa-Datei hat eine Datenbasis, wesentlich SQL-Daten. Also könnte man eine Datei aufgrund derselben Datenbasis erzeugen. Oder man könnte die sepa-Datei als Datenbasis benutzen und umwandeln. Welches ist der bessere Weg? Ich weiss es nicht, aber aus Erfahrung weiss ich, dass manchmal unvorhergesehene Verhaltensweisen erscheinen – besonders im Umgang mit Altlasten-Code. Also entscheide ich mich für den Weg von der sepa-Datei zur Datei für die Tabellenkalkulation. Der Buchhalter will genau die Daten betrachten, die in der sepa-Datei sind, deswegen wähle ich eben diese als Ausangspunkt.

Zielformat?

In welches Format soll die sepa-Datei umgewandelt werden? Die neueren LibreOffice-Anwendungen haben offengelegte xml-Formate. Andere Formate liegen offen, sind aber höllisch kompliziert. Wieder andere liegen nicht offen. Was tun? Es liegt nahe, ein möglichst “allgemeinverständliches” Format zu nutzen – und da gibt es aus der Pionierzeit der Datenverarbeitung das CSV-Format.

 Programmiersprache?

Die  Anwendung ist in PHP programmiert. PHP stellt Mittel zur Verfügung, xml-Dateien zu verarbeiten. Programmiere ich deswegen in PHP? Nein. Ich erstelle eine xml-Transformation mittels xslt. Die kann ich “überall” benutzen: Auf der Shell, in PHP, in Java und vermutlich in vielen anderen Programmiersprachen.

Das “nein” von oben muss ich relativieren: Die Hauptarbeit wird vom einem xml/xsl-Prozessor erledigt. PHP selbst nutzt dazu libxslt. Und ich nutzte PHP, um die Transformation aufzurufen und für das Drumherum, damit die Transformation in der Web-Anwendung des Kunden verfügbar ist.

Software lebt

und geht seltsame Wege. Die Webanwendung ist uralt, gemessen in IT-Innovationszyklen. Der Wunsch nach einer sepa-Datei ist ziemlich neu – aus dem Jahr 2013. Der Wunsch nach einer anderen Dastellung der sepa-Datei ist noch neuer. Schritt für Schritt wird die Anwendung verändert. Wenn man sich nach vielen Jahren den Code anschaut, dann wird man an etlichen Stellen verständnislos mit dem Kopf schütteln. Auf die Frage nach den Gründen werde ich immer wieder “historisch gewachsen” hören. Maintenance ist das Brot des Programmierers. Ein Weltgeist ist mir dabei noch nie begegnet.

 

Veröffentlicht unter Allgemein | Verschlagwortet mit , , , , | Kommentare deaktiviert für sepa-Datei in csv umwandeln

Netbeans und .svn

Ich benutze gelegentlich NetBeans. Eben konnte ich eine Datei öffnen und verändern, aber die Änderungen wurden nicht gespeichert. Zugriffsrechte? – In Ordnung. Zeichencodierung? – In Ordnung. Editieren mit vim? Problemlos möglich! Warum zur Hölle macht NetBeans keinerlei Anstalten, die geänderte Datei zu speichern?!?

gidf, ich weiss. Aber die Ergebnisse sind nichtssagend, helfen nicht weiter. Hrmpf. Die Ursache fand ich mehr durch Intuition und einen Shell-Befehl, weniger durch Nachdenken. Der Shell-Befehl war

vulgo: Zeig’ mir mal ganz genau alle Verzeichnisse – vielleicht stimmt irgendwo was mit den Zugriffsrechten nicht.

Da waren auch svn-Unterverzeichnisse – klar, weil außer-aysx’scher Quelltext. Habe diese Verzeichnisse entfernt. Speichern möglich. Comme c’est etrange, comme c’est bizarre, quelle coincidence.

Veröffentlicht unter Allgemein | Kommentare deaktiviert für Netbeans und .svn

git verschieben

Lotus Notes und git

Programmieren ohne Quelltextverwaltung macht jedem Entwickler das Leben schwer. Die Entwicklungsumgebung von Lotus Notes und die organisatorischen Umstände tragen in meinem Alltag das ihre dazu bei. Meine Omma und Camus meinen “Jeder hat es selbst am schwersten”. Und Sisyphos muss man sich als glücklichen Menschen vorstellen – vielen Dank für diesen Tipp, Albert. Wie werde ich ein glücklicher Sisyphos?

Im Lotus-Notes-Bereich muss ich mich selbst darum kümmern, Versionsstände meiner Quelltexte nachzuhalten. Und ich bekomme dafür keine zusätzlichen Resourcen, keinen SVN-Server o.ä. Also liegt es nahe, git einzusetzen. Die Repositories liegen auf meinem PC, ich schiebe sie regelmäßig in das Sicherungsverzeichnis.

Eine Datenbank von Lotus-Notes ist ein Binärfile und darin enthaltene Programmierungen stehen nicht “einfach so” als Quelltext zur Verfügung, sondern nur im Lotus-Notes-Designer. Abhilfe schafft die Möglichkeit, das Design einer Datenbank inklusive Programmierung auf die Festplatte zu schreiben – diese Feature nennt sich “on-disk-project”. Damit lesbarer Quelltext rausgeschrieben wird, bedarf es einer Einstellung: Gehe zu “Vorgaben” – “Domino Designer” – “Quellcodeverwaltung” und deaktiviere die Option “Binäres DXL zur Quelltextverwaltung verwenden”. Anschließend kann man ein Notes-Design mit einem On-Disc-Project verknüpfen. In dem entstehenden Dateibaum kann man dann wie gewohnt mit git arbeiten.

Obacht: Das on-disc-project schreibt nicht nur auf die Platte, es liest auch Veränderung ein. So wird das versteckte git-Verzeichnis in das Projekt integriert. Das bläht das Projekt auf der Notes-Seite auf, und das führt wiederum zu längeren Ladezeiten. Es gibt einen Schalter, der den Abgleich beschränkt auf die Richtung vom nsf zum git-Repository, aber das ist keine Option, weil es mir verbietet, den Quelltext ausserhalb von Notes zu bearbeiten. Zum Glück kann man ein git-Repository hinlegen, wo es einem in den Kram passt. git hat dafür beim init-Befehl die Option “–separate-git-dir”. Sie legt das versteckte git-Verzeichnis an eine konfigurierbare Stelle. Im Datenverzeichnis selbst wird lediglich ein Hinweis darauf hinterlassen, wo git das versteckte Verzeichnis findet. Der Clou: Wenn das init mit dieser Option in einem bestehenden Repository aufgerufen wird, dann verschiebt git das versteckte Verzeichnis. Da hat jemand mitgedacht – muß ein Programmierer gewesen sein, der ein Kratzen am A…h gelindert hat. Auch an meinem. Dank dafür.

Veröffentlicht unter Allgemein | Kommentare deaktiviert für git verschieben