Traditionell bewege ich mich viel in der Shell, und da habe ich es oft mit verschiedenen Datenformaten zu tun die ich lesen oder schreiben möchte. Lesen ist mittlerweile vergleichsweise einfach: jq für JSON, XMLStarlet für XML.

Wie man sinnvoll XML generiert weiss ich noch nicht, aber vor ein paar Tagen hat Jan-Piet Mens ein Tool veröffentlicht mit dem man sauber JSON generieren kann: jo (hier bei Github).

Ausprobiert habe ich das noch nicht, aber die Beschreibung sieht sehr vielversprechend aus. Gerade in Verbindung mit dem Monitoring-Tool meiner Wahl — Zabbix — hätte ich mit so einem Tool im Werkzeugkasten einiges deutlich eleganter schreiben können…

Eine alte Weisheit besagt folgendes:

Wenn man erstmal einen Hammer in der Hand hat sieht alles aus wie ein Nagel.

Wenn man also halbwegs mit dem gängigen Unix-Werkzeugkasten (grep, cut, sed und awk) umgehen kann ist man geneigt diese Tools immer einzusetzen wenn Informationen aus Dateien zu extrahieren sind. Damit auf strukturierte Daten loszugehen ist allerdings nicht nur fehlerträchtig sondern auch alles andere als elegant.

Vor längerer Zeit habe ich hier mal auf jq hingewiesen. Das ist die Lösung wenn man in seiner Eigenschaft als Shell-Skript Daten aus JSON-Datensätzen braucht, mittlerweile konnte ich da schon einige Male drauf zurück greifen.

Jetzt habe ich was vergleichbares für XML-Daten gesucht, und wie es aussieht ist XMLStarlet das Werkzeug der Wahl (Disclaimer: ich habe nicht lange gesucht, NOCH bin ich für Gegenvorschläge offen ;-) ).

Erste Anwendung ist wieder, einen ungetrübten Blick auf das gewählte Dokument zu werfen. Mein Feed ist ein insofern ein schlechtes Beispiel als dass der Code ziemlich sauber formatiert ist, aber der Trick wird klar (die Sache mit dem Backslash am Zeilenende setze ich mal voraus):

Als nächstes interessieren mich vielleicht die Titel der letzten Artikel. Dazu selektiere ich alles was auf den XPath //rss/channel/item matched, und lasse mir jeweils den Wert von title ausgeben. Gefolgt von einem Zeilenumbruch:

Aber wann habe ich denn meinen letzten Artikel veröffentlicht? Dazu matche ich nur auf das erste Element und lasse mir davon das pubDate geben, zur besseren Lesbarkeit wieder gefolgt von einem Zeilenumbruch:

Abschließend wüsste ich gerne noch worum es in meinem letzten Artikel ging. Auch das können wir formschön aus dem Feed extrahieren, allerdings wird das Kommando natürlich entsprechend unübersichtlicher. Wir matchen wieder auf das erste Item, lassen uns den Titel und einen Zeilenumbruch geben. Dann matchen wir innerhalb des Items (!) auf category. Dem Inhalt dieser Felder stellen wir jeweils einen Spiegelstrich voran, die Zeile beenden wir wieder mit dem Zeilenumbruch. So sieht das Kommando dann fertig aus:

Das Netz hält einige Artikel mit Beispielen parat, aber genau wie dieser Text kratzen die nur an der Oberfläche. XMLStarlet ist sicher ein Spielzeug mit dem man sich bei Gelegenheit mal länger auseinandersetzen sollte. Zumindest macht es den Standard-Werkzeugkasten im Umgang mit XML-Daten absolut obsolet.

Gestern habe ich auf Twitter gelesen dass es im Zabbix-Share ein Modul gibt mit dem man das Monitoring-Tool meiner Wahl — Zabbix — direkt auf einen Arduino zugreifen lassen kann: Zabbuino nennt sich das.

Komischerweise habe ich letzte Woche erst überlegt wieviel Aufwand es wohl sein mag, das Zabbix-Protokoll nachzuimplementieren. Ich bastele zur Zeit wieder mal mit dem WLAN-fähigen Chip ESP8266 herum, den hatte ich hier auch schon erwähnt. Damit lassen sich prima Messwerte einsammeln, und das schreit dann nach Zabbix. Mein erster Ansatz war, Messdaten per HTTP zur Verfügung zu stellen. Die werden dann von einem Skript periodisch abgeholt und per zabbix_send eingespeist. Wesentlich eleganter wäre es natürlich, Zabbix direkt auf den Sensor zugreifen zu lassen…

Es wäre also wirklich mal einen Versuch wert, das Zabbuino-Modul in Verbindung mit einer kleinen ESP8266-Platine zu testen, die kann man auch fuer deutlich unter fünf Euro kaufen. Oder hat das schon jemand ausprobiert?

Da ich das letzte Woche aber noch nicht kannte habe ich schon einen dritten Weg eingeschlagen. Noch viel besser, wie ich finde. Das ist aber eine andere Geschichte, und die soll ein anderes Mal erzählt werden…

image

Rechnung vom 09.09.1994

Noch ein Fundstück vom Aufräumen: eine Rechnung von 1994. Zwischen Abi und Studium habe ich gearbeitet, und so konnte ich mir zu Beginn des Studiums einen neuen Computer leisten. Ein AMD DX2-80 (praktisch ein 486er) mit 4MB RAM, 420MB Platte und VGA-Grafik. Den passenden Bildschirm hatte ich noch von dem 486SX-20 den ich vorher hatte (welcher seinerseits einen XT abgelöst hatte).

Der Bolide konnte nicht nur die allgegenwärtige Kombination aus DOS und Windows 3.11 ausführen, neben einigen muss-ich-nicht-haben-Programmen gehörte auch Corel Draw 4 zum Paket. Damals habe ich da auch echt viel mit gespielt, das war auch ernsthaft kaufentscheidend.

So ausgestattet ist der Kasten dann 1995 mit mir nach Dortmund gezogen, ins Studentenwohnheim.

An der Uni wurde damals objektorientierte Programmierung in der Sprache Beta unterrichtet. Die Übungsaufgaben konnten dann im sogenannten ‚Pizza-Pool‘ erledigt werden, einem Raum voller Sun SPARCstations mit Namen wie Salami, Diavolo oder Speciale. Ging auch nur da, den Beta-Compiler gab es nämlich nur für Solaris und Linux.

Linux?

Kannte ich bis dahin noch nicht. Unix fand ich aufregend (‚gut‘ kann ich nicht behaupten, weil ich die ganze Tragweite da noch nicht überblicken konnte). Und sowas kann ich auch zu Hause benutzen?

Naja, so einfach war es nicht. Ich habe im Allkauf (Real gab es noch nicht), eine Zeitschrift gefunden (würde mich nicht wundern wenn die mir nächste Tage noch in die Hände fällt), darin waren zwei CDs: Slackware. Die Installation war damals noch ein echtes Abenteuer. Ohne eigens compilierten Kernel ging da nicht viel mehr als eine Shell. Ich habe zwei Wochen und viel Hilfe von einem SunOS-erfahrenen Kommilitonen gebraucht um X11 zu starten (die grafische Oberfläche, damals noch mit dem Window-Manager TWM).

Handbuch von SuSE 6.0

Damals war das hilfreich

So habe ich Linux damals schon faszinierend gefunden, und ich hatte auch immer eine Partition auf der Platte. Trotzdem habe ich nicht wirklich ernsthaft was damit gemacht. So richtig ging es dann erst Ende 1998 wieder los, mit einer SuSE-Distribution, 5.2 oder 5.3 müsste das gewesen sein. Da hat es dann auch nicht mehr lange gedauert bis das mit wechselnden Distributionen mein Haupt-Betriebssystem wurde, ich glaube 2000 oder 2001 habe ich mein letztes privates Windows-System ausgeschaltet. Seitdem habe ich an meine Rechner nur noch Linux und — in Spezialfällen — BSD gelassen.

Disclaimer: Ich habe nicht viel Erfahrung am Mac. Wenn ich Quatsch schreibe, bitte berichtigt mich.

Einstellungen für US-PC-Tastatur

Einstellungen für US-PC-Tastatur

Ich versuche jetzt schon seit einer ganzen Weile, mich mit den Eigenarten eines Macbooks zu arrangieren. Einer der größten Störfaktoren dabei war die Tastatur. Nicht nur weil ich sonst an US-Layout gewöhnt bin. Die alten Apple-Tastaturen (nicht die ganz alten, aber wenn ich mein Extended II anschließe muss ich befürchten daß die Putzfrau das entsorgt :-) ) haben ein brauchbares Layout aber nicht die beste Bedienung, bei den neueren hat sich ein Designer offenbar viel Mühe gegeben um die Nachteile von Laptop und Desktop zu kombinieren. Die Reaktion der Tasten ist durchaus OK, aber Form und Layout haben nicht ansatzweise was mit Ergonomie zu tun.

Nun denn: ich habe jetzt eine ordentliche Tastatur angeschlossen. Ohne Ziffernblock, dafür aber mit ordentlicher Mechanik und US-Layout.

Ab Werk kann OS X leidlich damit umgehen. Dass die Alt- und die Kommando-Taste (auch Apfel-, Windows- oder Propeller-Taste) nicht dem Mac entsprechen stört mich nicht. Wohl aber dass ich keine Power-Taste habe. Die braucht man um den Bildschirm zu sperren. Und ich würde manchmal auch gerne weiterhin Umlaute schreiben können. Unter Linux habe ich dafür die Compose-Taste, das ist perfekt. Kann der Mac das auch?

Naja, Lösung für mein Problem — und der Grund für diesen Beitrag — ist vorerst das Tool Karabiner. Das scheint sehr mächtig zu sein, aber ich finde es auch sehr unübersichtlich. Da ich jetzt schon zwei Mal rausgesucht habe wie ich meine Forderungen damit umsetzen kann habe ich die richtigen Einstellungen mal hier als Screenshot hinterlegt. Jetzt ist die Pause-Taste (rechts neben Scroll-Lock) meine Power-Taste, und in Verbindung mit Alt kann ich bei Bedarf Umlaute schreiben.

Fortschritt durch pkill

Fortschritt durch pkill

Letztes Wochenende habe ich wieder mal ein ISO-Image auf eine SD-Karte geschrieben, wie üblich an der Kommandozeile mit dd. Es ging um ein größeres Image, also hatte ich eine Menge Zeit um mich darüber zu ärgern dass ich den Fortschritt nicht sehe.

Heute habe ich einen Tweet gesehen der sagt dass man da in Zukunft eine Option für haben wird. Aber da wurde auch ein Workaround erwähnt den ich noch nicht kannte: mit pkill -USR1 dd kann man dem laufenden Prozess ein freundliches Signal schicken, daraufhin spuckt der seinen aktuellen Fortschritt aus. Wie das aussieht zeigt der Screenshot.

Fortschritt durch Tunnel

Fortschritt durch Tunnel

Eine andere Möglichkeit — optisch schicker, aber man das Tool ist nicht überall installiert — stellt der Pipe Viewer (pv) dar. Da teilt man sein dd auf zwei Kommandos auf und setzt das pv dazwischen.

Technisch ist das vielleicht nicht der optimale Weg, nett ist aber dass man damit universell Pipes überwachen kann, nicht nur für dd. Die Manpage hat ein paar interessante Beispiele.

Eine interessante kleine Aufgabenstellung: ein Skript hat versehentlich tausende von Dateien mit einer verkehrten Extension generiert. Alle Dateien heissen .jpgjpg statt einfach nur .jpg. Gestandene Shell-Benutzer reparieren sowas natürlich mit einem formschönen Einzeiler. Das ist einfach, und eigentlich lohnt es sich nicht da lange drüber nachzudenken. Es sei denn man kommt auf die Idee, das zeitlich zu optimieren…

Im konkreten Fall — es geht um etwa 6000 Dateien — dauert die Optimierung länger als das was an Laufzeitgewinn rauskommt. Wenn wir also schon keine Zeit gewinnen, dann wenigstens Erkenntnis. :-)

Also, mein erster Ansatz ist es intuitiv, alle Dateien zu suchen, für jede Datei den neuen Namen festzulegen und dann umzubenennen. Machen wir eine Trockenübung bei laufender Stopuhr:

Das führt zu einer Laufzeit von erstaunlichen 21,443 Sekunden!

Halbwegs moderne Shells wie die Bash beherrschen Stringmanipulation, dazu muss man nicht zwingend auf sed zurückgreifen. Im TLDP steht wie es geht, so finde ich dort unter ‚Substring Removal‘ den richtigen Ansatz:

Das drückt die Zeit für die gleichen Testdaten schon auf 0,811 Sekunden. Soweit ich weiss haben wir uns damit zwar einen Bashismus eingehandelt, aber das ist heutzutage vielleicht schon egal.

Wenn wir aber schon Kompatibilität aufgeben können wir — schliesslich sind wir in einer hochmodernen Zsh — gleich in die Vollen gehen:

Ich habe noch nie rekursives Globbing (die zsh-lovers-Manpage hat mir verraten wie das geht) benutzt, aber nach nur 0,165 Sekunden war klar: es funktioniert. :-)

Oh, da man hier auch denken könnte dass das Betriebssystem den Dateibaum cached: nein, das ist nicht so. Wenn ich die Einzeiler mehrfach absetze, auch in anderen Reihenfolgen, kommen immer wieder vergleichbare Ergebnisse raus.

Da die effizienteste Methode auch gleichzeitig die am schnellsten zu tippende ist denke ich, dass die — wenn ich auswendig gewusst hätte wie das geht — in jeder Hinsicht die erste Wahl gewesen wäre. Aber ich kenne mich: wenn ich das ein paar Tage nicht benutze muss ich erst wieder recherchieren. Und dann falle ich doch wieder auf das bewährte sed zurück…

Die Sicherheitsabfrage

Die Sicherheitsabfrage

Bei der Arbeit nutze ich Microsoft Outlook Web Access um Mails zu verschicken. Ich weiß: schön ist das nicht (es wird gelegentlich auch liebevoll Outlook Crap Access genannt), aber es gibt schlimmeres. Mittlerweile ist es so brauchbar dass ich keinen Fat Client mehr nutze um Mails zu bearbeiten.

Was mich aber immer etwas genervt hat ist, dass mailto-Links auf Webseiten nicht so richtig funktionieren wollten. Also Links mit denen sich normalerweise direkt ein Mailclient öffnen sollte. Mit externen Anwendungen geht das. Natürlich. Auch mit den voreingestellten Google- und Yahoo-Webanwendungen. Für OWA musste ich eine Weile suchen. Mittlerweile geht es, und vielleicht hilft das ja jemandem:

Man melde sich bei Web Access an. Auf diesem Tab (!) gebe man folgendes in die URL-Zeile ein:

Natürlich mit dem richtigen Servernamen. Achtung bei Copy&Paste: Firefox optimiert — vermutlich aus Sicherheitsgründen — das vorangestellte ‚javascript:‘ weg. Wenn man das nicht manuell nachträgt bekommt man nur eine Fehlermeldung.

Wenn es funktioniert sieht man am oberen Rand des Fensters eine Sicherheitsabfrage. Hier muss man bestätigen dass der Handler tatsächlich eingerichtet werden soll. Fertig. :-)

Was jetzt noch schön wäre: wenn mailto-Links autmatisch in einem neuen Fenster oder in einem neuen Tab geöffnet würden. Aber das steht wohl auf einem anderen Blatt…

Nein, eigentlich ist das kein Spaß. Das ist gruselig (ausprobiert auf einem aktuellen Debian):

Also ist true == false, ja?

Entnommen habe ich das der Diskussion um diesen — nicht minder gruseligen — Bug: md5(‚240610708‘) == md5(‚QNKCDZO‘).

Mehr zu ähnlichen ‚Features‘ hatte ich übrigens letztes Jahr schon: hier und (vor allem) hier.

Früher habe ich wirklich viel mit PHP gemacht. Über die Jahre ist mir die Sprache aber immer suspekter geworden, und ich versuche sie zu vermeiden wo immer es geht. Leider habe ich keine Python-Konkurrenz zu WordPress auf dem Schirm, und selbst für das ‚große‘ CMS sehe ich keine Patentlösung… :-(

Seit einigen Monaten habe ich den Eindruck dass es mir unangenehm sein sollte dass ich mich noch nicht mit Docker beschäftigt habe. Kaum eine IT-Zeitschrift in der das Thema nicht aufgegriffen wird, kaum eine Linux-Distribution die das nicht integriert. Nach meinem bisherigen (oberflächlichen) Verständnis bin ich auch der Ansicht dass ich mich zumindest mal damit beschäftigen muss.

Um so mehr haben mich ein paar Beobachtungen der letzten Tage irritiert.

In der letzten Woche war ich in Berlin, um die Open Source Datacenter Conference und das im Anschluss stattfindende Puppet Camp zu besuchen. In einem Talk („From ConfigManagementSucks to ConfigManagementLove“) hat Kris Buytaert die etwa 150 anwesenden Admins gefragt, wer denn Docker benutzen würde. Das Auditorium war nicht teilnahmslos, aber gemeldet hat sich tatsächlich niemand. Mich hat das echt erstaunt. Am Freitag hatte Nigel Kersten mit der kompletten Besucherschaft des Puppet Camps ein größeres Publikum, trotzdem haben sich auf die gleiche Frage wieder höchstens fünf Besucher geregt. Ich war baff.

Im Gespräch hat Nigel darauf hingewiesen dass es tatsächlich große kulturelle Unterschiede in der IT gibt. Auf eine ähnliche Frage haben beispielsweise nur etwa 10% der Anwesenden angegeben dass sie ihr Business in einer Cloud betreiben. Die Quote läge im Silicon Valley eher bei 90%. So dachte ich mir, dass die Verteilung bei Container-Technologie ähnlich liegen würde.

Bis Heute jemand einen meiner Tweets aus der letzten Woche zitiert hat (sowas ist noch nie passiert, und meine neugierigen Einstellungen haben daraus eine ziemliche Mail-Welle in meinem Postfach gemacht). Als Antwort auf einen Besucher der Interop, der genau die gleiche Beobachtung machen konnte wie ich. Bei einer größeren Veranstaltung, in Las Vegas.

Mit was für Leuten der da zusammen sitzt kann ich natürlich nicht beurteilen. Ich beabsichtige auch weiter, mich mal ernsthaft damit zu beschäftigen. Interessant ist der Ansatz allemal. Aber ich habe nicht mehr den Eindruck dass es mir unangenehm sein muss das noch nicht getan zu haben…