MySQL InnoDB und das Ende der Welt

Wer erinnert sich noch an den Hype um das Jahr 2000-Problem – sicherlich einige. Mittlerweile schreiben wir das Jahr 2012 und alles scheint in bester Ordnung. Scheint – die Realität sieht manchmal leider etwas anders aus.

Alles beginnt mit ganz harmlosen Sympthomen: Ein Mitarbeiter meldet sich bei mir, er könne in der von mir betreuten Datenbank keine weiteren Datensätze anlegen. Die Fehlermeldung besagt, dass eine Schlüsselverletzung vorliegt.

Erster Ansatz: Nachschauen wo man mal wieder etwas zu restriktiv im Datenmodell oder irgendwo etwas zu simpel im Code gearbeitet hat. Aber leider: Fehlanzeige – nichts offensichtliches zu entdecken.

Nächster Versuch: Man füge einen Datensatz direkt auf SQL-Ebene ein – wichtig dabei, man halte sich so weit wie möglich an das Original beim Einfügen. Also lässt man ganz bewusst das Feld für den Primär-Schlüssel leer – steht ja auf auto_increment und damit meint man macht MySQL doch in der Regel keine Zicken.

Aber: Holla! Was ist denn das? MySQL weigert sich den Datensatz einzufügen, angeblich wegen einer Verletzung des Primär-Schlüssels!

Ein wenig Recherche später findet man dann denn auch die Ursache: Der Zahlenbereich des verwendeten Zahlentyps war am Ende. Nun dachte ich eigentlich, dass MySQL dann hergehen würde und sich irgendwie die nächstbeste freie Zahl nimmt – von mir aus ja auch negativ – ist ja kein Drama. Platz war definitiv noch – denn auch wenn in der Tabelle rund 150.000 Datensätze gespeichert waren, so ist das noch immer deutlich kleiner als die 2147483647 möglichen positiven IDs die ein 32 Bit signed Integer in MySQL zur Verfügung stellt (doppelt so viele nochmal wenn man die negativen Zahlen mitberücksichtigt).

Hotfix in dieser Situation war eigentlich recht einfach: von allen vorhandenen IDs eine möglichst große Zahl abziehen, unter Berücksichtigung der Einschränkung, dass keine Id auf den Spezialwert 0 fallen darf. Einfacher gesagt denn getan – die Tabelle repräsentiert nämlich eigentlich eine Baumstruktur mit einem Verweis auf den Vater der jeweiligen Zeile. Da kommt MySQL mit dem Update leider nicht klar, denn aufgrund der fehlenden Bedingung schnappt sich MySQL einfach einen Lock auf die gesamte Tabelle … und sperrt sich damit für ein on Update Cascade selbst aus 😐
Also doch die etwas härtere Tour:

  1. interne Schlüsselbeschränkung aufheben
  2. Immer gleichzeitig die ID und den Vater-Verweis um die gefundene Zahl dekrementieren (da von allen Werten ein konstanter Wert abgezogen wird entstehen wiederum gültige und konsistente Datensätze
  3. Vaterbeziehung wieder mit einem Schlüssel versehen

Warum so umständlich? – Auto-Increment-Rücksetzen funktioniert mit InnoDB als Engine nicht, siehe auch weiter unten. Fremdschlüssel generell abschalten wäre auch keine Maßnahme gewesen, denn die externen Referenzen haben ja ein „on update cascade“ – das erspart die langwierige Nacharbeit an x anderen Tabellen in der Datenbank.
Somit kann jetzt wenigstens erst mal wieder gearbeitet werden – die Arbeit für den Entwickler fängt aber jetzt erst richtig an…
Eine andere Alternative wäre die Vergrößerung des Schlüsselbereichs z.B. auf Bigint gewesen oder evtl. auch nur die Verwendung nicht-negativer Zahlen. Leider nicht ganz so einfach möglich, da die Tabelle an verschiedenen Stellen in der Datenbank referenziert wird und natürlich auch die referenzierenden Schlüsselwerte im Datentyp identisch sein müssen. Das wäre auf die Schnelle auch nicht so trivial gewesen.

Zeit für etwas Ursachenforschung – wie man so schön sagt: Lessons learned. Wie Allgemein üblich handelt es sich bei diesem Fehler nicht um eine singuläre Fehlerquelle sondern das Zusammenspiel mehrere Umstände.
Erste Fragestellung: Warum waren die ID-Werte überhaupt so ins Kraut geschossen?
Hierfür gibt es mehrere Gründe – einer ist die historische Wurzel der Datensätze: Diese stammten aus einer Access-Tabelle mit Replikaten. Hierbei setzt Access den Primärschlüssel nicht mehr auf auto_increment (monoton ansteigend wie sich das gehört) sondern auf Random – und da kommen dann recht fix große und auch negative Zahlen bei raus. Die hatte ich natürlich einfach übernommen.
Nächstest Problem: In der Tabelle fanden in letzter Zeit größere Mengen an Transaktionen statt: Die Tabelle wird teilweise aus einer anderen Tabelle gespeist, dabei werden die Datensätze automatisch generiert. Dieses Tool musste aufgrund von Fehlern mehrfach laufen und hatte teilweise dabei auch größere Mengen Einträge produziert – rund 600.000 an der Zahl bevor der Fehler auffiel und beseitigt werden konnte. Somit war man schon bedrohlich nahe ans Limit heran gekommen.
Soweit zur suboptimalen Verwendung der vorhandenen Schlüsselzahl – aber das war ja nicht alleine ausschlaggebend, immerhin könnte man ja erwarten, dass ein ausgewachsenes Datenbank-System sich selbständig um die Behebung des Notstandes: „Keine Schlüssel mehr da“ kümmert. Zumindest sollte man das annehmen. Nun kommen auch hier einige kleinere Probleme zusammen, die dann gemeinsam für den großen Ärger sorgen. Als Grundlage verwendet MySQL zwei verschiedene Datenbank-Engines – MyIsam als klassische Tabellenform, leider kann diese nicht mit Fremdschlüsseln umgehen. Daher gibt es InnoDB als neueren Standard. Diese hat zwar nicht die Performance in Sachen Volltext-Suche, kann dafür aber von Hause aus bereits mit Fremdschlüsseln umgehen. In der aktuellen Entwicklung ein unumgängliches Feature, das kaum ein Datenbankentwickler heute noch missen möchte.
Der Berechnungsalgorithmus für die nächste ID in InnoDB ist recht simpel gestrickt: Die nächste zu verwendende ID berechnet sich stets als max(id)+1 – was in MySQL bei Integer-Werten mit 32 Bit zu einem Fehler führt (erst ab Version 5.5) – der dann durch die Ebenen der Datenbank-Engine nach oben wandert und dort schließlich zum bekannten Fehler führt – leider ist der Hinweis duplicate key for primary da nicht sonderlich hilfreich um gleich die Ursache zu erkennen. Dieser Algorithmus wird auch angestoßen, wenn man den Auto-Increment-Zähler manuell versucht zurück zu setzen, oder bei einem Server-Neustart. Simple Lösungen mag ich ja eigentlich, aber so simpel hätte es in dem Fall doch nicht sein müssen.
Interessanterweise ist der Fehlerfall ja sogar in der Dokumentation beschrieben (siehe hier:) – netter Nebeneffekt: Wenn man als Datentyp BigInt (also 64 Bit-Zahlen) verwendet, dann klappt es auch mit dem Wrap-Around am Ende des Zahlenbereichs, es wird dann wieder bei 1 bzw. im negativen Bereich weiter gezählt. Warum habe ich noch nicht ergründen können, ich vermute mal, dass InnoDB intern schon mit 64 Bit arbeitet.

Kommen wir zu den Lehren für weitere Projkete oder auch nur die Neuanlage neuer Tabellen:

  1. An InnoDB führt kein Weg vorbei wenn Fremmdschlüssel im Spiel sind, und Fremdschlüsselmechanismen sind generell begrüßenswert
  2. Beim Import von Alt-Daten wenn es möglich ist, deren ID-Werte verwerfen und neue vergeben (leider nicht immer ohne größeren Aufwand möglich)
  3. Wenn sinnvoll möglich BigInt als Datentyp für die ID-Spalte verwenden, das schafft Luft und es klappt auch mit dem Überlauf richtig
  4. Für den Fall der Fälle Mittel in Bereitschaft haben, um das Problem durch „Renumerierung“ lösen zu können (nicht immer hat man die Zahlen in einem bestimmten Bereich liegen so wie in diesem glücklichen Fall).

Weitere Kommentare herzlich willkommen.

Lehrgang FüS UFü (H91) in Hoya

Kurzfristig ergab sich für mich die Möglichkeit zur Fortbildung im THW. Thema diesmal Führungssystem für Unterführer – erster Teil eines zweigeteilten Lehrgangs. Da ich ja mittlerweile einen Truppführerposten übernommen habe, war es nur noch eine Frage der Zeit bis dieser Lehrgang fällig würde.

Auf dem Lehrplan standen unter anderem die Kernbereiche Ausbildung und Führung. Während Ausbildung für mich als ehemaligen Jugendbetreuer doch ein alter Hut ist, war in Sachen Führung doch einiges an Neuland dabei. Nichts was ich nicht schon mal grundlegend gehört gehabt hätte, aber jetzt ist es doch mal ganz gut alles im Zusammenhang zu kennen.

Höhepunkt in Sachen eigner Ausbildung war sicherlich die Erkundungsübung nach einem angenommen Unfall in Hoya. Dies hat den doch sehr stark theorielastigen Lehrgang deutlich aufgelockert.

Donnerstag stand dann die Prüfung samt sogenannter Lehrprobe an – mit ein wenig Vorbereitung war die Prüfung aber ohne weiteres machbar. Auch wenn man sich jeden Abend noch der Kameradschaftspflege im Treffpunkt gewidmet hat. Wie immer: Alles mit Maß und Ziel und Abwägung – dann klappt es alles.

Die Lehrprobe war mich schon fast kalter Kaffee – ich habe es vielmehr als Möglichkeit warhgenommen mal wieder einen Vortrag zu halten und dabei etwas zu Üben und zu experimentieren. Das Thema war frei wählbar – ich habe mich dann der Berichterstattung auf Websites und die zugehörigen Bilder angenommen. 20 Minuten – einige Leute empfanden das als echte Herrausforderung – für mich eher weniger – denn wer einen ganzen Tag mit praktischer Ausbildung für einen Sack Flöhe (aka Jugendgruppe) regelmäßig erfolgreich gestaltet hat für den sind erwachsene Zuhörer und eine kurze Zeitspanne ja schon fast Erholung.

Erholung war der Lehrgang für mich auch in anderer Hinsicht, wenn auch nicht in der Entspanntheit wie ich mir das gewünscht hätte. Eine vollständige Loslösung von meiner Arbeit war nicht möglich. Noch auf der Hinfahrt habe ich just-in-time eine neue Funktionalität für das Datenbanksystem eingebaut. Alles andere als erfreulich, aber manchmal geht es nicht anders.

Das ich dann auch noch während des Lehrgangs abends Bugs nachverfolgen musste und diverse e-mails aufgelaufen sind, war so nicht geplant und hat mich doch etwas unter Stress gesetzt. Den hätte ich nicht unbedingt noch gebraucht. Auch wenn ich den Lernaufwand für absolut überschaubar halte. Die Prüfung war absolut im Rahmen, da bin ich anderes gewohnt, wohl auch eine der Nachwirkungen aus der Uni und FH-Zeit.

Entpsannung habe ich mir dann aber auch verschafft und bin duch die herrliche Landschaft gejoggt. Leider ist die Vielfalt der Wege etwas eingeschränkt, vor allem sieht man gleich zu Beginn wo man am Ende sein will. Die Gegend ist einfach nur flach – von ein paar Einschränkungen der Weitsicht durch Bäume/Sträucher etc. mal abgesehen. Wer jetzt denkt das ist alles locker flockig zu Laufen, der hat die Rechnung ohne den Wind gemacht. Auf dem Hinweg habe ich mich noch ein wenig gewundert, warum alles so locker flockig läuft und ich so zügig unterwegs bin. Der Rückweg war denn um so anstrengender – was ich sonst an Steigungen übe, übt man im Flachland einfach gegen den Wind. Man ist sogar richtig froh um jedes Bisschen Bewuchs rechts und links der Wege – Wahnsinn wie viel Wind das doch abhält.

Insgesamt ein sehr guter Lehrgang und eine interessante Woche, auch wegen der Erfahrungsaustausches mit anderen Helfern.

Posted in THW |

Die Sache mit dem richtigen Fokus

Der menschliche Organismus ist schon ein Wunderwerk – man kann es kaum anders ausdrücken. Im Zusammenspiel der Augen und dem Gehirn ermöglicht es uns in aller Regel einen großen Bereich der Wahrnehmung abzudecken. Sei es ein Panorama, ein Ausblick über eine große Fläche bei dem wir weniger auf Details achten sondern das Gesamtbild auf uns wirken lassen, oder das genaue Gegenteil: Der stark eingeschränkte Blick auf einen sehr kleinen Bereich, die Betrachtung eines winzigen Details um es bis ins Letzte zu erfassen und zu verstehen. Der Sehaparat leistet hierbei ganze Arbeit aber auch die Aufbereitung der Information im Hirn ist hochgradig spezialisiert. Mit dem Heranwachsen entwickeln wir die Fähigkeit unwichtige Dinge auszublenden, uns auf das Wesentlich zu konzentrieren – ganz egal ob Weitwinkel oder Tele-Einstellung – unser Hirn blendet unwichtige Dinge aus die wir derzeit nicht dringend benötigen. Wir nehmen sie nicht in voller Intensität war. Und das ist auch gut so, andernfalls würden wir irgendwann vor lauter Reizen erschlagen werden. Wer beispielsweise mit dem Auto unterwegs ist, kennt den Effekt sicherlich: Noch eben plaudert man gemütlich mit den Mitfahrern, der Verkehr fliest gemütlich vor sich hin. Aber dann kommt etwas, dass diese Ruhe stört – sofortiges und richtiges Handeln ist gefordert – beispielsweise weil man vor sich plötzlich ein Stauende hat. Mit einem Mal ist der Fokus voll auf der Straße, die ganze Konzentration steht zur Aufnahme der wichtigen Infos zur Verfügung – alles ander wird beiseite geschoben.

Auch im Geschäftsleben haben wir ständig mit einem Wechsel des Fokus zu tun – auf der einen Seite dürfen Details nicht übersehen werden, auf der anderen Seite gilt es den Überblick nicht zu verlieren. Besonders augenfällig wird die Problematik, wenn man Software entwickeln soll, die das Zusammenspiel mehrer Menschen ermöglichen oder vereinfachen soll. Auch hier gibt es zwei konträre Skalen-Enden: An einem Ende die Erfassung der Details des Facharbeiters mit allen Informationen bis hin zur letzten Schraube. Am anderen Ende die Verwaltung, bzw. neudeutsch das Management. Dort sollte es nicht auf die einzelne Schraube ankommen – wichtiger ist hier die Frage: Sind genügend Schrauben vorhanden, damit alle Arbeiten erledigt werden können?

Als Programmierer steht man somit vor einem Dilemma: Richtig recht machen kann man es auf Anhieb sowieso niemandem.
Die Lösung heißt in diesem Fall: spezialisierte Ansichten für jeden Anwender schaffen. Dies wird im Englischen gerne zusammenfassend beschrieben als „Overview first, zoom and filter, detail on demand“. Auf deutsch: Beginne mit einem groben Überblick und lasse den Benutzer entscheiden wie er weiter vorgehen möchte. Filtern hat hier nicht zwingned die Bedeutung der Anwendung eines regelbasierten Filters (auch wenn es dem Programmierer oftmals das Leben um ein Vielfaches leichter machen würde). Welche Auswahl ein Benutzer trifft ist eine sehr komplexe Sache, die sich nicht immer zur vollsten Zufriedenheit aller Beteiligten lösen lässt. Das man Details nur anschaut, wenn man sie auch wirklich braucht ist dann ja nur eine logische Konsequenz.

Soweit die Theorie, es folgt die Praxis. In meiner doch recht umfangreichen Erfahrung mit dem Design im Web habe ich Tabellen für den Überblick schätzen gelernt. GGf muss man diese auf mehrere Seiten zerlegen, damit die Ladezeit sich in Grenzen hält und der Benutzer nicht erschlagen wird. Problematisch wird es insbesondere bei der Datenverwaltung, wenn die Anzahl der Datensätze trotz eines möglicherweise gesetzten Filters zu groß wird als dass man sie vollständig erfassen und verstehen kann. Ich rede hierbei explizit von den gerade aktuell notwendigen Daten, dass Archive stark angefüllte Gebilde sein können ist mir bewusst, aber hier kann man ja noch recht gut über die Zeitschiene arbeiten. Bei einer Liste aktuell zu erledigender Aufgaben geht das nunmal nicht, allenfalls lässt sich über eine Priorität nachdenken. Zusammenfassen zu Gruppen ist eine weitere Alternative, allerdings ist diese nicht immer anwendbar. Programmseitig lässt sich vieles davon ohne größere Verenkungen umsetzen.

Richtig problematisch wird es allerdings wenn die Daten aus dem betreffenden Projekt zu umfangreich werden – die Software es dann aber richten soll. Wenn ich mehr als 50 Probleme in einer Liste stehen habe, die alle höchste Priorität haben, dann muss ich mich fragen ob es wirklich ein Software-Problem ist wenn der Überblick verloren geht. Ich sage ja auch immer: Eine Software löst keine Probleme im Allgemeinen. Eine Software kann nur unterstützen, oder sehr sehr spezialisierte Aufgaben übernehemen. Diese Aufgaben müssen sich aber auch in Code gießen lassen. Geht es beispielsweise um eine statische Berechnung, so kann man eine Software erstellen, die anhand der Geometrie, der verwendeten Materialien und einigen anderen Randbedingungen wie Temperatur mögliche Schwachstellen berechnet. Die Software kann dann nicht die Schwachstellen beseitigen, darüber muss man sich immer im Klaren sein.

Noch eine Stufe problematischer, und das erlebe ich derzeit leider mal wieder, ist es wenn die Filterung bzw. der eingangs erwähnte Focus auf die richtige „Ebene“ nicht vorhanden ist. Eine Vorgänger-Software zeigte beispielsweise immer alle Ergebnisse immer vollständig an – eines pro Seite zum „Blättern“ (Access verleitet dazu solche Konstrukte zu bauen) – Ergebnis: Man verlor ggf. auch bei gefilterten Ergebnissen den Überblick. Gerade den braucht man aber, wenn man fundierte Entscheidungen auf der Management-Ebene treffen möchte. Gerade das ist ja die Aufgabe eines Vorgesetzten: Er hat nichts anderes zu tun, als dafür Sorge zu tragen, dass die unterstellten Mitarbeiter möglichst effizient arbeiten können. Ich verlange hier jetzt bewusst nicht das alte Bild vom Vorgesetzen der nur nebendran steht und zusieht wie seine Mitarbeiter sich abquälen. Ein guter Vorgesetzer weiß wann es sinnvoll ist, auch mal eben selbst mit anzupacken und sich ggf. auch mal die Finger schmutzig zu machen. Aber es darf kein Dauerzustand sein.

Als Software-Entwickler endgültig gekniffen ist man dann, wenn es heißt: Wir wollen das weiterhin so haben, nur besser. Was macht man da? Ich habe noch keine richtige Antwort darauf gefunden. Klar kann man hergehen und es alles etwas aufhübschen und auf den neusten Stand der Technik heben – aber das löst die Problematik einer schlecht gestalteten Software eben nicht. Genausowenig wie das 1:1 umsetzen einer Datenbank auf einen neuen Unterbau sinnvoll ist um die Funktion zu erweitern oder die Performance zu steigern. Leistungsfähige Hardware kann sicherlich etwas bringen, genauso wie gute Datenbank-Server oder andere Infrastruktur, aber all das verpufft im Nichts, wenn die Datenstrukturen unterhalb nicht stimmig sind oder das Modell an allen Ecken und Enden nicht mit der Realität überein stimmt. Leider sind solche Probleme gerade gegenüber Vorgesetzten sehr schwer zu erläutern und zu rechtfertigen.
Auch da fehlt es in meinen Augen mal wieder an der richtigen Einstellung des Focus.

Es ist nicht immer einfach die richtige Einstellung des Focus zu finden, jeder der Bilder gestaltet kennt das Problem. Aber mit ein wenig Übung und Sorgfalt und vor allem der regelmäßigen Kontrolle kann es doch recht gut in den Griff bekommen. Dazu gehören unter anderem Fragen wie: Ist diese Aufgabe bei mir richtig angesiedelt? Sollte ich sie an einen Fachmann deligieren? Gehört das wirklich auf meine Ebene, in meinen Aufgabenbereich? Dann klappt es auch mit der Verwendung von Software und dieses Werkzeug entfaltet dann auch seine Wirkung.

Lauf in Groß-Gerau (Fastnachtslauf)

Die Laufsaison läuft seit etwas anderthalb Monaten, eigentlich Zeit für einen kleinen Test wie es um die eigene Fitness steht – auch im Hinblick auf die weiteren Marathonvorbereitungen. Aber so richtig bin ich nicht in die Pötte gekommen mit der Planung für einen Lauf.
Am Freitag hatte ich dann mal bei unserem Trainer im Verein angefragt, ob er mir mal einen Trainingsplan zusammenstellen kann. Dazu brauchte er allerdings eine Angabe über den letzten Wettkampf, vorzugsweise etwas über 10km. Mein letzter Wettkampf war im November, LGA-Indoor-Marathon – die Zeiten von dort kann man aufgrund der Streckencharakteristik nicht gut vergleichen und als Grundlage heran ziehen. Außerdem ist das ja auch schon wieder einige Zeit her.

Ich wusste, dass es in Groß-Gerau (ca. 50km von Mannheim) einen Lauf immer am Fastnachtsamstag gibt, an dem hatte ich sogar schon einmal teilgenommen – das war 2008. Also nach dem Training mal nachgeschaut: Ja findet statt, Start um 15:00h und 7 EUR Nachmeldegebühr. Insgesamt ein sehr humanes Angebot, aber es sind ja auch nur 10km – in Erinnerung hatte ich komischerweise 12km, aber das dürfte die Erinnerung an den Dreikönigslauf in Kersbach gewesen sein.
Immerhin lässt mir das ja doch einige Stunden mehr Zeit zur Regeneration als ich gedacht hatte – ich hatte schon befürchtet, dass der Lauf sehr früh um 9:00h startet – also ca. 12h nach der letzten Trainingseinheit.

Samstag, das Wetter grau in grau, anfänglich sogar noch mit etwas Nieselregen garniert. Eigentlich absolut kein Laufwetter, aber egal ich mache mich dennoch auf den Weg nach Groß Gerau. Das Wetter wird etwas besser, allerdings auch windiger und somit etwas kühler 6°C lese ich ab als ich auf dem schon rappelvollen Parkplatz 45 Minuten vor dem Start eintreffe. Umziehen, Nachmeldebogen ausfüllen, Startnummer anheften und noch ca. 15 Minuten aufwärmen. Etwas was ich bisher bei Wettkämpfen eher vernachlässigt habe – aber man ist ja lernfähig.
Angesichts des Windes laufe ich mit Jacke und Handschuhen – auch darunter lange Funktionskleidung. Das Starterfeld ist auch bunt gemischt – teilweise in kurzen Hosen (mir wird schon bei dem Gedanken kalt) aber auch passende Bekleidung für die 5. Jahreszeit ist vertreten. Gefühlt ordne ich mich doch recht weit vorne in die Reihen der Starter ein – ob es gut geht weiß ich noch nicht, aber ich bin gewillt das ausgegbene Ziel von 5 min/km oder weniger anzugehen. Im Training tue ich mir da immer sehr schwer, da ich keine GPS-Uhr mit mir herum trage sondern nur einen Pulsmesser (der macht dafür auch klaglos so Dinge wie Ulm mit ohne das die Batterie irgendwann aufgibt). Aber im Wettkampf stehen ja alle Kilometer angeschrieben.

Die Strecke an sich bietet keinerlei besondere Highlights, sie ist bis auf wenige Stellen topfeben, und geht in langen Geraden durch den Wald – fast wie ich sie aus meinen Anfangszeiten in Nürnberg kenne. Pünkltich um 15:00h knallt der Startschuss und der Pulk setzt sich in Bewegung. Nach etwa 10 Sekunden bin auch ich endlich über die Startlinie gelaufen. Es beginnt das übliche Sortieren des Feldes auf den ersten Kilometern. Ich überhole jede Menge Läufer, mal links mal rechts, wo es der Weg eben gerade hergibt. Die Strecke bis zum ersten Kilometer fühlt sich elend lang an – aber ich bin recht flott unterwegs – die Stoppuhr zeigt 4:18 – also doch recht flott – aber ich merke es auch, so weiter wird wohl nicht ganz drin sein, auch wenn ich mir das wünschen würde. Ich zwinge mich dazu mein ständiges Überholen etwas zu reduzieren – das Feld hat sich etwas gelichtet aber es ist immer noch recht dicht. Es folgt die Abzweigung auf die Schleife, eine Gerade die sich knapp 3 km wie mit dem Lineal gezogen durch den Wald zieht. Dabei zieht sich das Feld immer weiter auseinander – ich versuche mich etwas im Zaum zu halten und reihe mich bei hinter einem etwa gleich schnellen Läufer ein. 4:25, 4:27, 4:34 – ich werde also langsamer, aber innerlich fühle ich mich langsam besser – es ist nicht mehr kühl um die Zehen und auch die Handschuhe habe ich zwischenzeitlich in der Jacke verpackt. Außerdem zwischendrin schon mal vorsorglich einen Schluck aus der Flasche genommen – auch wenn andere meinen 10km könne man ohne irgendwas machen – wenn ich Durst habe laufe ich schlechter, also rein mit dem Apfelschorle, und wenn es nur ist um den Mund zu befeuchten.

Mit dem Passieren des 4km Schilds kommt auch die nächste Kurve in Sicht – fast die Hälfte habe ich geschafft motiviere ich mich, während es durch die Lagerstätte der örtlichen Försterei geht – dort liegt derzeit jede Menge Holz fein säuberlich aufgereiht auf den Wiesen rechts und links des Weges – eine interessante Kulisse. Kurz danach geht am 5km Schild vorbei, wieder 4:34 – das scheint mein Los für diesen Lauf zu sein. Wenige Meter nach dem Schild geht es um die nächste Kurve, man ist also jetzt auch psychologisch auf „Heimweg“ eingestellt. Auf dem folgenden Streckenabschnitt gibt es immerhin einige leichte Kurven, damit ist die Strecke etwas kurzweiliger und die Kilometer kommen mir kürzer vor. zudem geht es ganz leicht bergan – ich merke an dieser Stelle doch einige Muskeln die sich für das Training am Vorabend rächen. Aber die werden jetzt einfach ingnoriert. Eine rechts-links Kombination folgt, und direkt nach derersten Kurve steht auch schon das 6km Schild. Noch 4 Kilometer, Ankommen ist auf alle Fälle drin, nur die Zeit noch nicht ganz sicher. Wahrscheinlich aufgrund der langezogenen Abwärtsphase des letzten Kilometers bin ich wieder schneller geworden 4:32 meldet die Uhr.

Ich motiviere mich weiter, mahne mich allerdings auch wieder zu etwas mehr Disziplin – jetzt nur nicht reintreiben lassen, sonst gibt es am Ende ein böses Erwachen. Mit einer Läuferin liefere ich mir fast den gesamten Kilometer ein zähes Ringen, wir bewegen uns scheinbar ewig auf gleicher Höhe, wann ich immer ich etwas Gas gebe zieht sie auch an, ebenso natürlich umgekehrt. Dazu kommt teilweise ein ekelhafter Wind an den Lichtungen: Schräg von vorne – da heißt es zusätzlich nochmal Kraft aufbringen. Dafür fliegt der Kilometer 7 schon fast an mir vorbei – 4:31 laut Uhr, also nochmal schneller geworden. Das Feld ist an meiner Stelle doch schon sehr weit auseinander gezogen – ich habe gute 20 m bis zum Vordermann und hinter mir ist auch eine größere Lücke. Nahc der nächsten Kurve taucht auch schon das 8km Schild auf – trotz allem Apell an die Vernunft ich bin wieder schneller geworden, das muss der Stallgeruch des Ziels sein, der mich da antreibt: 4:28.

Noch zwei Kilometer, kurz nach dem Kilometerschild 8 verläuft die Strecke wieder auf der gleichen Trasse wie zu Beginn, nur eben in die andere Richtung. Ich versuche bewusst die Geschwindigkeit konstant zu halten, um noch etwas Luft zum Beschleunigen zu haben – nochmal ein Zug aus der Getränkeflasche und dann kommt auch schon der Kilometer 9 in Sicht – 4:30 also doch etwas langsamer geworden – heißt im Gegenzug: Für den letzten muss ich noch etwas Gas geben. Leider fehlt es gerade an Läufern, an die man sich „heransaugen“ könnte – Stück für Stück komme ich doch einigen näher, aber auf der Zielgeraden sind doch ettliche Meter Abstand zur Läuferin vor mir – noch dazu bremst sie im Zielkanal völlig abprupt ab, so dass ich fast mit vollem Schwung des Endspurts in sie reinrausche … vor allem vergesse ich meine Stoppuhr zu betätigen – es dürften aber auch wieder etwas um die 4:25 rum gewesen sein.

Am Ende sind es 44:58,8 die ich für die 10km benötigt habe, also deutlich unter der Vorgabe der 5 min/km. Von daher bin ich ja mal ganz zufrieden mit dem Lauf. Im Nachinein muss ich feststellen – gegenüber 2008 waren es nur knapp 38 Sekunden weniger. Aber immerhin schneller. Nur bei der Platzierung bin ich diesmal schlechter – was wohl auch daran liegt, dass dieses Jahr mehr Teilnehmer dabei sind – und vor allem deutlich mehr in meiner Altersklasse – gesamt Platz 181 und in der Altersklasse im hinteren Drittel auf Platz 32 bei insgesamt 430 Teilnehmern (davon 39 in meiner AK). Zum Vergleich 2008: Platz 161 gesamt, 14. in der AK, 386 Teilnehmer und 32 meiner Altersklasse. Damit werde ich wohl leben müssen – die Traumzeiten meiner Altersklasse werde ich wohl nicht mehr erreichen: 32:15,3 dieses Jahr und damit auch der Gesamtsieger – und das ist noch nicht mal Streckenrekord. Da müsste ich wohl wirklich meinen Trainingsplan ganz gehörig umstellen und noch mehr Einheiten machen um auf solche Zeiten zu kommen. Die Grenzen zwischen Freude am Sport und Quälerei sind ja bekanntlich fließend.

Die Siegerehrung findet in der Turnhalle in Groß-Gerau statt, das ist leider etwas weiter weg vom Start und Ziel – was sich auch in der Teilnehmerzahl dort und den Ehrungen bemerkbar macht. Es dauert relativ lange bis es endlich losgeht und auch die Startnummern-Tombola bringt mir diesmal nichts. Aber auch egal – das Kuchenbuffet sorgt auf alle Fälle für den zeitnahen Kalorien-Ausgleich. Auch hier merkt man wieder, dass die Veranstaltung ehrenamtlich organisiert wird – die Preise sind mehr als im Rahmen – 1 EUR für ein Stück Kuchen, 50 Cent für eine Tasse Kaffee – da kann man echt nicht meckern. Ich denke mal ich nehme den Lauf in den Plan für kommendes Jahr auf – auch wieder als Test für die Fitness – mal sehen ob nicht doch noch ein paar Sekunden rauszuholen sind.

Die unbeschreibliche Macht des Doppelklick

Da bekomme ich mal wieder eine Nachricht: Da funktioniert was nicht richtig, kannst du mal helfen …
Klar kann ich das in aller Regel – ist ja mein Job, und in dem Fall auch noch meine Software.

Wie in so vielen Fällen (ja auch meine Software hat mal den ein oder anderen Fehler, ich bin auch nur ein Mensch), liegt das Problem aber nicht bei meiner Programmierung sondern sitzt ca. 80cm vor dem Bildschirm. Genauer gesagt liegt das Problem rund 60cm neben selbigem. Die Rede ist von nichts anderem als einem Zeigerät – wahlweise als Maus, Nager, Ratte, Trackball oder Touchpad zu bezeichnen.

Die Verwendung ist denkbar einfach: Aufgrund von Bewegungen des Geräts (oder entsprechenden Sensoren bei Touchpads und Trackballs) kann man den Mauszeiger über den Bildschirm bewegen. Für die Leute die es sich nicht vorstellen können: Es gab auch eine Zeit, da bediente man Rechner nicht über eine graphische Oberfläche oder musste diese gar von Hand erst starten. Auch heute ist solches Wissen oftmals Gold wert. Wer regelmäßig im Remote-Bereich arbeitet weiß wie mächtig die angeblich so dröge Kommandozeile sein kann (egal für welches Betriebssystem) – nur erfordert sie deutlich mehr Wissen und Mitdenken des Benutzers. Das will man nicht immer, gerade wenn man für andere Arbeiten den Kopf frei haben möchte.

Aber zurück zum eigentliche Problem, bzw. dessen genauerer Eingrenzung: Während die Interaktion des Mauszeigers mit der Bewegung der Hand für die allermeisten Benutzer recht zügig zu erlernen und intuitiv verstanden wird (wenn nicht gerade jemand die Auswertung von X und Y-Koordinate vertauscht hat – ein großer Spaß um Kollegen zu verwirren), ist die nächste Ebene der Interaktion schon deutlich komplexer: Es geht um die Tasten die auf dem Gerät vorhanden sind. Die aktuellen Ausführungen bestehend zumeist aus drei Tasten:
[list]
[*]links
[*]rechts
[*]Mitte (oftmals als Rad ausgeführt)
[/list]
Das Mausrad als eine eigentlich recht späte Entwicklungsphase des PC-Nagers (eingeführt von Microsoft mit der IntelliMouse im Jahr 1996), häufig ist er mit der praktischen Funktion verknüpft durch den aktuellen Bildinhalt zu scrollen (je nach Ausführung sogar waagrecht, in aller Regel jedoch nur vertikal) – diese Funktionalität hatte man früher auf der Tastatur mit den Pfeiltasten – auch heute funktioniert das noch erstaunlich gut. Eigentlich eine sehr komplexe Funktion, dennoch wird sie intuitiv meist richtig angewandt.

Die eigentlichen Funktionstasten der Maus bereiten hingegen immer wieder Probleme, obwohl die Funktion denkbar einfach ist: Durch das Drücken einer Taste wird ein Schalter geschlossen – der Rechner erkennt welche Taste gedrückt wurde und meldet das der Software weiter, damit diese darauf reagieren kann. Wie die Reaktion ausfällt ist von Software zu Software unterschiedlich. Software meint in diesem Zusammenhang auch ausdrücklich das Betriebssystem des Rechners (also Windows, Linux, MacOS – ob man es glaubt oder nicht, auch das ist „nur“ Software).

Im allgemeinen hat sich ein gewisser Standard herausgebildet – die Maustaste unter dem Ringfinger (bei 3 Tasten) bzw. dem Mittelfinger (bei 2 Tasten) öffnet ein Menü mit zusätzlichen Funktionen, abhängig vom Kontext. Daher auch der Name Kontext-Menü. Schon die Verwendung dieser alternativen Funktion ist vielen Benutzern nicht wirklich geläufig. Dabei ermöglichen sie dem Programmierer von graphischen Oberflächen eine direkte Möglichkeit auf die Bedürfnisse des Benutzer so spezifisch als möglich zu reagieren. Denn vielfach kann man heute nicht mehr zwingend vorhersagen was sich genau an welcher Stelle auf dem Bildschirm finden wird, auch das ein Folge von graphischen, fenster-basierten Benutzeroberflächen.

Noch weniger bekannt (und oftmals auch ohne weitere Funktion) ist die Tastenfunktion des Mausrades – diese variiert von Software zu Software stark.

Bleibt eigentlich nur noch eine Taste übrig, im Regelfall als linke Maustaste bezeichnet, allgemeiner ist es die unter dem Zeigefinger. Mit dieser Taste führen wir die allermeisten Operationen aus – von Markieren durch Ziehen, Positionieren des Cursors im Programmcode bis hin zum Anwählen/Anklicken von Schaltflächen verschiedenster Art. Eigentlich ganz logisch, der Mauszeiger als verlängerter, digitaler, virtueller Zeigefinger. Leider hat sich unter Windows die Technik des Doppelklicks zum Starten von Programmen etabliert (unter Linux reicht ein einfacher Klick) – mit teilweise skurielen Auswüchsen: Auf nahezu alles und jedes wird doppelt drauf geklickt – ob sinnvoll oder nicht! Da wird im Netz auf Links ein Doppelklick ausgeführt, weil man ja eine Aktion erwartet und man bei Rechnern immer alles mit Nachdruck tun muss … so oder ähnlich muss sich das Doppelklicken bei einigen Leuten ins Gedächtnis eingebrannt haben. Ich frage mich manchmal was wohl passiert wäre, wenn Microsoft damals es für praktischer befunden hätte den Tripleclick oder gar den Penta-Klick als Startoperation zu verwenden …

Falls irgendjemand eine Idee hat, wie man die „Seuche“ der Doppelklickeritis auszurotten – ich bin für jede Anregung dankbar. Ich habe ja schon überlegt, ob ich einfach überall ein JavaScript einbaue, das zentral die Doppelklicks zählt und dann ggf. nach übermäßiger Menge eine Fehlermeldung ausgibt. Ob das wirklich zielführend ist, wage ich zu bezweifeln. In diesem Sinne „happy x-fach clicking“

RPM und andere Höllen

Da denkt man an nichts böses und will nur mal eben eine aktualisierte Software auf dem Server einspielen. Eigentlich keine größere Sache sollte man meinen, sind doch die aktuellen Linux-Distributionen allesamt mit einem Paket-Management-System ausgestattet, das es erlaubt Software recht einfach zu installieren und zu warten. Wenn alles glattläuft, wie gesagt, wenn …

Angefangen hat alles mit einer Fehlermeldung, dass in einem Webinterface die Bilder nicht angezeigt werden. Im Hintegrund werkelt ein PHP-Skript, das die Bilder bei Bedarf auf die passende Größe runter sakliert – das senkt den Bandbreitenbedarf und die Übetragungszeiten für eine Website. Zudem hat man dann als Autor noch ein wenig mehr Einfluss auf die Qualität – die Skalierungsmechanismen der verschiedenen Browser sind nicht alle wirklich gut.

Ursprünglich habe ich mal auf die integrierte GD-Bibliothek von PHP gesetzt allerdings musste ich recht bald schon feststellen: Die ist für einfache Dinge ganz brauchbar (und in den meisten Fällen auch einfach schon vorhanden), aber die Performance ist nicht unbedingt berauschend. Gerade aber für die Erstellung von Bildergalieren on-the-fly ist die Performance (oder die Ungeduld des Benutzers) wichtig. Fündig geworden bin ich bei der Imagick-Erweiterung für PHP. Diese basiert auf der ImageMagick-Bibliothek. Diese hat den Vorteil direkt in C geschrieben zu sein und die Performance macht echt Freude. Zudem sind die Möglichkeiten doch mittlerweile sehr ausgefeilt.

Wie nahezu jede Software hat sich auch Imagick weiterentwickelt und damit gab es einige Veränderungen an den Schnittstellen und Funktionen – daher funktioniert die Bilder-Skalierung nicht mehr wie gewünscht: Auf dem Testserver hatte ich eine aktuellere Version installiert und auch auf dieser Basis programmiert – mit der älteren wollte das nicht so recht harmonieren, es fehlten einfach ein paar Funktionen bzw. diese wurden verändert und teilweise umbenannt.

Nun gut, dann aktualisiert man doch einfach auch mal das produktive System. Da mein Hosting-Anbieter zum Installationszeitpunkt nur die Wahl zwischen Plesk (alles vorgefertigt und Clicki-Bunti) oder CentOS 5 minimal geboten hatte, habe ich mich notgedrungen für CentOS als RedHat-Devirat entschieden, denn auf einigen Komponenten möchte ich doch gerne etwas mehr Einfluss nehmen als es Plesk von Hause aus zulässt (Stichwort Mailserver, Virenscanner und Authentifizierungsmethoden). CentOS ist ein Unternehmenslinux und das merkt man – hier wird viel Wert auf stabile und sichere Software gelegt, weniger darauf die aktuellsten Funktionen bereit zu halten. Als Folge habe ich damals schon einige Software von Hand kompiliert und installiert – eine Zeit lang hatte ich ja auch mit Linux from Scratch gearbeitet – also kein wirkliches Neuland für mich. Allerdings klappt es nicht immer auf Anhieb, die Software selbst zu installieren und nur bestimmte Teile direkt wie geliefert zu verwenden. Aber es hat ja am Ende alles funktioniert. Nur mit den Updates muss man dann halt vorsichtig sein.

Das letzte Update ist denn auch irgendwo mal stecken geblieben. Als Folge davon gab es noch nicht vollendete Transaktionen des Paket-Managers (yum) – mit

yum-complete-transaction

lässt sich soetwas auch beheben. Nur ärgerlich wenn das auch nicht klappt, weil dem virtuellen Server mal wieder der Arbeitsspeicher ausgeht – also erst mal einige Server-Prozesse stoppen, und dann das Update machen … Immerhin läuft es dann auch durch. Auch wenn noch ein paar Klippen wie beschädigte Repository-Datenbanken zu beheben sind.

Wie sich herausstellt: Leider ist mit den verwendeten Quellen / Repositories keine aktuellere Version von Imagick zu bekommen. Aber es gibt ja alternative Quellen wie das Remi-Repository – dort finden sich viele Pakete aktuellerer Software als in den offiziellen Quellen von CentOS. Das führt ggf. zu doppelten und widersprüchlichen Paketen und Abhängigkeiten die sich im Kreis drehen. Mit ein wenig Nacharbeit kann man diese Abhängigkeiten aber auflösen, indem man explizit vorgibt, welche Version aus welcher Quelle man denn nun haben möchte. Damit lässt sich schon mal die aktuelle Fassung von ImageMagick installieren (das Paket dazu im Remi-Repository heißt ImageMagick2).

Wie ich bereits geschrieben hatte, habe ich einiges an Software selbst kompiliert – unter anderem PHP, da es das von Haus aus bei CentOS nicht mit den Erweiterungen und Einstellungen und vor allem in einer aktuellen Fassung gab. Das macht mir natürlich jetzt etwas Probleme, denn die Imagick-Erweiterung lässt sich nicht so ohne weiteres per Paket-manager installieren. PHP hat dafür mittlerweile etwas vergleichbares wie einen Paket-Manager – nur auf Quellcode-Basis mit automatischer Kompilierung. Vergleichbar ist das mit dem CPAN-Archiv von Perl – auch dort werden viele Module für Perl bereit gehalten und lassen sich damit auch problemlos installieren und auf dem aktuellen Stand halten. Bei PHP heißt das Tool dazu PECL (PHP Extension Community Library), zudem gibt es noch PEAR (PHP Extension and Application Repository) – beide arbeiten recht gut zusammen und machen das Leben mit PHP um einiges leichter.

PECL ist das richtige Stichwort – es bietet unter anderem auch die Option die Imagick-Erweiterung zu installieren. Leider ist die Freude erst mal nur kurz – das verwendete PHP-Modul wird weiterhin gegen die veraltete Version (6.2.x) von Imagick gelinkt. Klar die hatte ich ja nicht deinstalliert, denn das Package ImageMagick2 darf parallel zu ImageMagick installiert sein. Also das alte endlich mal loswerden und per Paket-Manager deinstallieren. Aber oh Wunder – PECL kann auf einmal das Modul nicht mehr bauen….
Lösung: Es fehlten die notwendigen Header-Dateien zum Paket ImageMagick2 – das Paket dazu heißt praktischerweise ImageMagick2-devel (für development-version) – das bringt die Header mit, im normalen Betrieb werden die nicht benötigt, nur wenn man eben selbst Software unter Verwendung der Library schreiben oder kompilieren möchte.
Damit klappt dann auch endlich die Kompilation des aktuellen Modules. Nochmal den Webserver neu starten und dann funktioniert auch endlich die ursprünglich gewünschte Anzeige der Bilder. 🙂
Mittlerweile ist es mal wieder kurz vor 0:00h geworden, aber die Mühe und der Bastelaufwand waren ja vom Erfolg gekrönt.

Nur noch kurz testen ob auch sonst alles auf dem Server noch richtig läuft – beim Update wurden ja doch auch einige andere Pakete gleich mit aktualisiert. Und – oh Schreck! – der Mailserver mag nicht … genauer gesagt, das Filter-Daemon amavisd kommt nicht mehr richtig in Gang. Amavisd ist die zentrale Schnittstelle zwischen Mailserver und diversen Viren und Spam-Scannern. Ohne die Software, kein e-mail-Vekehr.
Der Neustart von Amavisd bringt die Ursache recht schnell an den Tag: Da sind einige Perl-Module beim Update zu Bruch gegangen, wahrscheinlich, weil sie in verschiedenen Versionen installiert wurden – einmal per CPAN und einmal per Paket-Manager der Distribution (leider sind sich diese beiden Werkzeuge in den seltensten Fällen wirklich grün). Das manuelle Entfernen der Module aus der Installation bringt auch das wieder ins Lot.

Nun stellt sich nur noch der Virenscanner Clam-AV etwas bockig – das Scanner-Daemon will und will nicht starten – Ursache ist diesmal aber nicht die Software sondern leider mal wieder die Beschränkungen der Virtualisierung – zum Starten braucht Clamd recht viel Arbeitsspeicher: ca. 100 Megabyte – bei nur 768 MB virtuellem RAM kann es aufgrund der anderen Prozesse wie MySQL, Apache, Postfix usw. da recht bald recht eng im Speicher werden. Da MySQL sich doch auch recht gut im Speicher breit macht (klar Cache braucht nunmal Platz) ziehe ich dort die Daumenschrauben ein wenig fester an, dann reicht es auch noch für den Start von Clamd – aber gut ist diese Lösung auf Dauer nicht, ich werde wohl oder übel einen anderen Server brauchen, ob es wieder ein virtualisierter wird, weiß ich noch nicht so genau. Auf alle Fälle machen derartige Nachschichten nicht wirklich Spaß

Ein echter Mangel – mehrere Dimensionen in HTML

Die Erde ist eine Scheibe … dieser fehlerhaften Auffassung ist ein Großteil der Menschheit mittlerweile entwachsen. Leider ist die mehrdimensionale Denkweise in Rechnern immer noch ein Problem. Vor allem in einem der modernsten Kommunikationsmittel überhaupt. Das WWW ist bestenfalls noch zweidimensional, aber eigentlich ja noch nicht mal das.

Jetzt werden einige einwenden, dass ein Bildschirm doch schon immerhin mal 2 Dimensionen (Breite und Höhe) mitbringt, und es auch schon Ansätze für dreidimensionale Videos im Netz gibt – alles recht und schön – nur das Datenformat HTML ist leider so flach wie man es sich nur irgend vorstellen kann. Es sollte halt möglichst universell und einfach sein – so war einmal die Philosophie.

Schlecht gefahren ist man damit nicht – vor allem in der Anfangszeit des Netzes war es auch mehr als ausreichend – lästig wird die flache Struktur, wenn man nicht mehr nur die Anzeige einer Seite betrachtet sondern an Web-Applikationen denkt.

Altbekannt ist den meisten Leuten das Dilemma mit den Tabellen – jeweils eine Zeile und dann die Spalten Stück für Stück füllen. Soweit ja kein Problem und mit vergleichsweise wenig Aufwand lässt sich auch aus jeder mehrdimensionalen Struktur (z.B. einer Datenbank) eine „plattgeklopfte“ Variante erzeugen die für die Anzeige taugt.

Umgekehrt wird es aber ungemütlich – ich habe es beruflich immer wieder mit tabellenförmigen Daten zu tun, die auch als solche am leichtesten intuitiv eingegeben werden können. Klassisches Beispiel ist die Relation von Mitarbeitern und deren geleisteten Arbeitsstunden – im allgegenwärtigen Excel würde man kurzerhand hergehen und je nach Gusto in die Zeilen die Personen und in die Spalten die Tage des zu betrachtenden Zeitraums eintragen, wahlweise geht es natürlich auch mit vertauschten Rollen zwischen Zeilen und Spalten. Aber: Jede Zelle in Excel lässt sich wunderbar über Zeile und Spalte adressieren. In HTML gibt es für entsprechende Formularlemente nur einen Referenz-Wert: Das name-Tag – denn nur dieses wird als Schlüssel für die serverseitige Auswertung geliefert, immer ein Satz Tupel. Zwar gibt es gerade in PHP Vereinfachungen auf Basis der Benennung um beispielsweise multiple-Choice etwas leichter zu machen, aber das hilft auch nur bei Ankreuz-Antworten.

Was bleibt ist eine eigene Logik zu erstellen nach der die Felder benannt werden und dann anhand dieser die Felder eindeutig zu kennzeichen – z.B. mittel AxB wobei A und B beliebige ganze Zahlen sind. Das macht auf der Serverseite oder auch im JavaScript natürlich wieder jede Menge Aufwand. Ein anderer Weg ist mir derzeit aber nicht bekannt. Ich frage mich, mit welcher Version von HTTP und/oder HTML endlich vernünftige Möglichkeiten geschaffen werden mehrdimensionale Eingaben standardisiert zu behandeln.

Wie gesagt: So selten sind mehrdimensionale Daten in der realen Welt gar nicht – sie ist ja bekanntlich auch keine Scheibe.

Insolvenz von Schlecker – ein Zeichen der Vernunft?

Jetzt ist es also raus: Schlecker ist pleite. Nachdem ja bereits weitere Schließungen angekündigt waren und die roten Zahlen auch ein offenes Geheimnis, war das eigentlich nur der nächste logische Schritt.

Ich finde es gerade bezeichnend, dass ein Geschäftsmodell, welches uns in der Hochschule als eines der effizientesten angepriesen wurde sich in Wohlgefallen aufgelöst hat. Damals wurde uns wunderbar erklärt warum das Konzept so super erfolgreich sei und die größte Drogeriekette dennoch ein Familienunternehmen ist.

Ehrlich gesagt bin ich ja mal gespannt welcher Dominostein der BWL-Weißheiten demnächst wackelt oder gar umfällt. Ich hätte da so ein paar Ideen
[list]
[*] ständiges Just-in-time für alles und jedes
[*] kaum stimmen die Zahlen nicht muss gespart werden, egal was es kostet
[*] Forschung und Entwicklung darf nichts kosten, Entwicklung über mehrere Jahre ist schlecht
[*] Know How kann man einkaufen und verkaufen wie man es braucht, Ausbildung machen doch andere …
[*] Outsourcing löst alle Probleme
[*] Hauptsache ISO-zertifiziert
[*] Immobilien mieten ist günstiger als sie zu besitzen
[/list]

Die Liste erhebt keinen Anspruch auf Vollständigkeit – mit ein wenig Überlegung ließe sie sich sicherlich noch bedeutend erweitern.
Irgendwie finde ich es erheiternd, wie mehr und mehr an verschiedenen Stellen diverse angeblich so tolle Techniken der BWL hinterfragt und teilweise demontiert werden. Es scheint, als ob einige Dinge der „Altvorderen“ – den Geschäftsleuten vom Anfang des letzten Jahrhunderts doch nicht so verkehrt waren.

Sicherlich hat sich die Welt verändert und gewisse Anpassungen sind ja auch richtig. Dazu gehört auch der ein oder andere Irrweg, keine Frage. Im PC-Bereich wurde ja auch einige Zeit auf objektorientierte Datenbanken gesetzt, weil Objektorientierung ja das „Allheilmittel“ schlechthin ist. Mit Maß und Ziel eingesetzt ist Objektorientierung ein mächtiges Werkzeug, nur für die Datenhaltung in Datenbanken hat es sich als nicht effizient genug erwiesen – da ist man einfach relational besser bedient.

Einige Denkanstöße zu den oben genannten Punkten in dieser Richtung:

[b]Just-in-time[/b] Ein wichtiges Prinzip, das die Herstellung von komplexen Maschinen wie Autos revolutioniert hat – aber ist es deshalb plötzlich falsch einen gewissen Teilepool auch weiter als Lager zur Verfügung zu haben? Sicherlich ein Lager kostet auch Geld, aber es hat auch seine Vorzüge. Manchmal ist etwas weniger Dynamik und geringfügige Flexibilitätseinschränkungen im Endeffekt doch besser: Störungen auf dem Transportweg wirken sich nicht sofort negativ aus – mit intelligenter Technik lässt sich auch etwas längerfristig planen.

[b]Sparen egal was es kostet[/b] Sparsamkeit ist kein Fehler an sich – aber panisch zu reagieren, wenn die Gewinne mal nicht über denen des Vorjahres liegen ist in meinen Augen einer. Es kann nicht immer nur nach oben gehen – die Finanzkrise hat das sehr deutlich gezeigt. Vielleicht muss man für das ein oder andere Projekt einfach einen etwas längeren Atem haben. Es gilt immer den Kontext zu sehen. Am Beispiel Schlecker hat man gesehen wohin übermäßige Sparsamkeit führt – es wollte dort keiner mehr einkaufen. Merke immer den Kontext beachten und sich nicht kirre machen lassen.

[b]Forschung zum Nulltarif[/b] Klar will jeder irgendwann die Früchte der Arbeit ernten insbesondere in der Forschung und Entwicklung. Nur leider werden oftmals Projekte und Versuche sehr frühzeitig eingestellt, nur weil sie nicht profitabel sind. Klar, irgendwann muss man einen Schlussstrich ziehen – nur hat man das in den letzten Jahrzehnte oftmals zu früh getan und sich zu kurzfristig orientiert. Ich halte es durchaus für möglich, dass man schon heute mit Brennstoffzellen und Wasserstofftechnik Autos bauen kann – Projekte dazu gab es mehrere. Leider wurde oftmals gesagt: Rentiert sich nicht, daher machen wir erst mal nicht weiter. Nun haben wir derzeit den Salat: Öl wird langsam aber sicher knapp, Atomkraft wollen wir nicht – aber wir wollen dennoch mobil sein. Jetzt hat man das Nachsehen, weil man die Entwicklung nicht weiter verfolgt hat und derzeit die sich bietende Chance nicht nutzen kann.

[b]Know How Zukauf/Verkauf[/b] Am Arbeitsplatz merke ich es gerade immer wieder: An vielen Stellen fehlen derzeit die „alten Hasen“, Menschen die schon geraume Zeit für ein Unternehmen gearbeitet haben und viele Dinge aus ihrer Erfahrung angehen und lösen können. Lange Zeit hat man darauf gesetzt, dass ja genügend Potential vorhanden ist, in Zeiten hoher Arbeitslosigkeit klappt das auch halbwegs. Aber wehe die Konjunktur zieht ein wenig an, dann ist der Acker recht schnell abgeräumt. Da man ja auch keinen Anlass hatte etwas nachzusähen (im Personalbereich nennt man das auch Ausbildung) muss man jetzt wohl warten bis die neuen Pflanzen endlich Früchte tragen. Leute entlassen und damit Know How abgebaut ist sehr schnell passiert, Know How zu bilden dauert sehr lange. Man denke an Eugen Roth:
„Zu fällen einen schönen Baum, braucht ’s eine halbe Stunde kaum. Zu wachsen, bis man ihn bewundert, braucht er, bedenk‘ es, ein Jahrhundert.“

[b]Outsourcing als Dauerlösung[/b] Man muss nicht alles wissen, man muss nur wissen wo es steht. Dieser Satz ist im Prinzip das Prinzip Outsourcing auf das Gedächtnis angewandt. Sicherlich muss man heute nicht mehr alles selbst produzieren was man braucht. Schon im Mittelalter gab es aber auch spezialisierte Betriebe, die einander zugearbeitet haben oder in etwas, das man heute Projekt nennen würde gemeinsam etwas erreicht haben. Wie bei fast allem muss man hier aber mit Augenmaß arbeiten um Erfolg zu haben. Komplexe Produkte zuzukaufen ist kein Fehler – jedoch einfach alles zuzukaufen, auch das was man eigentlich selbst machen könnte oder auch einmal gemacht hat, da wird es schnell kritisch. Ich würde sicherlich heute nicht anfangen einen Prozessor noch selbst zusammen zu Löten, wenn ich einen benötige. Aber bestimmte innerbetriebliche Arbeiten und Herstellungsprozesse sind Gold wert, wenn man sie direkt im Griff hat – man gewinnt an direktem Einfluss und somit an Flexibilität und Know How – das gibt man sonst einfach aus der Hand. Mitarbeiter vor Ort haben einen entscheidenden Vorteil: Sie kennen die Bedürfnisse in aller Regel deutlich besser als externe Kräfte, die nur gelegentlich da sind. Ergebnis ist oftmals mangelnde Flexibilität und lange Reaktionszeiten weil man vertraglich gebunden ist. Immerhin haben immer mehr Firmen erkannt, das Verkaufen nicht alles ist und auch eine eigene Produktion oder eigene interne Dienstleistungen sinnvoll sind.

[b]ISO-Wahn[/b] Normen und Regelungen vereinfachen die Arbeit verschiedener Organisationen – man denke gerade an Maße für Strecken und Gewichte oder auch Schrauben. Man kann sich darauf verlassen, das man bei Berufung auf die Norm etwas bestellt, das Gegenüber genau weiß was man möchte.
Warum muss man aber jeden Arbeitsprozess normen und exakt festhalten? In meinen Augen ist das eine Folge von mangelndem Zutrauen und Vertrauen in den Mitarbeiter – auch weil diese (siehe oben) immer weniger Erfahrung mitbringen. Jeder ist ersetzbar, wenn es eine idiotensichere Anleitung für eine Tätigkeit gibt. Vielleicht sind die Mitarbeiter aber nicht alle Idioten – ganz im Gegenteil, ich denke jeder anständig ausgebildete Mitarbeiter ist in der Lage seine Arbeit zu überblicken und zu wissen was er tut. Ich wehre mich ausdrücklich nicht dagegen bestimmte Verfahrensweisen zu dokumentieren – damit auch mal ein Anfänger nachschlagen kann oder die Vertretung auch weiß wie etwas zu machen ist. Dokumentierte Prozesse haben aber einen wesentlichen Vorteil: Sie sind flexibler und lassen sich anpassen. Einen genormten und zertifizierten Prozess zu ändern ist verdammt aufwändig, vom Nerv-Faktor für die Mitarbeiter mal ganz abgesehen – die fühlen sich nämlich beim Audit regelmäßig verschaukelt um es mal höflich auszudrücken.

[b]Mieten statt kaufen[/b] Auch ich leihe oder miete mir Dinge, zum Beispiel auch meine Wohnung. Aber ich weiß, dass ich dafür ab einem gewissen Punkt mehr bezahle als die Wohnung eigentlich wert ist, wenn ich sie kaufen würde. Miete ist hilfreich für Dinge die man nicht en Block finanzieren kann oder die man selten braucht. Aber gerade bei Immobilien weiß doch jeder wie praktisch es ist, Eigentum zu besitzen. Die Pleite von Karstadt hat das Prinzip verkaufen und zurückmieten klar und deutlich als wenig sinnvoll abgestempelt. Selbst wenn ich für eine Immobilie oder ein anderes Objekt Instandhaltungsarbeiten durchführen muss – vieles davon kann ich geschickt auch mit eigenen Kräften sehr effizient lösen.

Wie gesagt, ich warte mal ab was da noch kommen mag und freue mich über jeden Schritt in Richtung mehr Verwendung des gesunden Menschenverstandes.

PHP-Freuden: json_encode und Zeichenkodierungen

Mal wieder etwas aus der PC-Ecke bzw. für die Fehlersuche in der Programmierung in PHP und JavaScript.

[b]Hintergrund: [/b]
Es gibt eine Benutzermaske als Webinterface, eine Art Warenkorb. Aus einer Auswahlliste können Elemente für den Warenkorb ausgewählt werden. Per AJAX wird dann die Session auf dem Server aktualisiert und der Warenkorb gespeichert. Soweit nichts Ungewöhnliches. Die notwendigen Beschreibungen mit allen Details werden als Rückgabe-Wert in Form eines HTML-Schnippsels geliefert, das erspart einige Verrenkungen in JavaScript.

[b]Fehlerbeschreibung: [/b]
Das Hinzufügen klappt nicht zuverlässig – genauer gesagt: Es wird ordnungsgemäß etwas hinzugefügt, aber es wird nicht richtig angezeigt.

[b]Analyse:[/b]
Die Datenbankabfragen und das Zusammenstellen der Informationen verläuft in PHP alles richtig. Einzig die Funktion „json_encode()“ will nicht so ganz wie sie soll – anstelle den Schnippsel und andere Zusatzinfos (z.B. die geschätzte Verfügbarkeit/Lieferzeit nach aktuellem Stand) in ein Objekt zu packen, steht dort nur „null“ – also rein gar nichts.

[b]Erklärung/Lösung:[/b]
An wenig prominenter Stelle wird darauf hingewiesen, dass die Funktion zwingen mit UTF-8-konformen Werten gefüttert werden muss. Leider übergeht der Parser ungeeignete Werte einfach und ersetzt sie durch „null“ ohne das dabei der Fehlercode gesetzt wird, daher liefert ein Aufruf der Funktion „json_last_error()“ auch keinerlei Info darüber was schief gegangen ist. Lösung ist recht simpel: „utf8_encode()“ über den Schnippsel jagen und schon funktioniert alles wie erwartet. 😀

Aber bis man auf die Idee überhaupt kommt vergeht ganz ordentlich Zeit – zumal leider fast jede Antwort des Servers leider Beschreibungen mit Umlauten liefert.

Start in die Laufsaison

Neues Jahr, neue Laufrunden. Bereits am 3. Januar ging es schon wieder los bzw. weiter mit dem Lauftraining. Die Kollegen bereiten sich derzeit schon auf den ersten größeren Wettkampf in Kandel vor. Für mich ist es noch etwas hin, der erste Lauf wird eine Kurzstrecke in Groß-Gerau.

Aber zügiges Training kann ja angesichts der angefutterten Weihnachtskalorien nicht schaden. Erstaunlicherweise hat mir das auch gar nichts ausgemacht, trotz des ordentlich gefeierten Jahresstarts.
Jetzt hoffe ich mal, dass ich in der anstehenden Woche Urlaub mich auch aufraffen kann doch etwas zu tun, auch wenn das Wetter bei meiner Freundin in Freiberg wohl nicht gerade dazu einladen wird.

Kurz vor dem Jahreswechsel habe ich mir ja auch endlich Laufziele für 2012 gesetzt.
[list]
[*]Weinstraßen Marathon im April3
[*]MLP Marathon in Mannheim im Mai
[*]Ulmer Laufnacht (100km) im Juni
[*]Altmühlseelauf im Juli (21km)
[*]Stadtlauf Nürnberg im Oktober (21km)
[/list]
sobald die Ausschreibung raus ist werde ich mich auch wieder um einen Startplatz beim LGA-Indoormarathon bemühen, das ist mein traditioneller Schlusspunkt der Saison. Mal sehen welche Läufe sich noch ergeben werden.

Zudem habe ich zum Jahresbeginn noch etwas in Ausrüstung bzw. deren Erhaltung investiert. Die Ausfallerscheinungen meines Pulsmessers waren nicht mehr erträglich. Nach einer Inspektion und gründlicher Reinigung funktioniert er jetzt wieder tadellos. Außerdem habe ich das Armband und den Halteriemen des Brustgurts erneuert – damit sollte ich ohne Probleme durch das Jahr kommen.