Blog

Archiv

Nachfolgende Einträge


Archiv 2004, Januar, ab 16.

Nihil tam difficile est, quin quaerendo investigari possit


31.01.2004

Esse est percipi:
Sein ist gesehen werden

Einzelkämpferdasein.

Du musst alles und jedes können – oder wenigstens rasch lernen. So vergehen die Tage, ohne dem erstrebten Ziel näher zu kommen. Ist ein überzeugender Grund für Arbeitsteilung im System, nicht wahr? Die Masse an Informationen zu bewältigen ist Arbeit und Arbeit auf besonders geeignete Objekte zu verteilen, um sie dem System effektiv nutzbar zu machen, ist keinesfalls nur Objektorientierung oder Software oder ESA – es ist tatsächlich das Grundmuster allen Lebens, ob es nun die Organe im Körper oder in einer Firma oder die Gemeinschaft in kleinen Dörfern ist, es ist immer dasselbe: Viele teilen sich die Aufgabe und kommunizieren nur die wesentlichen, weil aus der Masse extrahierten und passend aufbereiteten Elemente, was die Gesamtbelastung pro Teilsystem mindert.

Na gut, ich bin nun mal nicht Teil eines Systems, das mir Arbeiten abnehmen kann, um die Effizienz zu erhöhen.

Was es heute war? Nun, ich blogge schließlich aus einem bestimmten Grund, ich möchte etwas zeigen. Wenn aber niemand es finden kann, kann ich auch nichts zeigen. Also beschäftige ich mich schon die ganze Zeit mit Rankings von Suchmaschinen - war bisher erfolglos, wobei ich im Moment eher noch auf den Aktualisierungsrhythmus der Search Engines vertraue und noch nicht befürchte, völlig negiert zu werden.

So wie es aussieht, muss ich andernfalls ein ganz normales Blog-Dasein aufbauen, wobei ich bei BloggerTM die Möglichkeit gefunden habe, meine eigene Site zu versorgen. Aber – und sollte dies jemals jemand lesen, dann bitte ich um Gnade – es ist ein amerikanisches System und obwohl die Betreiber versprechen, Privatsphäre zu achten, bestätigen sie natürlich, dass sie dies nur innerhalb der Gesetze tun können. Gesetz ist freilich auch der Patriots Act und nachdem sogar die Hotels in Las Vegas ihre gesamte Kundschaft über die Silvesterferien an die amerikanische Polizei melden mussten (und es wohl bis auf eines auch widerspruchslos taten), ist mir die Sache einfach ein wenig suspekt. Ich mag nicht gerne bespitzelt werden und der Eifer, mit dem EbayTM und OracleTM ihren Datenschutz der Politik opfern sollen, ist mir zuwider. Auch in Zeiten des maschinellen Informationstransfers sollten Menschen die höchstmögliche Verfügungsgewalt über die eigenen Informationen selbst innehaben – es lebe der Datenschutz!

Ist ein Widerspruch in sich, ich weiß.

Einerseits will ich gefunden werden können, andererseits mag ich zuviel Aufmerksamkeit nicht. Ich verschiebe das Problem einfach noch ein Weilchen. Vielleicht fällt mir ja etwas ein oder es tut sich was oder ich finde noch ein interessantes Tool – für die Kommentare ist mir schon eine Website genannt worden, die ist freilich dann überflüssig, wenn ich tatsächlich eine normale Blogger-Adresse starten würde.

16:31 Dixi: there is an end of the matter; everything that could be said has been said – for today
Comments: sorry, not available yet

30.01.2004

Die Fliege oder Das Handwerk der Datenbank-Programmierung, Systeme und Objekte:
Was haben nun Systeme Objekten voraus? Sie geben die “Omnipotenz” der vollständigen Kommunikation auf, die hohe Akzeptanz, und was bekommen sie dafür? Zur Beantwortung der Frage formulieren wir sie doch einfach mal um: hohe Kommunikation und hohe Akzeptanz verlangen auch etwas: Beziehungen müssen ausgeführt werden, Kommunikation erfordert Aufwand, die Akzeptanz als Entgegennahme äußerer Wertveränderungen muss weitergeleitet werden – Arbeit, es erfordert Arbeit.

Ah ja – schon wieder ein toller 3-Buchstaben-Eyecatcher: ESA = Enterprise Services Architecture, wird beschrieben als eine Art von Dienstleistungsverhältnis, bei dem die jeweiligen Objekte miteinander auf einer gemeinsamen Infrastrukturplattform kommunizieren. Wunderbar, das ist der Grundbaustein meines Kernel (keine Spaghetti-Programmierung in den Wirkungsketten!) und sicher auch der einiger anderer Systeme, die seit mindestens 1999 existieren und deren wenigstens grundsätzliches Konzept nun endlich auf dem Massenmarkt ankommen. Wie fortschrittlich!

Gut, gut, ich geb’s ja zu, meine Schnittstellen sind keine Web-Service-Interfaces, freilich war das 1999 auch noch gar kein Begriff. Wer sich noch an die „Steinzeit der 90er“ erinnert, weiß wohl, dass damals gerade die Web-Hype auf ihre absoluten Hochtouren auflief und dadurch in der Lage war, den größten Schwachsinn teuer zu verkaufen - mit dem Nachteil, dass die wirklich guten Dinge in der angebotenen Neuheiten-Show oft untergingen.

Und ja natürlich – wenn ich auch die Zeitfresser noch mit Studio und meinem persönlichen Kommunikationsschema erstelle, so will ich natürlich bei dem „richtigen Projekt“ Java-Frameworks und die als tauglich erwiesenen Web-Entwicklungen verwenden. Was sich als tauglich erwies? Was nicht mehr neu ist, was eben nicht, wie in der Web-Hype, „New Technology“ ist, sondern schon ein bisschen „Old Technology“, sprich was bereits seine ersten Fehlschläge und Krisen erfolgreich bewältigen konnte, um daran zu wachsen und Spreu vom Weizen zu trennen.

Apropos ESA: Ich nenne meine Softwarestruktur und auch die geschickte, intuitive Art von Studio, seine Objekte anzubieten „prozessorientiert“. Das ist nicht korrekt im modernen Fachjargon, da sei dieses Wort für die veraltete Art der Programmierung vor der Objektorientierung bereits verbraten, wurde mir mitgeteilt. Da sich diese neue Art des Programmierstils, über die OO hinaus, jedoch erst entwickelt, gibt es wohl auch noch viele verschiedene Worte dafür: kontextorientiert wurde mir genannt, doch ich finde immer häufiger tatsächlich auch den Terminus Technicus „Prozessorientierung“.

Es ist nun mal genau das: Der Prozess definiert nicht nur Anfang und Ende der Arbeit, sondern zusammen mit den internen Abhängigkeiten den gesamten Verlauf (ML-Methode). So funktionieren nun mal Informationsverarbeitungen und sie funktionieren so, weil Information physikalisch begründet ist als regelgerechte Wertveränderungen. Und was zeichnet Wertveränderungen aus? Sie haben einen Start- und einen Endpunkt. Und was zeichnet Regeln aus? Sie sind wiederholbar: ausgehend von einem Startpunkt wird bei Anwendung der Regel ein ganz bestimmter, klar vorgeschriebener Endpunkt erreicht: Deshalb ist Information so furchtbar bedeutsam für das gesamte Universum, weil es aus der allgegenwärtigen Veränderung, dem ständigen Wechsel des Quantenrauschens Beständigkeit schaffen kann – und damit Vorhersehbarkeit. Und Vorhersehbarkeit ist die absolute, unverzichtbare, unverhandelbare Voraussetzung dafür, dass sich irgendein Aufwand überhaupt rentiert. Schwierig nachzuvollziehen? Nun – wer oder was würde denn täglich zur Arbeit gehen, wenn sein Gehalt nicht regelmäßig auf dem eigenen Konto erscheinen würde? Ja, ich weiß: russische Bergarbeiter, doch die armen Schweine tun das auch nur aus dem Prinzip Hoffnung heraus, dass eben irgendwann einmal das Gehalt regelmäßig auf dem Konto erscheint.

Was denn der Unterschied zwischen der prähistorischen funktionalen Prozessorientierung und der modernen Prozessorientierung ist?

Einfach die Steuerung.

In der Vor-Objektorientierung war der Gesamtprozess monolithisch aufgebaut, eine Programmiereinheit hatte alles und jedes zu beaufsichtigen und die Funktionen bestenfalls an ihre Unterprogrammen weiterzugeben: Zentrale Organisation.

Moderne Prozessorientierung hat diese Struktur aufgebrochen. Die angesprochene Infrastrukturplattform erlaubt zwar den Anwendern und/oder anderen Programmen, Prozesse anzustoßen, doch die Steuerung liegt hier auf einer wesentlich höheren Ebene. Die Infrastrukturplattform hat keinerlei Rechte und Befugnisse mehr, sich in die Arbeitsweise der angestoßenen Objekte einzumischen, nicht einmal in den Verlauf des gesamten Prozesses. Sie kontrolliert nur, was sie selbst aufruft: die erste Ebene. Diese erste Ebene muss dann selbst wissen, was als nächstes kommt und was sie aufrufen und kontrollieren muss.

Um es ganz deutlich zu sagen: Was am Ende an Wirkungsketten und Erfolg herauskommt, ist im Ideallfall total gleich! Wenn der monolithische Prozess perfekt arbeitet, also auch effektiv, dann wird er mit genauso viel Aufwand wie der dezentrale Prozess genau dasselbe Ergebnis liefern. Ich denke jedoch, das sofort klar wird, warum der moderne Prozess dennoch vorzuziehen ist: Weil er das ganze Verfahren kompakter macht – weil alles über saubere Schnittstellen geht, ist die gesamte Arbeit viel strukturierter organisiert, sie lässt sich viel leichter insgesamt überschauen und genau dadurch viel leichter auch neuen Anforderungen anpassen.

Das Problem, das in dieser Art der Struktur ist, wird sich aber ganz, ganz schnell auch den Riesen der Software-Industrie offenbaren: Irgendwas oder irgendwer muss den Prozess gewährleisten. Wenn du eine solch „liberale“ Art hast, autonome Objekte zu einer Arbeit zu bewegen, musst du umdenken. Da nützt das heutige Bossdenken mit strengen hierarchischen Befehlsketten nicht viel, einfach weil du gar nicht weißt, welche Objekte an deinem ganz individuellen Einzelfall-Prozess wie aktiv werden müssen - du musst anfangen, wirklich in Kosten und Ertrag zu denken wie Mutter Natur und deine Objekte sehen wie Menschen in einer gemeinsamen Kultur, du musst deine Ziele in die Objekte pflanzen wie Mutter Natur das Lustprinzip in ihre Objekte pflanzte. Weil das Objekt letztendlich die Kontrolle über seine spezifischen internen Arbeitsvorgänge hat und niemand sonst.

Du musst verstehen lernen, was Information ist, wie ihre unabdingbaren Gesetze lauten, wo sie mit sich verhandeln lässt und wo sie keinen Schritt zurückweicht, du musst verstehen lernen, dass die Zusammenarbeit mindestens denselben Stellenwert wie das einzelne ausführende Objekt haben muss. Das führt zur der Schlussfolgerung, dass du, abhängig vom Prozess, die Schnittstellen viel stärker im Auge behalten musst, denn das ist das einzige, was du in einer objektorientierten Welt kontrollieren kannst: Input und Output. Der dezentrale Prozess gibt Aufträge und darf Ergebnisse oder Fehlermeldungen empfangen, also sind das seine erkennbaren Gegebenheiten. Welche Komponente eine Funktion tatsächlich liefert, ist nur noch sekundär, nur was und wie sie zu liefern hat, ist noch von Bedeutung. Genau deshalb werden die Riesen der Software-Industrie auch auf die ML-Methode kommen. Denn diese Methode ist nichts anderes als die Regie-Anweisung, die Wirkungsketten im Prozess in Systemen und nicht (nur) in Objekten zu organisieren, um eine möglichst kompakte Struktur zu erzeugen. Das nämlich gewährleistet durchschnittlich kurze Verarbeitungswege, was wiederum zu weniger Fehleranfälligkeit führt. Und ist ein Fehler aufgetreten, lässt er sich leichter an seinen Ursprung zurückverfolgen, wenn weniger Arbeitsschritte zu durchforsten sind.

Und – diese Methode ist prinzipiell automatisierbar. Genau das werde ich irgendwann in diesem Projekt beweisen und das bedeutet, dass Komponentensysteme nicht mehr in wirren Spaghetti-Wirkungsketten unüberschaubarer Komplexität münden.

Obwohl das letztendlich schon unter dem Namen „Load-Balancing“ im Job-Scheduling auf dem Markt gutes Geld bringt, wenn auch in ein wenig anderem Kontext.

Ein wenig über den Rand des Suppentellers zu sehen, würde unserer Branche gar nicht schaden – erwähnte ich das schon?

13:46 Dixi: there is an end of the matter; everything that could be said has been said – for today
Comments: sorry, not available yet

29.01.2004

Primus inter pares:
Der Erste unter Gleichgestellten

Der Button ist schnell eingefügt, sein Symbol ein „Plus“ – das erspart mir die Suche nach einem kurzen und prägnanten Text. Doch natürlich werde ich auch für diesen Button sprachenabhängige Texte hinterlegen, die dann freilich ein bisschen ausführlicher sein dürfen für den Tooltip-Text. Dafür lasse ich mir jetzt endlich die erforderlichen Texte für das kleine Suchfenster von meinem Textobjekt anlegen, habe ich bisher noch nicht getan.

Dieses „Plus“ wird mehrstufig sein – solange eine Datei auf eine nächste als „Join“-Datei verweist, heißt dies, dass die entsprechenden Join-Befehle spezifiziert sind und solange wird das kleine Suchfensterchen aufgerufen mit der jeweiligen Datei. Nur eines wird ein solches „Join“-Fensterchen nicht können: die Suche starten. Das garantiert mir erstens Kontrollierbarkeit und zweitens das einfache Wissen, was die „Hauptdatei“ ist.

As time goes by...

Nun ja, die Welt ist nicht perfekt und nicht alle Tage darfst du an deinem Projekt arbeiten, but i’m back again, zuerst pflichtbewusst Java paukend: Farben und Bilder. Kann mir nicht jemand einfach ein Framework geben? Du bist eben ganz schön verwöhnt mit Studio, merke ich gerade wieder. Nicht umsonst haben so viele Leute Probleme, die Studio aus taktischen Gründen aufgeben müssen, um sich in die bekannte Programmier-Welt zurück zu begeben.

Ok, die Angaben für die Join-Aktionen sind hinterlegt für meine Zeitfresser-Datei: Es ist bisher nur die Stichwortdatei. Warum? Weil ich die Listenfelder über ihre eigene, verkürzte Sprachlogik abgehandelt habe und weil mir das im Hinblick auf das kleine Projekt und die nicht vollständig durchgeführte Sprachabhängigkeit vertretbar erschien. Wird sich zeigen, ob dies so bleiben kann.

Die Stichwort-Datei suche ich doch schon längst?

Nein, tue ich nicht – ich habe im Augenblick nur eine Suchmöglichkeit etabliert, die für meinen Typ „Datenbankzugriffs-und-Verwaltungs-Fenster“ nützlich ist. Mein aktuelles Fenster beschäftigt sich aber mit den Zeitfressern, also suchte ich mit dieser erweiterten, im Hauptfenster integrierten Suchmöglichkeit nach Zeitfresser-Informationen. Jetzt erst wird’s denn auch spannend: wie wird das kleine Suchfensterchen als Standalone (in mehrfacher Ausfertigung) reagieren? Und wie nervtötend wird es sein, mehrere Fenster aufklappen zu lassen?

15:23 Dixi: there is an end of the matter; everything that could be said has been said – for today
Comments: sorry, not available yet

27.01.2004

Laotse:
Dinge wahrzunehmen ist der Keim der Intelligenz.

Es ist furchtbar – ich kann einfach keine Ruhe geben und dieses doppelte Statement (den verlagerten Suchbefehl, remember?) zweimal stehen lassen, also rufe ich bei der Initialisierung tatsächlich die Funktionen-Schaltleiste auf. Klappt wunderbar.

Jetzt lässt sich die Treelist-Aufbereitung separat ansprechen, nun muss ich noch das Hauptfenster überreden, von einem anderen etwas anzunehmen. Habe ich aber schon: Das kleine Suchfensterchen ist schließlich auch dazu gedacht, als Standalone zu fungieren und dafür musste eine Kommunikationsmöglichkeit her, die ich jetzt gut gebrauchen kann. Diese wird also ab sofort noch einen Datensatz entgegennehmen, ihn in die Dateiliste einfügen, entsprechend sortieren und den gewünschten Satz als aktuell kennzeichnen: Den Rest erledigt dann die Treelist-Aufbereitung.

Wie es dabei mit meinen Java-Fortschritten steht? Nach den ermutigenden Erkenntnissen über die Bequemlichkeit, auf XML-Dokumente zuzugreifen, ist die Euphorie schlagartig erstorben, als es um Graphikprogrammierung mit dem AWT geht – ich hoffe bloß, dass hier weniger „tief schürfende“ Frameworks auf dem Markt sind, ich bin kein Oberflächen-Guru, sondern sehe eine GUI nur als möglichst bequeme Schnittstelle zu den Anwendern. Anmalen sollen diese es sich am besten selbst, ist mein Devise. Glücklicherweise sieht mein Projekt bisher die Verwendung von ArgoUML vor und das kann längst zeichnen.

Doch zurück zu meinen Stichworten: Das kleine Suchfenster arbeitet zufrieden stellend, die Kommunikation mit dem Hauptfenster ist auch beglückend, also kann ich mich jetzt dem eigentlich Problem, der Suche nach den sprachabhängigen Stichworten machen.

Da ich meine kleine Applikation nicht in dem Sinne völlig sprachenabhängig gemacht habe, dass jedes sprachenabhängige Datenfeld immer und überall mit seinem jeweiligen Klartext, also dem passenden Text in der gewünschten Sprache maskiert wird, muss ich auch bei einer Eingabe nicht sofort berücksichtigen, dass es nur ein Text sein könnte. Das macht es mir die Sache einfacher, denn nun darf ich die Textsuche als Einzelfall betrachten. Macht das Sinn?

Relationale Datenbanken repräsentieren schließlich zumeist nur „Einzelteile“ einer logischen Struktur und ich werde wohl früher oder später auch SQL-Statements über mehrere Dateien basteln müssen.

Freilich bleibt die Sprache immer etwas besonderes, nicht zuletzt deshalb, weil es für viele hinterlegte Texte verschieden lange Ausführungen gibt oder auch, weil sie als Sprachelemente in der Schreibweise hochflexibel sind – phonetische Suche ist hierbei das Schlagwort.

Andererseits hasse ich die Programmierung von Einzelfällen und tue es nur im Notfall, wenn es wirklich nicht anders geht. Also werde ich die Texte erst einmal als ganz normale „Zusatzdatei“ beim Suchen integrieren, mein kleines Suchfensterchen wird also einen neuen Button „Suche ergänzen“ erhalten, der andere Dateien auflistet.

Hmm – auch das klingt nach einem Metadatum, nicht wahr? Welche Dateien sinnvoll mit meiner aktuellen Datei verknüpfbar sind und vor allem, welche Schlüsselfelder korrelieren.

Welche meine Metadaten für Dateien verwende ich nun? Input, Logic, Output? Eingedenk des Spruches von Laotse seh’ ich mir die Daten erst einmal an.

Ich entscheide mich für die Input-Metadaten, die also Angaben über den Zugang zu den Informationen in meinen Datenbanken enthalten – und ein „kombinierter“ Zugang zu den Daten ist schließlich auch ein Zugang.

14:57 Dixi: there is an end of the matter; everything that could be said has been said – for today
Comments: sorry, not available yet

26.01.2004

Johann Wolfgang von Goethes „Der Zauberlehrling“:
Wehe! Wehe!
Beide Teile
Stehn in Eile
Schon als Knechte
Völlig fertig in die Höhe!
Helft mir, ach! Ihr hohen Mächte!

Das interessanteste am Programmieren ist, dass du immer neue Stolpersteine entdeckst.

Wollte ich doch einfach mein Suchergebnis übergeben lassen an das rufende Fenster, was ist denn schon dabei?

Nichts, wenn du standardmäßig programmierst. Wenn du aber in Typ-Einzelfall-Logik denkst und das hübsch generalisierbare Suchfensterchen dem vielfach verwendbaren Typ zuordnest, dann ist schon etwas dabei. Mein Suchfensterchen kennt nur seinen Client (oder Subscriber oder wie das sonst noch so heißt), also seinen Auftraggeber, es weiß aber sonst nichts über seinen „Herrn“ außer den üblichen standardisierten Schnittstellen. Gut, die habe ich schon, keine freilich, die nach dem Star/Satellite-Verfahren funktioniert (auch bekannt als Observer/Observable), andererseits will ich bei diesem Zeitfresser-Projekt nicht zu aufwändig werden – und eine Funktionen-Schaltleiste hat jedes Fenster bereits.

Mein Hauptfenster kontrolliert längst das Einzelfall-Fenster, ich muss also nur diese Kontrolle für mich arbeiten lassen. Das wiederum funktioniert über die Treelist, die die aktuelle Auswahl an zu bearbeitenden/interessierenden Informationen (=Datensätzen) zeigt und schließlich auch irgendwie zur Verarbeitung anbieten muss, wenn dort etwas gezielt ausgesucht wurde. Damit bin ich wieder dort, wo ich schon war. Ist mein ausgewählter Datensatz in dieser Treelist vorhanden, muss ich ihn nur noch ansprechen, dann läuft alles wie gehabt.

Ok, laufen wir die ganzen Wirkungsketten einmal ab: Im Hauptfenster wird die Treelist aufgebaut, wenn nach den dortigen, bevorzugten Kriterien gesucht wurde. Hier ansetzen mag ich nicht, obwohl es recht einfach wäre: Es müsste nur die Suchkriterienliste durch meine erweiterte Kriterienliste ersetzt werden, und ich obwohl nicht grundsätzlich etwas dagegen habe, meinen Computer Dinge mehrfach tun zu lassen nur wegen einer verbesserten Lesbarkeit meines Programmcodes, so ist ein Datenzugriff immer etwas Längliches, das die Verarbeitungsgeschwindigkeit oft maßgeblich beeinflusst. Wenn ich also definitiv ein vernünftiges Suchergebnis vorweisen kann, muss ich das nicht noch mal tun.

Also prüfe ich den Fall, meinen im Suchfensterchen ausgewählten, im Hauptfenster freilich nicht bekannten Datensatz einfach in der Treelist unterzubringen – ich schmuggle ihn in die dortige Ergebnisliste ein? Dann muss ich nur noch die Suchaktion umgehen können, die direkt vor Ort untergebracht ist. Ich entferne sie von dieser Stelle und bringe sie in der Funktionen-Schaltleiste des Fensters direkt unter, wo der Suchbefehl empfangen und umgeleitet wird. Dass ich diesen Befehl auch bei der Initialisierung des Fensters, also als identisches Doppel, ebenfalls berücksichtigen muss, stört mich – ich schätze mal unvorsichtig, dass ich meine sternförmige Konstellation von Befehlsketten nicht absolut konsequent durchgezogen habe. Hätte ich das, würde jeder Methodenaufruf über eine einzige Schaltstelle laufen (die Schaltleiste), dann wäre die Verdoppelung nicht nötig gewesen. Man kann’s aber auch übertreiben, denk’ ich mir und lass’ es auf sich beruhen. Ich bin schließlich nicht Mutter Natur, die einen ganzen mobilen Organismus via Gehirn zu steuern hat, auch wenn ich selbst die Berechnung durchführte, mit denen sich hübsch zeigen lässt, dass eine solche Wirkungsketten-Konzentration Effektivitätsvorteile verschafft - ist Basis der ML-Methode.

15:18 Dixi: there is an end of the matter; everything that could be said has been said – for today
Comments: sorry, not available yet

25.01.2004

Konrad Adenauer *1876 +1967:
Wir leben alle unter dem gleichen Himmel, aber wir haben nicht alle den gleichen Horizont.

Der Spruch hat zwar gerade gar nichts mit meinem Text zu tun, doch was soll’s? Er gefällt mir eben.

Feldgruppen statt Variable, klingt nach nicht so sehr viel Arbeit. Arbeit bedeutet aber Beschäftigung mit einem Problem und das wiederum öffnet dir manchmal die Augen: so wird die ganze Positionierung auf die aktuelle Auswahl der angezeigten Treelist umgekrempelt. Zu oft wurde die getroffene Auswahl schlicht vergessen.

Tja, es ist zwar ein kleines Projekt, die Zeitfresser, doch sauber soll es trotzdem sein. Und halbwegs schnell: die Erstellung der Feldliste, die die möglichen hinterlegten Feldwerte und den normierten Zugriff darauf enthält, habe ich in meinen Datenbank-Verwalter auf Typenebene geschoben. Das verzögert zwar den ersten Aufruf der Applikation, aber danach geht’s eben reichlich flotter.

Und so widme ich mich wieder meinem eigentlichen Problem – der Suche in einzelnen Datenbanken, mit und ohne Sprache. Das kleine Suchfenster, das sowohl allein als auch als integrierter Bestandteil eines anderen Fensters arbeiten kann, sucht und positioniert schon hübsch seine passenden Datensätze und falls es geschlossen wird, meldet es brav den letzten ausgewählten Satz zurück. Als integriertes Fenster wird es freilich solange wie das Hauptfenster nicht geschlossen. Um alles hübsch einfach zu halten, werde ich deshalb denjenigen Datensatz aus all den gefundenen herauspicken, der durch einen Mausklick gezielt aktiviert wurde. Dieser Satz wird dann in die ganz normale Verarbeitung eingeschleust, das ist kein Problem.

Ein Problem allerdings ist, was geschieht, wenn?

Wenn dieser Satz aus der allgemeineren Suchliste in meiner angezeigten Treelist gar nicht zu finden ist?

17:49 Dixi: there is an end of the matter; everything that could be said has been said – for today
Comments: sorry, not available yet

23.01.2004

Faust, Der Tragödie erster Teil:
Daß ich mich nur nicht selbst vergesse!
Heiß ich mir das doch eine Messe!

Schöner allgemeiner Dateizugriff, den ich hier mache, nicht wahr?

Doch habe ich etwas bereits vergessen, das ich kürzlich erwähnte – ich möchte Stichworte nachschlagen und diese sind definitiv sprachenabhängig. Ich freilich suche bisher nur nach einfachen Dateninhalten, das ist nicht viel mehr als ein bequem aufbereiteter SQL-Befehl. Aber nein! Meine Zugriffsliste kann schließlich schon längst Listen von möglichen Feldwerten bearbeiten und meine Listen sind, wie ich es in früher Berufsjugend lernte, nicht viel mehr als standardisierte Mini-Dateien – und sprachenabhängig. Genau das Verfahren werde ich auch für „normale“ Dateien anwenden, aus denen die Feldwerte stammen können: angegeben wird der Wert aus der Datei, zu dessen Auswahl biete ich die passenden sprachabhängigen Texte an oder lasse über diese Texte den jeweiligen gewünschten Wert suchen. Ja klar, kann das noch komfortabler und jeder sprachabhängige Text maskiert werden, für meine kleine Applikation wird’s aber ausreichen.

So, und nachdem ich mich endlich durch die Tücken der Kommunikation von Oberflächen-Elementen mit ihren Programmvariablen gekämpft habe (was ich „dank“ meines höchst selektiven Gedächtnisses immer wieder tun muss) und mich meinem Problem sprachenabhängiger Suche stellen möchte - stelle ich statt dessen fest, dass erneut die Auswahl meines aktuellen Datensatzes zerhagelt wird, wenn ich diesen betreffenden Satz abspeichere. Was denn nun schon wieder? Das hatte ich doch schon gerichtet? Oder hat das nie funktioniert und ich habe mir das nur eingebildet? Ist ja auch egal, muss funktionieren.

Und noch ’ne Variable zur Identifikation des aktuellen Datensatzes und noch eine? Dann wird’s eine Feldgruppe mit dem Vorteil, dass ich beliebig erweitern kann, wenn’s sein muss.

17:43 Dixi: there is an end of the matter; everything that could be said has been said – for today
Comments: sorry, not available yet

22.01.2004

Gutta cavat lapidem non vi, sed saepe cadendo:
steter Tropfen höhlt den Stein

Ochsentour „Fenster“: Feld anlegen, Funktionalität berücksichtigen.

Da ich zu jedem Feld ein textabhängiges Tooltip (die kleine Textausgabe direkt am Cursor) verwende, habe ich mir eine Liste von Texten in jedem Objekt angelegt, das mit den Anwendern in Verbindung kommt. Denn „die Individualität liegt in den Daten“, also in den tatsächlich realisierten, speicherbaren Inhalten, die Anwender so brauchen. Deshalb lasse ich auch Dateistrukturen individuell und so „tief formatiert“ als irgend möglich, weil dies die Möglichkeit bewahrt, notfalls über ganz „normale Zugriffstechniken“ wie SQL oder Browser verschiedenster Art auf die wertvollen Daten zuzugreifen. Das minimiert das Risiko ihres Verlustes.

Zur Beschreibung dieser individuellen Daten und ihrer diversen Inhalte brauche ich dann auch immer individuelle Texte, darum komme ich nicht herum. Freilich lassen sich sogar Texte unter Einzelfallabhängigkeits-Gesichtspunkten sehen und damit „verschlanken“. Denn Texte, die völlig unabhängig sind, können als „Systemwerte“ betrachtet überall herangezogen werden, wo sie anfallen und Texte, die auf Typenebene für Fenster oder Datei „liegen“ wie Dateifeld-Bezeichnungen oder Standardbuttons (Ok, Cancel) stehen allen Fenstern oder den betreffenden Dateibearbeitungen zur Verfügung.

Zurück zu den Fenster-Feldern: Da ich Tooltips verwende, muss ich bei ihrer Installation auch immer den Text angeben, den sie anzeigen sollen. Dieser stammt aus meiner Textliste, weshalb ich die Zeilennummer der Liste, in der der Text geparkt ist, als „Steuerung“ für die gesamte Funktionalität verwende. Das erlaubt mir, Feldfunktionalität kopierbar zu machen. Jedes x-beliebige Feld verhält sich also gleich: Es checkt seinen Tooltip, ermittelt sich die Zeilennummer der Textliste und ruft dann die Funktionen-Schaltleiste des Fensters für die Klick- oder Rechte-Maus-Verarbeitung auf. Dieses zentralisierte Verfahren macht es natürlich auch einfach, eine solche Funktionalität von ganz anderer Stelle her aufzurufen und es macht es recht einfach, Fehler zu verfolgen, weil alles hübsch konzentriert ist und keine unentwirrbaren Spaghetti-Fäden an Wirkungsketten zu durchforsten sind.

Deshalb kann ich mich auch jetzt sofort, nach dem „Zurechtrücken“ des kopierten Fensterobjektes, auf dessen spezielle Eigentümlichkeit konzentrieren. Zuerst also werde ich dieselbe Zugriffslogik verwenden wie im „normalen“ Dateiverwaltungsfenster: Die Anwender können selber bestimmen, welche Felder in welcher Reihenfolge mit welchem „normalen“ Inhalt und Operator gesucht werden sollen.

Will ich meinen Anwendern jedoch die Möglichkeit bieten, eine umfangreichere Suche durchzuführen, müssen sie auf weitere Datenbankfelder zugreifen können. Ich werde ihnen also alle in der jeweiligen Datei angelegten Informationen zur Suchauswahl anbieten, solange sie so einfach gestrickt sind, dass ich sie mühelos bearbeiten kann. Das ist nur Bequemlichkeit, denn natürlich müssten für eine vollständige Suche auch solche nichtprimitiven Datentypen nach irgend einem vernünftigen System auffindbar gemacht werden, die nur über spezifische Editoren aufbereitet werden können.

Apropos „embedded objects“ sprich „mighty classes“ – habe gerade, eifrig mich fortbildend, in einem Entwurfsmuster-Papier „Dekorierer“ entdeckt, die als „intelligente Wrapperklassen“ wohl einer ganz ähnliche Systematik folgen wie mein Typ-Einzelfall-System, wobei ich denke, dass der Preis der internen Kommunikation des Systems bei weitem durch die flexiblere und weniger umfangreiche Architektur aufgewogen wird (um einmal nicht als „Münchhausen“ zu reden, sondern den Jargon der Experten zu nutzen).

18:03 Dixi: there is an end of the matter; everything that could be said has been said – for today
Comments: sorry, not available yet

21.01.2004

IT-Weisheit:
Technology is easy, people are hard

Zurück zu den Zeitfresser – und ja, es fällt mir wieder ein: Die Abspeicherung des bearbeiteten Datensatzes schlägt auf einmal fehl. Und die Suche? Letztere ist freilich nur ein falsch gesetztes Metadatum in der kleinen Liste für die Zugriffswünsche.

Jetzt bin ich auch wieder an der „Ochsentour“ – das Suchfenster für einfache Dateien, das als Sackgassenkomponente sowohl eigenständig als auch als integrierter Bestandteil eines anderen Fensters benutzbar sein muss. Die Suchkriterien biete ich wieder als Liste an, die einerseits die Feldnamen angibt, andererseits einen bestimmten Wert und Operator entgegennimmt.

Das ist viel zeitraubender als ein optimierter daten- und problemspezifischer SQL-Zugriff?

Stimmt – aber ein Kollege meinte einmal: „Bis die Anwendung fertig ist, wird die Hardware soweit sein“ und in all den alten ERP-Dinosauriern war dies immer wieder zu sehen: Codesegmente, die nur zur seinerzeitigen Optimierung des Laufzeitverhaltens gedacht waren, heute völlig überflüssig sind und immer noch zwischen den wesentlichen Kommandos herumgammeln, sie unnütz aufblähen und unnütze Fehlerquellen erzeugen. Ich vertraue einfach mal darauf, dass das Mooresche Gesetz noch eine Weile seine Gültigkeit behält. Dann ist es im Umgang mit Alltags-Software viel wichtiger, dass die Menschen sie verstehen, als dass der Computer sie in der allerschnellstmöglichen Zeit erledigen kann. Was nützt es schließlich, wenn der Computer im Nanosekundenbereich arbeitet, die Menschen jedoch immer noch dieselbe Denk- und Analysegeschwindigkeit wie vor 10.000 Jahren haben?

Zur Lösung dieses Problems kann ich mir nur drei Wege vorstellen: 1) du bringst dem Computer bei zu analysieren 2) du machst die Arbeit billiger und 3) du machst die Arbeit weniger umfangreich.

Die erste Variante bedingt, dass wir nicht nur wissen, was exakt Information ist und damit Informationsverarbeitung heißt (die Definition ist seit 1999ff auf dem Internet frei verfügbar), es bedingt auch, dass wir die Massendatenverarbeitung so perfektioniert haben, dass sie wenigstens ansatzweise an die Rechen- und Speichergeschwindigkeit des menschlichen Gehirns reicht – bisher utopisch, wenn auch Hilfen wie die ML-Methode schon jetzt existieren. Die zweite Variante führt zum Offshoring nach China und Indien und die dritte Variante gehe ich: Source-Code sparen durch komplexe Instanzen und Metadatensteuerung, sprich irgendwo und irgendwie, möglichst praktisch, hinterlegte Wunschvorstellungen.

Und natürlich – habe ich das doch schon mal gemacht: beim Hauptfenster. Das spricht dafür, dass ich diese Funktionalität dort auslagern kann auf den Typus „Dateizugriff“, denn wie lautet die ML-Methode in Comic-Version? „Wenn du mehr als 5-7 Statements mehrfach programmiert hast, kannst du sie mindestens eine Ebene nach oben schieben.“

14:31 Dixi: there is an end of the matter; everything that could be said has been said – for today
Comments: sorry, not available yet

20.01.2004

Jacques Tatischeff, "Tati" (1908-1982):
Wer sich zu wichtig für kleine Arbeiten hält, ist oft zu klein für wichtige Arbeiten

...oder hat eben niemanden, der es für einen tut. Anstatt mich wie ein Maulwurf in die Tiefen von Java zu wühlen, wühlte ich mich durch Belege und Formulare.

Weblog-Verzeichnisse habe ich auch gesucht, gibt’s wohl fast so viele wie Weblogs selbst. Nur etwas fiel mir auf: zum Blog gehört neben Datum noch Uhrzeit.

17:28 Dixi: there is an end of the matter; everything that could be said has been said – for today
Comments: sorry, not available yet

18.01.2004

Faust, Der Tragödie zweiter Teil (erster Teil, natürlich):
Habe nun, ach! Philosophie,
Juristerei und Medizin,
Und leider auch Theologie
Durchaus studiert, mit heißem Bemühn.
Da steh ich nun, ich armer Tor!
Und bin so klug als wie zuvor

Wenn du an Kleinigkeiten wie einem Bibliotheksimport zu scheitern drohst, obwohl du weißt, dass deine Entwicklungsumgebung genau diese Bibliothek im Griff hat – dann ächzst du auch „Da steh ich nun, ich armer Tor“.

Wer aber bereits über Millionen von Umwandlungsfehlern stolperte nur wegen einer falschen Bibliotheksliste, kann sich auch in Eclipse helfen: Java Build Paths.

Dixi: there is an end of the matter; everything that could be said has been said – for today
Comments: sorry, not available yet

17.01.2004

Esse est percipi
Sein, ist gesehen werden

Weder Java noch Zeitfresser – heute informierte ich mich über Suchmaschinen, über robot.txt und Robot-Tags.

Dixi: there is an end of the matter; everything that could be said has been said – for today
Comments: sorry, not available yet

16.01.2004

Faust, Der Tragödie zweiter Teil:
Wer kann was Dummes, wer was Kluges denken
Das nicht die Vorwelt schon gedacht?

Ja, das ist mir heute wieder eingefallen, als ich die Erklärung über „Reflection“ in Java las – das ist genau meine Art zu programmieren. Wie sonst ließen sich Instanzen derselben Klasse via Metadaten so modifizieren, dass sie ganz individuell aussehen?

Danke, Herr Christian Ullenboom – auch wenn’s viel ist, Sie sagen mir genau, was ich über Java wissen muss.

Bei Studio vermisse ich gerade das Konzept der Schnittstellen: Da ich nun für den verallgemeinerten Dateizugriff, den ich eigentlich bisher nur für die Stichworte benötige, ein neues Toolfenster bastle, stellte ich fest, dass die Toolfenster und meine Einzelfall-Fenster natürlich Gemeinsamkeiten haben, wenn sie im Hauptfenster als integrierte Elemente verwendet werden sollen. Da es aber nur drei Methoden sind, erspare ich mir bisher noch das entsprechende Fensterobjekt, das über Vererbung dann die Schnittstelle zum Hauptfenster standardisieren soll.

Warum ich nicht mein bisheriges Toolfenster verwendete? Weil ich ein wesentlich umfangreicheres „Panel“ brauche. Zwar kann ich in Studio natürlich die Größe der Fensterinstanz ändern, doch habe ich das Problem, dass dies bei integrierten Elementen schlecht möglich ist. Studio initiiert diese Elemente noch vor dem Konstruktor der Fensterinstanz, sodass mir mein ganzes gesammeltes Wissen des Hauptfensters eben noch nicht zur Verfügung steht.

Dixi: there is an end of the matter; everything that could be said has been said – for today
Comments: sorry, not available yet


Blog

Archiv

Vorherige Einträge