Drücke „Enter”, um zum Inhalt zu springen.

Veröffentliche Beiträge in “Programmierung”

Ich entdecke und fixe Bugs, schreibe wilde Hacks… sprich: ich programmiere

Bigmouth strikes again

Jan 0

Wieder mal die Zusammenfassung der letzten Tage. Heute aber endgültig in Kurzfassung. Ich sollte mich wieder daran gewöhnen, mehrere kleine Beiträge zu verfassen, statt mich in einem Monsterbeitrag zu verewigen. Blättern wir mal zurück auf Donnerstag, wir fuhren angesichts des schönen Wetters abends mit den Fahrrädern noch in einen Biergarten. Während des Essens, Trinkens und Quatschens schreckte ich auf einmal hoch - eine Katze hatte sich heimlich, still und leise herangeschlichen und fing an, um meine Beine herumzuschmusen. Sie suchte erstmal das Weite, kam aber wenig später wieder und machte Anstalten, sich neben mir niederzulassen. Keine Chance. Auch als wir heimkamen und ich nach Hause fahren wollte, mußte ich erstmal eine Katze vor und hinter dem Auto verjagen. Was war denn heute nur los?

Den Freitag jagte ich wieder den Fehlern in meinem neuen Modul hinterher. Irgendwann kam ich dahinter, dass da jemand sehr gründlich sauber machte. Irgend jemand (Wenn ich den erwische!) schickt die Putze los und die räumt mir meinen COM-Server weg, kurz bevor ich anständig ein Schließen der Tabelle veranlassen will. Den Vergleich mit der Putzfrau fand ich überaus treffend und zog den Vergleich zwischen mehreren Programmiersprachen:

  • C: Wenn du einziehst, ist alles dreckig. Jeden Bereich, den du in der Wohnung belegen willst, mußt du selbst vorher reinigen. Dafür mußt du dir keine Gedanken machen, wenn du ausziehst. Selbst alte Möbel schmeißt der Vermieter für dich weg, aber den Dreck läßt er für den nächsten liegen.
  • C++: Auch hier ist alles dreckig, wenn du ankommst. Das Gute aber ist, dass jedes Möbelstück seine eigene Putzkraft hat, die vorher sauber macht. Wenn du ausziehst, räumen sich die Möbel von selbst weg. Es kann natürlich auch passieren, dass sich ein Möbelstück aufräumt, wenn du das Zimmer verlässt. Du findest einen leeren Schrank vor, wo du vorher Bücher darin deponiert hattest. Einen Zettel zu schreiben, welches Buch an welcher Stelle stand, ist auch nicht gut, dann machst du trotzdem den Schrank auf und greifst ins Leere. In dem Fall bietet es sich an, den Schrank irgendwo hinzustellen, wo man ihn immer im Auge hat.
  • Java: Endlich deine eigene Putzfrau. Egal was du machst, sie räumt immer hinter dir her. Was du nicht mehr brauchst, wird von ihr selbstständig entsorgt. Du willst einen Schrank aufstellen? Sie weiß wohin und macht alles vorher für dich sauber. Du kannst dich zwar endlich auf das Lesen der Bücher konzentrieren, verlierst aber jeglichen Ordnungssinn.

Mittwoch erreichten mich auch die letzten Entwürfe zum Thinner-Release und nachdem ich mir die Tracks nochmal ausgiebig angehört hatte, stellte ich fest, dass ich einen neuen Ansatz gefunden hatte und erweiterte den Text noch etwas. Schon am Freitag war die entgültige Version online und auch sonst stand das Wochenende ganz im Sternzeichen von Thinner. Mich erreichte eine Mail aus Dresden mit der Bitte, ich sollte doch die Verwendung eines Autoplate-Tracks für einen Kurzfilm für derzeit stattfindende Kurzfilmfestival "Dogs, Bones & Catering" genehmigen. Leider nicht meine Baustelle - von mir aus gern, aber ich gab die Anfrage an Sebastian weiter. Eigentlich ein interessantes Projekt: Innerhalb von 43 Stunden einen Kurzfilm von 4,5 Minuten erstellen. Außerdem sollte ich noch eine kurze Beschreibung meiner Person für die neue Profilseite von Thinner abgeben, was ich dann heute Abend auch erledigte.

BücherSamstag Morgen erwachte ich für meinen Geschmack etwas zu früh, jedoch war es mir nicht vergönnt, noch sehr lange liegen zu bleiben, mein Handy rief nach mir. Naja gut, die Sonne leistete einen nicht unwesentlichen Anteil daran, mich aus dem Bett zu ziehen. Ich beschloss, die seit einem halben Jahr fällige Autoreinigung mal nachzuholen und fuhr in die Waschanlage und saugte anschließend noch den Umzugsdreck aus dem Kofferraum. Interessante Feststellung: Rüedi ist silber-metallic! Anschließend fuhr ich in die Stadt und wir bummelten ein wenig durch die Buchläden, die mich wieder jede Menge Geld kosteten. Aber "Nein" zu Anne Clarks Buch "Notes taken, traces left" mit allen ihren Songtexten auf Deutsch und Englisch zu sagen, zumal es preisgesenkt war, ist fast unmöglich.

And when we have turned one side of the world's face from sun into blackness the other will then burn under the slap of our greed.

BMWDie deutsche Übersetzung lasse ich an der Stelle mal weg, denn sie trifft das Original überhaupt nicht. Am Nachmittag stand dann ein neuer Test an - Ich klemmte mich hinter das Steuer dieses BMW Kombi. Sandra mußte zum Starten das Handbuch befragen, aber ehrlich gesagt, ich glaube, wer dieses Auto fahren will, braucht unbedingt einen Lehrgang. Sitz, Lenkrad und Rückspiegel ließen sich gerade noch manuell verstellen. Schon kurz nach dem Einsteigen war ich überwältigt von den zahlreichen Drehknöpfen, Hebeln und Tasten, die alle darauf warteten, dechiffriert zu werden. Ich probierte ein Sprachkommando "Computer - Alterieren!" Zeigte aber wenig Erfolg. Schon aus vielfacher Sicht war das Fahren ungewöhnlich - der Blinker rastet nicht mehr ein und außerdem fuhr ich das erste Mal einen Automatik. Aber an den ganzen Schnickschnack gewöhnt man sich sehr schnell und so wird der Griff in die Mittelkonsole beim Einlegen des Rückwärtsgangs schon fast lästig. Dafür brauch man volle Konzentration, wenn man dem Baby mal die Sporen gibt - abends auf die Auffahrt zur Autobahn hinter einer Schnecke hinterhergetrödelt und beim Auffahren gleich in die linke Spur ziehen und dabei ordentlich Gas geben, schon sind die Lichter der "Schnecke" im Rückspiegel am Horizont verschwunden. Aber auch mal in einer eingeschränkten Zone zu fahren, kann Spaß machen - man hat die Ruhe weg und weiß: Wenn ich wöllte, könnte ich...

WallfahrtskircheAbends ging es dann ins Kino - "4 Minuten". Mein Witz an der Kasse "8 Minuten, bitte!" zu sagen, verpuffte. Die Kassiererin kannte den entweder schon oder war clever. Ein wirklich guter Film - kurz zusammengefasst: Eine Inhaftierte stellt sich als begabte Klavierspielerin heraus und wird für einen Förderwettbewerb angemeldet. Dabei stehen ihr Neid und Mißgunst seitens der Häftlinge, als auch der Wärter im Wege, die sie durch Ausbrüche roher Gewalt "löst". Im Anschluss an den Film setzten wir uns bei einem Glas Rotwein, einer Moods und den Klängen von Robert Schumanns Konzert für Klavier und Orchester a-moll op. 54 in meine Küche und lauschten dem Spielen von Héléne Grimaud. Später stellte sich heraus, dass ich das Stück auch bei mir auf Vinyl habe und wir uns den Umweg über Sandras Wohnung hätten sparen können. Aber es war interessant, das Klavierspiel miteinander zu vergleichen.

RapsfeldHeute machte ich mir nach dem Frühstück einen ruhigen Tag. Ich fuhr die B26 Richtung Schweinfurt entlang. Zum einen, um zu Prüfen, ob die Strecke über Bischberg günstiger von der Autobahnabfahrt ist und zum anderen, um mir ein schönes Café zu suchen, damit ich mir meine neu erstandenen Bücher ansehen kann. Ich fand dann nach einem kleinen Besuch in der Wallfahrtskirche Maria Limbach, die von innen sehr schön war, aber auch viel zu belebt, um Fotos zu machen, ein abgelegenes Café in Eltmann, wo ich den Finnlandreiseführer bei einem Cappu studierte. Faszinierend - Nächte ohne Dunkelheit und Polarlichter, letztere leider vorwiegend im Winter. Abschließend fuhr ich wieder heim, kochte und beantwortete Mails. Und nahm mir vor, mich wieder mal kurz zu fassen...

Gedanken vor Mitternacht

Jan 5

PostcrossingNun nach zwei untypischen Beiträgen jetzt doch mal wieder einer, wo ich mit vornehme, mich in der Länge zu beschränken, was aber unter Garantie scheitern wird. Schon allein die Tatsache, dass ich Donnerstag mit meiner Geschichte fortsetzen muss, macht das Ganze schwierig.

Donnerstag Nachmittag verließ ich Arbeit erstaunlich pünktlich, um zu meiner ersten Klavierstunde zu fahren. Ab auf die Autobahn, später Bundesstraße. Ich kam gerade noch pünktlich an, mußte einen kleinen Moment warten und dann konnte es losgehen. Natürlich hatte meine Klavierlehrerin keine Ahnung, was sie erwartet und wir begannen wirklich mit den einfachsten Übungen. Erst alle Zweiergruppen von links nach rechts, dann alle Dreiergruppen. Dann ging es langsam zu den Noten über, sie wollte mir das C erklären, als ich es schon anschlug. Nächste Geschicklichkeitsübung: Finden Sie alle C's auf der Klaviatur! Schnell gefunden, plung, plong, pling, fertig! Vom C aus ging es dann zum ersten Lied über. Da sich die Zahl der 33-jährigen, die auf die Idee kommen, Klavier zu spielen, doch sehr in Grenzen hält und dieser Bereich doch eher von Kindern bevölkert wird, fingen wir mit einem ganz einfachen Stück an, bei dem mir Handstellung für linke und rechte Hand erklärt wurden und ich dann schon losspielen durfte - ein Auge auf dem Notenblatt, eins auf den Händen. Haltungsfehler der Hände und beim Sitzen wurden sehr freundlich korrigiert und brachten auch hörbare Ergebnisse. Danach war erstmal kurze Pause, wird übten das Zeichnen von Noten- und Bassschlüssel, sowie Tonleitern, Notenlängen, Oktaven und brachten das Ganze zu Papier. Dann ging es zum nächsten Stück über, ich durfte mich noch ein wenig verspielen und dann war die erste Stunde auch schon vorüber. Ich erkundigte mich noch über Klavierpreise, Unterscheide zwischen einem alten, aufbereiteten Klavier, Neukauf und einem E-Piano. In der Zeit muss ich dann wohl meine Übungszettel abgelegt haben und seit diesem Zeitpunkt verlor ich sie aus den Augen. Aufgefallen ist es mir auch erst gestern Abend, sodass mir nichts anderes übrig bleibt, als Montag Nachmittag noch einmal rauszufahren und sie abzuholen, schließlich will ich auch daheim ein wenig üben.

Freitag probierte ich weiter auf Arbeit herum und konnte Freitag Abend schließlich einen Erfolg vermelden. Ein Kollege hatte aber im Laufe der Wochen einen wirklich fiesen kleinen Fehler gefunden, der bei folgender (nachgestellter) Funktion auftrat:

void MachWas(char* pcZeichenkette1, char* pcZeichenkette2) {   if (0 == strncmp(pcZeichenkette1, pcZeichenkette2,     strlen(pcZeichenkette1))   {     // und hier sollten wir nicht landen   } }
Sein Problem war, dass er gelegentlich im inneren Teil der Abfrage landete, obwohl er dort nicht sein sollte. Nach einigen Tests fand er heraus, dass die Zeichenkette 1 die Länge 0 hatte, was dazu führte, dass die Abfrage beim Vergleich zweier Zeichenketten bis zur 0. Stelle immer die Abfrage erfüllte. Eigentlich sollte sich strncmp doch mal ein bißchen dagegen wehren, auf Länge 0 zu vergleichen. Das sind dann halt die kleinen Freuden des Programmierers.

Und damit aus den kleinen Freuden auch große Freude wurde, ging ich nach der Arbeit einkaufen. Als ich gerade mit dem Wagen den Supermarkt verlassen wollte, schrillte die Alarmanlage. Ich schob den Wagen durch, kein Signal, ich ging durch, das Heulen begann wieder. Ich wurde nett zur Information gebeten, wo ich noch ein paar Mal getestet wurde. Der Wagen war es nicht, aber ich erzeugte bei der Alarmanlage ein jaulendes Freudengeheul. Also wurde ich von dem plötzlich auftauchenden Sicherheitsmann nach hinten geführt, ich ertrug das alles mit einem freudigen Grinsen, ich war mir ja keiner Schuld bewußt. Ich wußte von einem Gerät abgetastet, wie es auf dem Flughafen verwendet wird und dieses Gerät schwieg sich aus. Auch bei meiner Tasche blieb es ruhig. Also gingen wir wieder zu einem Alarmmelder, der meine Annäherung mit Quäken bekundete. Ich zog die Jacke aus, gab sie ihm - Ruhe, ich ging hin - Ruhe, die Tasche hingehalten - Ruhe. Er fragte mich, ob ich neue Sachen hätte, wo noch ein Etikett drin sein könnte. Na klar, die Schuhe! Aber die waren es auch nicht. Er war sich mittlerweile sicher, dass ich nichts hatte mitgehen lassen, wollte mich nur von dem lästigen Piepsen befreien, da er aus persönlicher Erfahrung davon traumatisiert war. Plötzlich fiel mir das Portemonnaie ein, dass neben der Tasche lag und in den letzten Versuchen nicht zum Tragen kam. Bingo! Jetzt hieß es nur noch den Sicherheitsstreifen finden. Wir stellten das Portemonnaie auf den Kopf - nichts, der Sicherheitsmann fluchte schon herum, wieviele Fächer das Teil hat, bis er resigniert aufgab und es auf den Entsicherer legen wollte. Ich protestierte, weil ich vorher die Karten herausnehmen wollte. War eine gute Idee, denn dort hatten wir noch nicht nachgesehen und genau da war er versteckt. Zufrieden grinsend verließ ich den Laden - das Gute hatte gewonnen!

The fountainIch machte noch schnell den Abwasch, legte Wäsche zusammen, aß etwas und dann ging es schon ins Kino. Wir schauten uns "The fountain" an, einen Film vom "PI"-Regisseur Darren Aronofsky. Ich hatte schon mehrere Kritiken dazu gelesen, die sich durch die Bank weg schlecht über den Film äußerten. Mit "PI" hatte er auch wirklich die Latte enorm hoch gelegt und einen ebenbürtigen Nachfolger zu schaffen, war kaum möglich. Kerngeschichte bei "The fountain" ist der Schöpfungsmythos der Mayas, die den Tod als Beginn neuen Lebens sehen und dazu am Himmel einen sterbenden Stern auserkoren haben, der gleichzeitig Geburtsstätte für neue Sterne war. An diese Stelle sollten die Seelen der Verstorbenen verschwinden, um neu geboren zu werden. Gleichzeitig spielt der Tod eines Mannes in dem Mythos eine tragende Rolle, die mit einem Baum verknüpft ist (ob er sich geopfert hat, damit der Baum wächst oder der Baum aus ihm wuchs, nachdem er starb, bin ich mir nicht mehr sicher). Diese Geschichte bildet die Grundlage für die Handlung, die in drei Zeitebenen stattfindet - der Zeit der spanischen Eroberer, der Gegenwart und der fernen Zukunft. Da alle Ebenen, trotz der realistisch wirkenden Gegenwart, fiktiv sind, handelt es sich um also 4 Geschichten, die alle miteinander verwoben sind. Die Mythologie, die im Laufe des Film aufgedeckt wird, der Spanier, der den Untergang Spaniens und seiner Königin verhindern will und deshalb nach dem Baum des Lebens sucht, dem Wissenschaftler, der ein Mittel gegen den Krebs seiner Frau sucht und den Weltenreisenden, der nach der Erlösung seiner beiden zeitlich vorangegangenen Ebenbilder sucht.

  • Der spanische Eroberer sucht nach dem Baum des Lebens, um von dessen Saft zu trinken, um ewig zu leben und weil er es der Königin versprochen hat, Spanien zu retten. Nachdem er den Baum findet, wird er aber Opfer seiner eigenen Gier.
  • Der Wissenschafter der Gegenwart weiß um den nahenden Tod seiner Frau und ist als Forscher bemüht, so schnell wie möglich ein Mittel zu ihrer Rettung zu finden. Sie schreibt in dieser Zeit ein Buch, dessen Inhalt die Geschichte des spanischen Eroberers ist, was relativ fader Bezug zu dem spanischen Eroberer ist. Sie bittet ihn aber, "die Geschichte zu Ende zu bringen". Im Moment ihres Todes gelingt dem Forscher der Durchbruch, doch leider kommt er zu spät und akzeptiert den Tod seiner Frau nicht. Nach und nach erschließen sich im Laufe des Films die Bezüge zur Mayakultur und es wird klar, welchen Weg er zu gehen hat.
  • Diese Handlungsebene ist sehr eng verknüpft mit der Zukunft und die Übergänge zwischen Zukunft in die Gegenwart sind einfach brilliant umgesetzt. Ansonsten führt diese Erzählebene wenig Inhalt mit sich, sondern mehr die Umsetzung des bisher Geschehenen. Dafür muss eine fulminante Optik herhalten, die seine Reise in einer Kugel mit einem fast verdorrten Baum zum sterbenden Stern zeigt.

Zwei Stellen in diesem Film stießen mir aber unglaublich sauer auf - zum einen, das theatralische Zusammenbrechen von Izzy mitten im Scheinwerferkegel einer Ausstellung und weiterhin dass das Mittel zur Heilung genau im Moment des Todes von Izzy fertig wird. Es hätte dem Film keinen Abbruch getan, wenn sie meinetwegen auf einer Treppe zusammengesunken wäre und das Mittel, angespornt anderen zu helfen, erst nach Izzys Tod fertig geworden wäre.

Schließlich legt der Film auch offen, dass das Streben nach Wissen, Macht, Jugend und Unsterblichkeit immer vom Tod und vom Leiden anderer gepflastert ist und diese Bemerkung vermisse ich bisher in jeder Kritik. Seien es die spanischen Eroberungszüge, die Inquisition oder Tierversuche, der Film legt diese Stellen offen, ohne dabei aber zu sehr ins visuelle Detail zu gehen. Nach dem Film fragte mich Sandra nach dem Sinn des Filmes, ich könnte mir mit meiner Antwort ruhig bis heute Zeit lassen. Ich denke, der Beitrag umreißt grob, was der Film bewegen möchte bzw. auch in mir bewegt hat. Es ist immer hilfreich bei einem Glas Wein und einer Internetverbindung das Ganze noch einmal Revue passieren zu lassen.

Als ich heute von meinem Einkaufsausflug zurückkehrte, wartete eine neue Postcrossing-Postkarte auf mich, diesmal aus Portland/Maine. In den Zusammenhang beschloss gleich, wieder fünf neue Adressen zu ziehen, um bald wieder einen gefüllten Briefkasten zu haben. Zwei Karten gehen wie üblich nach Finland, eine nach Holland, eine in die Schweiz (zu einer dort lebenden Finnin) und wieder eine in die USA. Ach so, Einkaufen - ich sag nur: 9. Staffel! Noch Fragen? ;)

Microsoft rockt!

Jan 1

Gestern hatte ich noch ein ziemlich merkwürdiges Erlebnis. Ich öffnete den Briefkasten und fand ein Schreiben der Berufsgenossenschaft für Druck und Papierverarbeitung darin. Die BG möchte mich, meine Angestellten und meine "Produktionsräume" gerne gegen Unfälle versichern. Oder besser gesagt, sie will und ich nicht. Immerhin war sie so schnell, bereits ein Jahr nach Geschäftsgründung sich zu melden. Kommt Zeit, kommt Rat und das Schreiben wird jetzt auch erstmal einen kleinen Moment warten dürfen.

Irgendwie machte sich bei mir sehr schnell gestern die Müdigkeit breit und ich verzog mich schon kurz nach dem Sandmännchen (also gegen 23 Uhr) ins Bett. Die Rache folgte auf dem Fuße - ich war um 3 Uhr putzmunter und habe erst gegen 5 Uhr wieder Schlaf gefunden. Mag auch damit zusammenhängen, dass mir noch ein anderes Problem des Tages anhänglich war und mich nicht schlafen ließ. Und wie es mit den Dämonen der Nacht so ist, sollte man sie so schnell wie möglich bekämpfen, was ich dann heute auch vorgenommen habe. Der Arbeit tat das überhaupt keinen Abbruch, es war noch ausreichend Kaffee da, außerdem ist das Thema ziemlich interessant.

Nach zweieinhalb Monaten herumfliegen im Code, darf ich seit gestern auch noch ein bißchen forschen und tüfteln. Natürlich an meiner Lieblingsschnittstelle - der Datenbank. Mein Opfer ist die OLE DB - eine COM-Schnittstelle aus dem Hause Microsoft. Unglaublich flexibel und sehr umfangreich. Meine erste Erkenntnis: Nachdem ich jetzt ca. 1.000 Interfaces initialisiert habe, kann ich schon fast eine Sitzung eröffnen. Starke Sache, oder? Die Dokumentation ist ziemlich umfangreich, könnte jedoch etwas anschaulicher sein. Die ein oder andere Grafik zum Ablauf würde das Verständnis ungemein steigern. Statt dessen kämpft man sich durch Schnittstellen und Parameter, die dann auch noch pUnkSession heißen. Nicht geht über die Kreativität bei der Vergabe von Variablennamen. Wer es nicht glauben mag, hier ein Screenshot oder gleich der Verweis in die MSDN. Die besten Variablennamen sind ohnehin schon vergeben und kommen aus dem Hause GNU.

Punksession

Nachdem ich den ganzen Tag mit der Punksession herumgerockt habe, kam ich spontan noch auf die Idee, mit meinem Wackelpeter zur Altenburg zu fahren und dort den Sonnenuntergang zu genießen. Nur doof, dass die Altenburg kurzzeitig ausgeschrieben ist und dann fehlt jeglicher Hinweis. Also düste ich eine Weile herum und machte mich, nachdem die Sonne untergegangen war, unverrichteter Dinge wieder heim. Aber die Fahrt war lang genug, den neuen Podcast in voller Länger zu hören. Unglaublich deep, kaum zu glauben, dass die Zeit so schnell vergeht. Ich stellte noch ein paar Fehler fest, die ich jetzt die nächsten Tage beheben werde, perfekt ist gerade gut genug.

Daheim lag eine Papptasche auf der Treppe zu mir, meine neuen Platten sind eingetroffen. Eine Scheibe war ein totaler Fehlgriff, dafür sind die La Manie - Schluss mit traurig und die Holger Flinsch - Hidden unschlagbar gut. Letzterer ist einfach brilliant. Das Stück "Eve of the end" ist atemberaubend. Und wenn ich schon mal das Thema Musik am Wickel hab, gleich noch eine Nachricht hinterher: Björk veröffentlicht im Mai ein neues Album, das auf den Namen "Volta" hören wird. Angeblich selbst geschrieben und produziert, aber unter Zuhilfenahme zahlreicher bekannter Produzenten, wie zum Beispiel Timbaland. Wird jetzt auch Björk klingeltontauglich? Seit dem letzten Nelly-Furtado-Album hege ich eine gewisse Abneigung gegen ihn, denn die Texte und Ideen für die Lieder waren bereits fertig, als es hieß "Alles Mist, ich mach die Musik und du schreibst die Texte dazu." In meinen Augen nicht die Aufgabe eines Produzenten, sondern eher einer Gelddruckmaschine. Fehlt bloß noch, dass ihr ein textlicher Rahmen vorgegeben wurde. Aber ich wollte eigentlich zu Björk schreiben - beruhigend zu wissen, dass auch Mark Bell wieder mit von der Partie war. "Homogenic" war meiner Meinung nach ohnehin das beste Album. Punkt. Den Rest wird die Zeit zeigen.

Immer wieder verhüllten dichte Wolken den Mond in dieser Nacht und jedes Mal fiel der Bann von mir ab. Und ich sperrte ihn ein - wenn es doch endlich vorbei wäre...

Leicht müde

Jan 0

Gestern abend wurde es trotz Müdigkeit doch wieder erst Mitternacht, als ich den Weg in mein Bett fand. Ich wollte das Stöckchen unbedingt noch bearbeitet wissen. Heute Morgen dann trotzdem wieder putzmunter gewesen, obwohl ich die Nacht mehrmals munter geworden bin, bei der Regen wie wild auf mein Dachfenster klopfte. Das hat mich aber nicht schwer beeindruckt, sondern eher dazu veranlasst, mich gemütlich umzudrehen und weiter zu schlafen.

Auf Arbeit bastelte ich dann heute meine neu entwickelte Komponente ein und testete schon mal ein wenig. Nach dem Mittag kam dann die Bitte, erstmal an einer anderen Baustelle zu arbeiten. Dumm nur, dass ich vergaß, den Quellcode der Integration einzuchecken und fröhlich weiterbastelte. Also werde ich wohl morgen früh einen Zwischenstand erzeugen dürfen, den ich teste und einchecke. Und dann entstand kurz vor Schluss das finsterste Coding bis jetzt. Aber wer eine Bytekette von Frau "Mir ist wurscht, was es ist, Hauptsache das Ding hat einen Namen"-FoxPro über eine ActiveX-Komponente zu Herrn "Erlaube mir, wenn es mit einer 00h beginnt, es alles auf 00h zu setzen"-MFC zu tunneln, wird sein blaues Wunder erleben, wenn die Bytekette mir einem Kennzeichen beginnt, was berühmt berüchtigt als "terminierende Null" bekannt ist. Dann wird freundlicherweise der Rest -auch wenn er überhaupt nicht leer ist- platt gemacht. Und was ist da kruder als ein x-beliebiges Zeichen, was vor dem Abschicken vor die Kette gebastelt wird und beim Eintreffen durch ein memcpy(target, source + 1, sourcesize) wieder entschärft wird? Und noch viel schöner ist der Gesichtsausdruck eines Gewohnheits-Java-Programmierers verbunden mit der Frage: "Und dass mit der +1 funktioniert?".

Sonstiges Tagesgeschehen - Donnerstag zum späten Nachmittag zum Friseur, mal sehen, vielleicht abends noch ins Kino. Wir wollen uns "Nach der Hochzeit" ansehen. Der letzte Film, den ich mit Mads Mikkelsen sah, war "Dänische Delikatessen" und da war er in seiner Rolle brilliant. Ich bin gespannt.

Obwohl ich doch ziemlich spät von Arbeit gekommen bin, habe ich den Abwasch erledigt, bin in die Wanne gesprungen und habe ich mich noch ein Stündchen zum Üben hingesetzt und traute mich nach einigen Übungen auf das freie Papier. So und nun bin ich erledigt und möchte eigentlich nur noch ins Bett...

Au weia, dass sieht aus, als wenn man einem 5-Jährigen das Schreiben beibringt. Zu meiner Verteidigung muss ich sagen, dass das Papier sehr holzig ist und somit die Feder oftmals springt. In diesem Fall eine sehr schmale Feder.

Musikverwaltung

Jan 4

Plattenverwaltung V1.0Nachdem sich Loco gestern zu meinem Beitrag "70 times" erkundigte, ob ich Buch darüber führe, wie oft meine CDs abspiele, ist es mal wieder Zeit, in Erinnerungen zu schwelgen. Begonnen hat alles in den frühen 90er Jahren, wo ich noch auf meinem KC ein kleines BASIC-Programm schrieb, dass von Hand eingetippte Charts auf Kassette speicherte und auch von dort wieder lud. Das Programm hatte ich zwischen 1990 und 1991 regelmäßig im Einsatz, auch wenn es sich sehr umständlich bedienen ließ. Mitte der 90er Jahre hatte ich natürlich schon längst auf einen PC gewechselt und meine Plattensammlung war so sehr angewachsen, dass ich das Ganze verwalten wollte. Außerdem interessierte mich, welche CD ich wie oft abspiele. Also entstand die erste Version des Programms in dBASE, die schon eine relativ gute Abdeckung der von mir gewünschten Funktionalität bot. Hier und da mußte ich noch direkt in den Tabellen Hand anlegen, aber der Großteil wurde schon vom Programm abgedeckt.

Plattenverwaltung 2.0Trotzdem fehlten immer wieder entscheidende Funktionen zur Auswertung und Erfassung. Außerdem war das DOS-Fenster dermaßen veraltet, dass ich mich 2000 nach einem Semester Java-Programmierung an die Umstellung auf eine Version in Java machte. Ich exportierte die Daten aus der Tabelle, schrieb eine Konvertierungsroutine, die mir meine Daten in mein neues Format umsetzte. Nach einiger Zeit war dann die V2.0 fertig und ich verbesserte und erweiterte das Programm noch bis zur V2.4 und immer mehr stolperte ich über Unzulänglichkeiten in meiner Programmarchitektur. Da sich meine Kenntnisse nur auf das AWT bezogen, ich aber das Programm komplett mit Swing programmiert hatte, waren mir Begriffe, wie das Model-View-Controller-Konzept völlig unbekannt.

Plattenverwaltung 3.0Also warf ich alles über den Haufen und begann mit einer kompletten Neuprogrammierung, diesmal mit den frisch erworbenen MFC-Kenntnissen. Am 8.8.2001 ging die neue Version (mittlerweile 3.0) an den Start. Ich sicherte immer noch regelmäßig die Daten, um eventuelle Instabilitäten abfangen zu können. Diese Version entwickelte ich kontinuierlich weiter, baute zusätzliche Informationen ein (Coveranzeige, Listendruck), beseitigte Fehler und dachte mir neue Sachen aus, die ich Stück für Stück implementierte. Derzeit läuft mein Programm in einer Version, die ich im Februar 2002 erstellt habe. Fehler weißt das Programm keine großen mehr auf. Es sind wieder diese kleinen Detailfragen, die man eigentlich korrigieren müßte, aber wo die Motivation fehlt, einen solch kleinen Bug zu beseitigen. Also bleibt es liegen. Außerdem ist der Code grauenhaft - nicht dokumentiert, öffentliche Variablen und ich arbeite immer noch auf einer Textdatei, die beim Programmstart geladen wird und beim Beenden gespeichert.

Die derzeit von mir favorisierte Variante liegt darin, eine C#-Lösung zu programmieren, die endlich wieder mit einer Datenbank kommuniziert. Möglich wäre das ja relativ schnell, da es mit der Microsoft Visual C# 2005 Express Edition auch noch einen MS-SQL-Server gibt. Jetzt fehlen nur noch praktische Erfahrungen im Bereich der C#-Programmierung, die ich wohl demnächst machen werde.

Was sonst noch so passierte…

Jan 0

Am Freitag abend betrieb ich erstmal intensive Mindmap-Pflege. Die alte Mindmap verstaubte schon langsam und es wurde höchste Zeit, dass ich sie reaktiviere. Also hieß es: alte Punkte löschen, neue Punkte hinzufügen, Listen aktualisieren (meine Zeitungsliste ist enorm geschrumpft) und die Planung für die nächsten Tage machen. Was in meinem Kopf für enormes Chaos gesorgt hat und wo ich die Hälfte zum Teil schon wieder bald vergessen hätte, sieht aufgeschrieben sofort machbar aus und ich werde wieder daran erinnert.

Während mich meine Mindmap jetzt also gerade daran erinnert hat, dass ich doch für morgen ein paar Releases zum Durchhören herunterladen wollte, habe ich gerade noch die letzte Uhr (nämlich das Telefon) auf den neuesten Stand gebracht. Wir erinnern uns:

Spring forward & fall back

Auf das letzte Novemberwochenende hat sich unsere Runde geeinigt, noch einmal in diesem Jahr eine LAN-Party zu machen. Um unsere strategischen Runden noch etwas aufzupeppen und im Notfall zu einem taktischen Ablenkungsmanöver überzugehen, fehlt eigentlich nur noch ein USB-Missile-Launcher. Das Teil kann via USB angeschlossen und per Mausklick abgefeuert werden. Wenn der Preis von 59,- Euro nicht doch etwas überteuert wäre.

Außer man heißt Charles Simonyi und gehört zu den 400 reichsten Menschen der USA (laut Forbes-Magazin). Der trainiert ja schon eifrig für seinen Weltraumflug und reiht sich damit in die Reihe von Weltraumtouristen ein. Bekannt dürfte er dem Normalanwender nicht sein, sollte er aber. Schließlich sind unter seiner Leitung in der Microsoft Anwendungsentwicklung Word und Excel, als auch der Vorgänger zu Excel -Multiplan- entstanden. Später versuchte er mit seinen Forschungen im Bereich "Intentional Programming", den Programmieren die Arbeit zu erleichtern. Unter Intentional Programming versteht man vereinfacht gesagt, dem Anwendungsentwickler die Arbeit dahingehend zu erleichtern, dass er sich weniger um die Codierung Gedanken machen muss, sondern sich auf die Beschreibung der Problemlösung Gedanken machen kann. Hier ein Ausschnitt aus einem Vortrag von Lutz Roeder, an dem man sich besser vorstellen kann, was mit Intentional Programming gemeint ist. Die Forschungsarbeiten wurden aber eingestellt und Charles Simonyi gründete eine eigene Firma, um die Forschungen fortzusetzen.

Tools in der Entwicklungsumgebung

Jan 0

Für den Normalsterblichen sind Softwareentwickler wie eine eigene Spezies, die den Sprung in ein Leben jenseits von Raum und Zeit geschafft haben. Tag und Nacht, Arbeitswoche oder Wochenende - ihr Leben scheint sich nur um Computer zu drehen. Selbst wenn sie sich in ihrer Freizeit zu kleinen Grüppchen zusammenrotten, handelt es sich meistens um Computerbezogene Probleme, die da besprochen werden. Wer sind diese Menschen, die sich scheinbar Tag und Nacht hinter Bergen aus Monitoren, Rechnern und mit ominösen Krakeln beschriftetem Papier verbergen?

Auf der Seite der Programmierer wundert man sich über die verwunderten Blicke, die einem zugeworfen werden, wenn man versunken in Gedanken über die Lösung eines Problems durch den Gang läuft und jegliche Existenz anderer Lebewesen ausblendet. Man nimmt sie erst wahr, wenn sie vor einem am Arbeitsplatz stehen, von ihren Problemen berichten, welche die neue Erweiterung mit sich gebracht hat und deren Unverständnis, warum man sich weigert, die Funktion des zeternden Anwenders nicht zu implementieren, weil die Effizienz zwischen mehreren Wochen Programmierung und 5 Minuten Zeitgewinn pro halbem Jahr einfach nicht gerechtfertigt erscheint.

Jeder Programmierer ist sich dessen bewußt, dass er ohne die Anwender keine Arbeit hätte, aber manchmal träumt er davon, dass es zu der Lösung, die er sich gerade ausgedacht hat, auch ein Problem geben müßte, das unbedingt umgesetzt werden muss. Deswegen reagieren sie auch unwirsch darauf, wenn ein Anwender kommt und daran etwas auszusetzen hat. Programmierer sind deshalb wie kleine verletzte Gottheiten zu behandeln, die sich auf die Erde verirrt haben. Jeder Anwender wäre erstaunt, wie milde man einen Programmierer stimmen kann, wenn man ihm eine kleine Aufmerksamkeit zukommen läßt und wie bereitwillig er sich auf einmal zur Kooperation zeigt. Hier ein paar Vorschläge zur Konfliktvermeidung beim nächsten Treffen zwischen Programmierer und Anwender.

Softwareentwickler trinken Kaffee. Ja, es gibt auch die Fraktion der Teetrinker, aber die meisten ziehen halt doch das schwarze Lebenselixier vor. Programmierer suchen während ihrer Arbeit immer den "Flow". Es ist der Moment der Einheit zwischen Programmier und seinem Code. Ob es einen wissenschaftlichen Zusammenhang zwischen dem "Flow" und Kaffee gibt, sollte mal untersucht werden. Fest steht: Es ist verdammt schwer reinzukommen, wenn man ständig aufstehen muss oder gestört wird. Deswegen sollte Kaffee immer in ausreichenden Mengen zur Verfügung stehen. Ob der Kaffee noch kochend heiß getrunken wird oder auch kalt noch als genießbar empfunden wird, liegt im Auge des Genießenden. Es ist aber eine Tatsache, die für Programmierertassen gilt: Je größer, desto besser - mit kleinen Näpfchen zieht man sich eher den Zorn des Programmierers zu. Ich empfehle deshalb das Modell Xtra Large zu schenken, am besten randvoll gefüllt. Und man tut auch gleich etwas für die Umwelt, denn Kaffee gehört ja zu den nachwachsenden Energiequellen!

Informatiker stehen ja unter dem Verdacht, nicht besonders kommunikativ zu sein oder sich nur schwer verständlich machen zu können. Wer aber mal das programmierende Volk unter sich beobachtet hat, kommt schnell zu der Einsicht, dass es dort stellenweise schlimmer zugeht, wie bei Tante Elsbeths Kaffeekränzchen. Dabei ist es ja auch klar, dass ein Programmierer nur ungern seine wertvolle Zeit verschwendet, einem unbedarften Anwender seinen letzten fiesen Hack zu erklären, wenn der nicht mal weiß, was ein Kontextmenü ist. Außerdem gehören Programmierer ja nicht nur zur schreibenden Zunft, sondern sind Künstler, die geschickt kleine Buchstabenketten verbinden, um den Millionen von Transistoren ein schönes Bild oder Wunderwerke auf Papier zu entlocken. Deswegen outet man sich gern, jedoch nicht nur deswegen, sondern auch um seinesgleichen sofort zu erkennen. Und als kleine Gottheit genießt der Programmierer den fragenden Blick des Anwenders auf das T-Shirt, verbunden mit der Frage "Was bedeutet denn das?"

Und mit einem Mißverständnis muss noch aufgeräumt werden - der Programmierer und sein Computer haben nicht die harmonische Beziehung, wie es nach außen wirkt. An schlechten Tagen kriselt es doch ziemlich heftig zwischen den beiden, aber eine Trennung ist schlecht möglich, handelt es sich doch um eine Berufsehe. Diese Berufsehe zwischen Programmierer und einem Blechwesen mit einem Herz aus Silizium sorgt stellenweise für reichlich Spannung, da der Computer das wohl sturste Wesen ist, was man sich vorstellen kann. Selbst die schmollende Superzicke verblasst im Schatten eines Computers, der einen kryptischen Fehler ausgibt, den es tagelang zu beheben gilt. Bevor ein Programmierer seine schlechte Laune an die Umwelt weitergibt, empfiehlt es sich den Konflikt etwas eskalieren zu lassen. Der Monitor ist zwar ein peripheres Ziel, eignet sich trotzdem für gezielten Aggressionsabbau mit dieser aufblasbaren Keule. Anfänglich wurde ich müde belächelt für dieses Entwicklungswerkzeug, aber mittlerweile wird sie doch sehr gern mal ausgeliehen und gehört somit in den Schreibtisch eines jeden Softwareentwickler. Aber Vorsicht: Nach Einsatz unbedingt wieder wegräumen, ein nicht eingeweihter Anwender könnte es als Akt der Bedrohung wahrnehmen.

Ich hoffe, ich konnte ein wenig damit aufklären, dass Programmierer auch nur Menschen wie du und ich sind ;)

Nachtrag: Ich habe den Titel mal geändert, denn es hat ja weniger mit Geschenke zu tun. Mir ging es ja mehr um die Kommunikationsschnittstelle Mensch - Programmierer und welche Werkzeuge dort zum Einsatz kommen.

Natürlich habe ich noch das wichtigste vergessen: Der Programmierer sucht nach Identifiktion, dass heißt ein Vorbild, welches mit ihm leidet und seinen Schmerz in Sachen Wünsche und Forderungen von Seiten des Managements und der Anwender kennt. Das kann nur einer - Dilbert.

Scharfes Wissen

Jan 0
C# Prof Schon mal als Vorbereitung auf nächstes Jahr sollte ich mal einen Blick auf C# (Sprich: C Sharp) werfen. Also werde habe ich mir schon mal den Link zum Download Expressedition vom Visual Studio 2005 herausgesucht. Eben habe ich gerade meinen Kollegen nebenan besucht, der als einziger C# programmieren darf (... muss ... soll) und fragte ihn nach Buchtipps für den Einstieg. Zielsicher ging er zu seinem Bücherregal, schnappte die zwei C#-Bücher, die dort standen und meinte: Da, schenk ich dir! Hab ich irgendwas gutes getan oder im Lotto gewonnen? DB Prog C#

Schwere Geburt

Jan 0

Wer denkt, Cocoon sei ein Club, ein Label oder ein Film, für den wird dieser Beitrag eine harte Nuss, es geht nämlich um Cocoon, das Web-Entwicklungs-Framework. Mit dem habe ich mich die letzten Tage und Wochen um die Ohren geschlagen und dabei Schritt für Schritt die Schwierigkeit erhöht. Problematisch erweist sich dabei, dass mit wachsender Schwierigkeit auch die Zahl der Webseiten sinkt, die einem weiterhelfen.

Level 1: May I introduce myself?

Um unsere Intranetabfrage vor unerlaubten Zugriffen zu schützen, sollte eine Authentifizierung integriert werden, die Abteilungen erlaubt, darauf zuzugreifen bzw. den Zugriff zu verhindern. Kein Problem - In der Dokumentation zum Cocoon gibt es eine Sektion, die Schritt für Schritt das Einrichten der Authenfizierung erläutert und wo man an welcher Stelle drehen muss, um ein bestimmtes Ergebnis zu erreichen.

Der Abruf einer Webseite beim Cocoon gliedert sich in drei Teile:

  • Erzeugen der Daten (z.B. Datenbankabfrage)
  • Transformation der Daten (optional)
  • "Ausgabe" der Daten

Diese Abfolge wird im Cocoon Pipeline genannt und bleibt für den Anwender völlig unsichtbar - er ruft nur eine Webseite auf, nach deren Namen die entsprechende Pipeline aufgerufen wird. Zur Authentifizierung wird um diese Abfolge ein Päckchen geschnürt, das den Zugriff schützt, der Handler. Der Authentifizierungshandler kennt zwei Pipelines: das Login und die Überprüfung der Nutzerdaten. Ist ein Nutzer eingeloggt, wird nur noch geprüft, ob der Nutzer eingeloggt ist und er auf die Daten zugreifen darf. Also integrierte ich anhand des Beispiels den Handler und ließ die Authentifikation gegen eine XML-Datei laufen. Wie gesagt, ganz einfach...

Level 2: Bürger, ihren Ausweis bitte!

Zur Überprüfung der Login-Daten sollte unser LDAP-Server dienen. Auch hier gab es erstmal kein Problem, im Cocoon ist ein LDAP-Transformator integriert, der mit XML beschriebene LDAP-Abfragen an den Server stellt und das Ergebnis wiederum als XML liefert. Nur beschränkt sich hier die Dokumentation des Cocoon einzig und allein darauf, wie das XML aufgebaut sein soll, was zur Abfrage dient. Also stöberte ich nach einigen Beispielen herum und gewann dabei mehrere Erkenntnisse...

  • Die Daten der Authentifizierung werden in Form von XML gespeichert
  • Diese Daten müssen einen bestimmten Aufbau haben, um akzeptiert zu werden
  • Automatische Anmeldung geht nicht, denn auf die Umgebungsvariablen zurückzugreifen ist sinnlos. Was interessiert mich der Nutzername unter dem der Cocoon läuft? Ich will den Nutzernamen der Nutzers vor dem Browser!

Nach mehreren Anläufen und Versuchen unter Mithilfe unseres Admins hatte ich eine Abfrage fertig, die mir die entsprechenden Daten lieferte. Damit war das Problem erstmal gelöst. Ich konnte bestimmen, welche Abteilung sich anmelden darf und auf welche Seiten sie zugreifen darf. Aber damit hört es ja nicht auf...

Level 3: Im Zentrum der Maschinenwelt

Das Problem besteht ja nicht darin, nur eine Abteilung zuzulassen und die anderen auszusperren. Nein, unterschiedliche Abteilungen sollen auf verschiedene, ja sogar gleiche Seiten zugreifen können. Das Problem war: 1 Abteilung = 1 Authentifizierungshandler und 1 Webseite = 1 Authentifizierungshandler. Alles klar? Nö? Na dann... Ich kann den Zugriff auf eine Webseite nur mit einem Handler schützen. Dieser Handler überprüft die Nutzerdaten so, dass sie genau einem Kriterium entsprechen, in diesem Falle der Zugehörigkeit zur Abteilung. Also geht es nicht so einfach, zwei Handler auf eine geschützte Webseite zu bringen. Lösungsmöglichkeiten:

  1. Jeweils eine Pipeline pro Abteilung, aber mit unterschiedlichen Handlern (schlechte Idee, weil eine Unmenge an Code entsteht, der redundant ist)
  2. Für jede Mischungskombination von Abteilung einen neuen Authentifizierungshandler schreiben (ganz schlechte Idee, denn die Kombinationsmöglichkeiten wachsen mit n! [sprich: n Fakultät])
  3. Es gibt einen Handler, der nur prüft, ob die Abteilung auf die Intranetabfrage zugreifen darf. Mit den Nutzerdaten, die von der Authentifizierung als XML abgelegt sind, kann bestimmt werden, welchen Menüpunkt sie sehen dürfen und welchen nicht (Fantastische Lösung - das Menü baut sich dynamisch zusammen, je nach Login-Daten)

Die letzte Lösung klang nur zu schön. Seit Montag hab ich mich (neben anderen Sachen) damit herumgeärgert. Man suche im Netz: Eine Möglichkeit in einer eXtensible Server Page (XSP) das XML der Authentifizierung auszulesen (Die XSP gehört in der Pipeline in den Bereich der Datenerzeugung). Mit XSP kann man prima XML erzeugen und in der Transformation kann ich prima die Authentifizierungsdaten auslesen (Tja, leider zu spät), aber dazwischen - nichts! Bis heute Nachmittag... ich kämpfte mich schon durch die Javadoc's des Cocoon, als ich plötzlich die Lösung fand. Zwar etwas unorthodox, aber es ging...

UserState ustate = ((UserState) <xsp:expr> <xsp-session:get-attribute name=
   "org.apache.cocoon.webapps.authentication.components.
   DefaultAuthenticationManager/UserStatus"/></xsp:expr>); if (ustate.hasHandler()) {    UserHandler uhand = ustate.getHandler("handlername_as_defined_in_sitemap");    String username = uhand.getUserId();    ... }

Und wie drücke ich das am besten für Menschen verständlich aus? Man bekommt die Hauptspeise serviert und möchte aber schon wissen, was es als Nachspeise gibt. Die steht aber im Kühlschrank. Also guckt man, während die Hauptspeise serviert wird, durch die offene Küchentür und erkennt anhand der Sauerei in der Küche, was es als Nachtisch gibt. Deswegen müssen Programmierer immer so viel logisch denken - sonst gibt's keinen Nachtisch :roll: Au weia... ich muss gehen...

Murphy schlägt zu

Jan 0

heute morgenErstmal grimmig gucken... Am Wochenende wurde mir witzelnd die Frage gestellt, wann denn mal eine neue Ausgabe von "Besser programmieren für die Welt von morgen!" erscheint. Ziemlich sicher antwortete ich darauf, dass ich doch nun mittlerweile alle Bugs beseitigt hab und es wohl keine weiteren Ausgaben geben wird. Naja klar, solange bis man das nächste Mal auf Arbeit geht - Danke, Herr Murphy.

Kurze Schilderung des Problems: Ich muss einen Betrag aufteilen und durch interne Berechnungen und Rundungen kommt es zu einem Differenzbetrag zwischen dem aufzuteilenden Betrag und der Summe der Einzelbeträge. Und nun stolperte ich beim Durchsehen der Tests, dass statt einem Cent eine Differenz von 0 Cent ausgegeben wird. Ich schob die Schuld natürlich wieder auf die Konvertierungsroutine, denn eine fix reinprogrammierte Ausgabe zeigte mir auch einen Betrag von einem Cent an. Merkwürdigerweise konnte ich dort keinen Fehler finden. Gaukelt mir etwa der Rechner was vor? War die Differenz von einem Cent auch wirklich ein Cent? Also zog ich von dem Betrag den Wert von 0.01 ab und ließ mir das Ergebnis ausgeben. Vermutung war vollkommen korrekt, denn die 0.01 war in Wirklichkeit eine 0.009999999999998. Und damit rutschte sie in dieser Routine an der Rundung der Nachkommastellen vorbei.

if (0.01 > value && -0.01 < value); else {   value = ((0.0<(value*100.0))?(value*100.0+0.5):(value*100.0-0.5))/100.0;   // unterschiedliche Behandlung der Nachkommastellen   if (0.0 < (value*100.0))     nachkomma = ((long)((value-floor(value))*100.0))%100;   else     nachkomma = ((long)((value-ceil(value))*100.0))%100; }
WordPress Cookie Hinweis von Real Cookie Banner