Eigentlich hatte ich gedacht, ich hätte mit dieser kleine Artikelserie abgeschlossen ... Allerdings hat ein Kunde (ein anderer als derjenige, über dessen Systeme ich mich in Teil 1 bis 6 geärgert habe) das Ding auch im Einsatz und ich muss mich irgendwo mit dessen Eigenheiten rumschlagen.
Auf einem solchen System eines Kunden haben wir in der Konzeptionsphase festgelegt, dass wir wget (oder auch curl) brauchen, um per HTTP Request eine Webanwendung anzusprechen; eigentlich ein einfacher Aufruf, der eine festgelegte Aktion starten soll. Der Betrieb wurde damit beauftragt, festzustellen, ob wget/curl vorhanden ist und es gegebenfalls zu installieren.
Etwa 2 Monate später komme ich wieder vorbei und erkundige mich eher Interesse halber, ob jetzt wget installiert sei. Meine Ansprechpartner schütteln den Kopf; der Betrieb weigere sich, wget selbst zu kompilieren (angeblich zu komplexe Abhängigkeiten); und sie hätten keine vorkompilierte Version gefunden. Sämtliches insistieren hätte nichts gebracht. (Ich hätte mich auch noch mit netcat zufrieden gegeben, aber das wäre wohl noch schwieriger zu besorgen gewesen.)
Wir haben uns jetzt entschieden, einen rudimentären HTTP-Client in Java selbst zu schreiben und dann mitzuliefern... Weniger Schmerzen.
Welches Betrübssystem kommt heute eigentlich ohne einen HTTP-Client defaultmässig vorinstalliert?
(Ja, wer diesen Artikeltitel schon bei Kris gelesen hat: eine sehr ähnliche Thematik, nur halt eben nicht mysql)
Ich hatte letzte Woche den Fall, dass ich eventuell vorhandene Zeilen in einer Oracle 10g Datenbank anpasen musste; falls sie nicht vorhanden waren, mussten sie erzeugt werden. Natürlich kann man das ganze mit einem select vorab prüfen, ob das ganze da ist und dann entsprechend mit einem update oder einem insert weiterarbeiten (und nicht vergessen, das ganze in eine Transaktion zu packen). In meinem naiven jugendlichen Datenbank-Leichtsinn dachte ich mir aber, dass dieser Usecase so häufig vorkommt, dass er auch angenehmer mit Oracle-Bordmitteln gelöst werden kann.
Tut er auch. Dank ein bisschen Hilfe der Kollegen kam dann folgendes Statement
merge INTO DCS_SKU sku using ( SELECT 1 FROM dual ) ori
ON (sku.SKU_ID = 'SB1234' )
when matched then
UPDATE SET
sku.VERSION='1',
sku.CREATION_DATE=TO_DATE('09/03/2010 15:59:00', 'DD/MM/YYYY HH24:MI:SS')
when NOT matched then
INSERT(sku.SKU_ID, sku.VERSION,sku.CREATION_DATE)
VALUES('SB1234', '1',TO_DATE('09/03/2010 15:59:00')
raus. Es prüft, ob sku.SKU_ID mit dem Wert "SB1234" bereits vorhanden ist. Wenn ja, wird entsprechend ein Update gefahren, ansonsten ein Insert.
Eigentlich nutzt man das "merge"-Statement zum Zusammenfassen von Tabellen, man kann es aber auch für diesen Zweck etwas zweckentfermden. Im Gegensatz zu Kris kenne ich mich mit Oracle zu wenig aus, um zu sagen, wo die (sicherlich vorhandenen) Fehler liegen und welche side effects man beachten muss. (Für den Usecase, bei dem ich es eingesetzt habe, war Fehlerhandling auch sehr nachrangig.) Vielleicht mag mich ja jemand aufklären
Es demnächst mal wieder die Qual der Wahl an, Vertragsverlängerung beim Mobiltelefon. Mittlerweile dürfte es bereits die 6. Verlängerung sein, jedesmal mit einem neuen Endgerät. Vor 10 Jahren hat man noch die Neuerungen jeder neuen Handy-Generation richtig gemerkt, am ehesten beim Gewicht (mein erstes Handy,ein Nokia 1610, wog noch ca 300 Gramm, dessen Nachfolger in meiner Tasche, ein Siemens S25, nur noch 130 Gramm.
Bei den Tarifen, die von T-Mobile (damals noch Telekom) seitdem angeboten wurden, haben sich leider nicht im gleichen Maß die Preise geändert. Kostete 1997 eine Minute noch 69 Pfennig (in einem Telly Tarif), so verlangt T-Mobile heutzutage in den Relax-Tarifen bei vergleichbaren Grundpreisen immer noch 29 Cent pro Minute. Man könnte doch meinen, daß die Kosten für die Infrastruktur für ein Telefonat wesentlich gesunken sind bei einer gleichzeitigen vergrösserten Nachfrage (der grosse Handy-Boom war ja erst 2000/2001). Nein, ein einfaches Telefonat ist -- wenn man die Minutenpreise anschaut -- immer noch unbezahlbar.
Dabei geht es ja billiger. Selbst T-Mobile bietet prepaid-Tarife an, bei denen keine Grundgebühren anfallen und wo eine Minute in ein beliebiges Netz (Festnetz wie auch Mobilfunknutze) "nur" noch 19 Cent kostet. Von den (Prepaid)-Biliganbietern mit momentan 9 Cent pro Minute in alle Netze mal ganz zu schweigen. Wenn ich daher mal grosszügigerweise die Grundgebühr einzig als Ratenzahlung für mein verbilligtes Endgerät ansehe, verlangt die T-Mobile 300% des Minutenpreises von Congstar (die das gleiche Netz nutzen wie T-Mobile).
Gearscht sind Vertragskunden: Zuerst binden sie sich für 24 Monate (und können von eventuell sinkenden Preisen während der Vertragslaufzeiten nicht profitieren), zum anderen werden Mondpreise verlangt.
Ich überlege mir daher ernsthaft, ob ich nach mehr als 10 Jahren bei dem Rosa Riesen meinen Vertrag kündige; der Billigheimer Congster bietet Rufnummer-Portierung und die Möglichkeit, online die Karte aufzuladen. Das Goodie "keine Mindestvertragslaufdauer" gibt es noch oben drauf.
Offenbar zählt die Bestandskundschaft nicht mehr, höchstens als Melkkuh.
Ein Grund, warum in diesem Blog in der letzten so wenig passiert, sind meine Aktivitäten auf cqdump (vom Namen her angelehnt an das mysqldump von Kris). Dort verbringe ich etwas Zeit, über die Stück Software (Day Communique) zu erzählen, welches ich tagtäglich in unter den Fingern habe. (Ja, das ist das fragliche Stück Software, über welches ich bereits desöfteren geschrieben habe.)
Auf Xing kann man sich bei einer entsprechenden Einstellung der Startseite ständig von Jobangeboten bombardieren lassen. Diese Vorschläge liegen mitunter doch schonmal recht heftig daneben, so meinte Xing auch schonmal, eine Stelle als Fabrikleiter in Spanien könnte für mich interessant sein. Naja.
Heute ist mir aber doch mal wieder eine recht ... amüsante ... Stellenbeschreibung untergekommen. Gesucht wird ein Projektleiter, zwar nicht mein Ding, aber trotzdem mal reinschauen und rausfinden, warum Xing das für mich interessant hält. Blabla, wir sind so toll, unter den Top 100 der deutschen Arbeitgeber, wir tun was für unsere Leute, sülz.
"Wir bieten eine optimale Work-Live-Balance". Klingt ja wunderbar. "Die Motivation der Mitarbeiter wird sowohl durch Fortbildungen wie auch durch gemeinsame Aktivitäten außerhalb der Arbeitszeit gefördert. Ahja, die Wochenende sind auch schon verplant, wie wunderbar. Unten bei den Anforderungen dann der Brüller "uneingeschränkte Mobilität".
Ich weiss jetzt nicht, was die unter "optimaler Work-Live-Balance" verstehen. Offenbar nicht dasselbe wie ich. Mein Ding ist "uneingeschränkte Mobilität" (was ich als 5 Nächte pro Woche im Hotel interpretiere) jedenfalls nicht, dafür bin ich viel zu sehr Familienmensch (Disclaimer: Bei 2 Nächten im Hotel sieht das schon wieder ganz anders aus). Für andere muss das aber "optimal" sein.
Der erste Durchlauf, um meine Mails von meinem lokalen Server über eine DSL-Leitung (1mbit upstream) auf einen Rootserver per imap zu synchronisieren.
++++ Statistics ++++
Time : 295721 sec
Messages transfered : 394783
Messages skipped : 0
Total bytes transfered : 2745423813
Total bytes skipped : 0
Total bytes error : 0
Detected 0 errors
Please, rate imapsync at http://freshmeat.net/projects/imapsync/
295721 Sekunden sind fast dreieinhalb Tage; die Geschwindigkeit ist auch nicht berauschend, in 3 Sekunden 4 Mails synchronisiert; insgesamt gingen etwas mehr 2,5 GByte über die Leitung, auf die Sekunden runtergerechnet ergibt sich eine genutzte Bandbreite von etwa 9 kbyte/s, was einer Auslastung der vorhandenen Bandbreite von unter 10 Prozent entspricht.
An dieser Stelle würde eine Synchronisierung, die mehrere Ordner parallel bearbeitet, sicherlich Wunder bewirken.
heisst man das Phänomen, daß zu gewissen regelmässigen Zeitpunkten Applikationen langsam werden. Zu den Zeitpunkten nämlich, zu dem in allen virtuellen Maschinen auf einem Blech das Systemmanagement synchron anläuft und die ansonsten vorhandenen 40% idle CPU gnadenlos und über mehrere Minuten auf 0 dezimiert.
Es treten immer mal wieder Seltsamkeiten zutage, die einem das Unix für Männer bereithält. Der Gag des Tages: Grössenangaben bei Filesystemen.
Es ist das tägliche Brot eines Admins, sich über den noch freien Festplattenplatz zu informieren. Unter allem, was sich zumindest halbwegs zur Unix-Familie zugehörig fühlt, gibt es dafür den Befehl "df" (wie "disk free"),der einem -- mehr oder weniger nett formatiert -- anzeigt, wieviel Platz denn noch auf einem Filesystem zur Verfügung steht.
Das funktioniert überall, auch das Unix für Männer hält sich eigentlich auch ziemlich brav dran. Es gibt (ja wer hätte das gedacht?) nur eine einzige Ausnahme: Wenn man GPFS als Dateisystem einsetzt und es auf 2 unterschiedliche SAN-Devices installiert hat, quasi als RAID1 auf SAN-Ebene. Dann zeigt einem der "df" den Brutto-Wert an, als das doppelte der nutzbaren Kapazität.
(Da sich das ganze auf alle Grössenangaben auf einem GPFS bezieht, ist eine Datei, die genau 1 Byte enthält, auch 2 Byte groß. Ich wundere mich, warum noch keine Anwendung deswegen übel auf die Nase gefallen ist. )
Neues von der IBM Java Front. Wir haben die JVM inzwischen einigermassen stabil hingekriegt, nachdem wir MAXDATA so gesetzt haben, daß der native Heap für einen normalen Betrieb ausgereicht hat.
Da die Performance des Gesamtsystems aus diversen Gründen suboptimal war, wurde nach einer kurzen Evaluation die JVM einem Upgrade auf 1.5 unterzogen, da ein paar Tests einen Performance-Gewinn in der Grössenordnug von 30-40% versprochen haben (wohl hauptsächlich aufgrund eines verbesserten Garbage Collector). Bisher hat noch niemand nachgewiesen, ob die Performance damit wirklich besser geworden ist, da wir als Hauptursache des Problems -- binnen einer Stunde nach einem Start der Applikation wurde sie erst sehr langsam und stürzte dann mit einem Out-of-Memory ab -- einen etwas unkontrolliert wachsender Cache innerhalb der JVM identifiziert haben, den wir dann auch recht schnell bändigen konnten.
Seitdem die JVMs also wieder etwas länger laufen, gibt es das Phänomen, daß sie völlig unvermittelt stehenbleiben. Kein Eintrag im Log, truss zeigt keine Aktivität, man kann auch keinen Threaddump mehr schreiben. Nachdem wir mit etwas Mühe einen Speicher-Dump erzeugt haben, wurde die Ursache für den Stellstand von der IBM als ein ENOMEM in der libpthread identifziert. Juhu, schon wieder zu wenig native heap. Eine Überwachung mit svmon zeigt auch, daß sich der native heap mit der Zeit immer mehr füllt, selbst als wir noch etwas mehr Platz dafür freigeräumt hatten.
Ob wir damit einen Bug in der JVM gefunden haben oder sich der benötigte native heap schlichtweg drastisch vergrössert, ist noch nicht absehbar.
Meaningful error messages are good. Period. A lot of software badly sucks at this point. They throw "an error happened" or show a strange behaviour, but they don't say, that they cannot open a file because of missing access rights. I stress in application guidelines for java software, that every exception is getting caught and at least logged at an warning loglevel. This mechanism offers the possibility to increase the loglevel from the usual "ERROR" to something like "INFO" if we're debugging an issue.
Reale Crashtests in der Automobilindustrie sind kostspielig und zeitaufwendig. Eigentlich nicht notwendige Tests (etwa weil beim ersten Versuch vergessen wurde, den Kopf des Crashtest-Dummies zu montieren) sollten möglichst vermieden werden.
Braucht man allerdings ein Jahr später die Ergebnisse nochmals, dann wird man den Test nicht nochmals nachvollziehen; stattdessen holt man aus dem Archiv die Ergebnisse des gewünschten Tests. Das erspart einem unnötigen Stress mit dem Chef und beschleunigt die aktuelle Arbeit enorm.
Ähnlich verhält es sich bei Programmen. Aufwendig berechnete (Zwischen-) Ergebnisse werden vorgehalten, damit man bei Bedarf wieder darauf zurückgreifen kann, ohne die komplette Berechnung wiederholen zu müssen. Diese Zwischenspeicher nennt man üblicherweise Cache. (Die Hardware-Leute verwenden auch Caches, aber dort werden sie etwas anders verwendet. Ich beschränke mich hier auf die Software.)
Kunde: "Ich habe euch hier einen Speicherdump eurer Software; ich hab' mal versucht, eine Analyse zu machen, aber mein Rechner (1GB RAM) ist wohl zu klein dafür, hat eine diesbezügliche Fehlermeldung geworfen. Bitte macht ihr das, ist ja euer Job."
Lieferant: "So grosse Rechner haben wir nicht ..."
Es wird da allen Ernstes behauptet, das Datenbanken nur unnötige Komplexität haben und Personal brauchen, ein Filesystem dahingehend pflegeleicht und schnell sei.
When a database gets confused it can lose track of everything. And that's bad. Really bad. So bad they created a term for it. Corrupt. Being corrupt is so bad that every relational database requires an administrator function that acts as the gate keeper to ensure this very bad thing never happens.
Ich glaube, ich muss den Menschen mal einladen und zeigen, welche Probleme man kriegt, wenn man das Rad neu erfinden will. Wir setzen so ein filebasiertes Content Management System ein und haben sehr viel Spaß damit ...