Wer öfter mal was in der Shell macht kennt vermutlich das Kommando find. Damit kann man sehr flexibel Dateien oder Verzeichnisse auf der Festplatte suchen. So findet man zum Beispiel alle Dateien die älter sind als 100 Tage:

Um die Größen aller Dateien zu bekommen kann man find bitten für jede Datei ein du (Disk Usage) auszuführen:

Kann man machen, aber das bedeutet dass find für jede einzelne Datei ein Kommando startet. Jetzt braucht du nicht sehr lange für die Ausführung, aber wenn man stattdessen beispielsweise jeweils ein Perl-Skript starten muss wirkt sich das sehr negativ aus.

Wenn man nur wenige Fundstellen erwartet kann man folgendes machen:

So wird vor der Ausführung von du die Klammer expandiert und durch die Ausgabe von find ersetzt. Das hat aber einen bedeutenden Haken: wenn sehr viele Dateien gefunden werden wird die Kommandozeile zu lang die man durch die Expansion erhält („-bash: /usr/bin/du: Argument list too long“) — Zeilen dürfen nicht beliebig lang werden (man findet die zulässige Länge mit getconf ARG_MAX, muss von der Zahl aber noch die Größe der Umgebungsvariablen abziehen).

Um das zu umgehen ruft man klassisch xargs zur Hilfe. Das sieht dann so aus:

Jetzt findet find alle gesuchten Dateien und gibt deren Namen nullterminiert nach STDOUT. Von da liest xargs ein und baut eine Kommandozeile mit du -b. In diese Zeile werden so viele der eingegebenen Strings reingepackt wie möglich bevor du ausgeführt wird.

Aber find braucht offenbar kein xargs

Man kommt — und das weiss ich erst neuerdings — auf das gleiche Ergebnis wenn man in find statt des Semikolons ein Pluszeichen benutzt:

Keine Ahnung wie das bislang an mir vorübergehen konnte, das macht einiges eleganter.

Wie komme ich jetzt an die Summe der Fundstellen?

Wenn man folgendes schreibt berechnet du für jeden Aufruf eine Summe, mit dem grep kann man sich die ansehen:

Bei vielen Dateien wird du mehrfach aufgerufen, man bekommt also mehrere Summen. In meinem Beispiel finde ich gut 45000 Dateien, find ruft dafür 19 Mal du auf, grep gibt mir also 19 Zeilen mit jeweils einer ziemlich großen Zahl. Die gilt es aufzusummieren, das geht am einfachsten mit awk:

Jetzt bekomme ich nur noch eine sehr große und sehr unleserliche Summe, die gibt mir die Summe der Größe aller gefundenen Dateien. Die kann awk mir in GB umrechnen:

Somit habe ich einen leserlichen Wert, damit kann ich arbeiten.

Wenn es einen einfacheren Weg zum Ziel gibt: ich bin immer für Vorschläge offen! :-)

Es sei nur kurz darauf hingewiesen: in der aktuellen c’t („Retro-Ausgabe 2018“, 27/2018 vom 23.10.) wird ein Umbausatz beschrieben mit dem man einer alten IBM Model M Tastatur Bluetooth beibringen kann. Das hatte ich auch immer mal vor, aber ich glaube das kann ich damit zu den Akten legen.

Links zum Thema findet man bei der Zeitung, der Umbau kostet am Ende rund 120 Euro. Soviel kann man für eine anständige Tastataur ausgeben, finde ich. Ich habe noch ein paar Model M auf Lager die nicht meine Dulcimer-Behandlung erfahren haben, unter anderem eine mit 122 Tasten… mal sehen wie lange die original bleibt… :-D

English English preferred? This way, please.

Heute habe ich einen coolen neuen Trick gelernt, in dem ich das Item Preprocessing benutzen kann das Zabbix seit der Version 3.4 anbietet. Dies ist kein Zabbix-Blog, aber ich betrachte das als so nützlich — und nicht gerade intuitiv — dass ich das mal eben aufschreiben möchte.

Für alle die es nicht kennen: Zabbix ist ein quelloffenes Monitoring System, der Hersteller nennt es nicht ganz zu unrecht „Enterprise Class“. Ich nutze das nicht nur bei der Arbeit sondern auch zu Hause — nicht nur um das Fleisch in meinem Smoker zu monitoren. :-)

Meiner Meinung nach ist Zabbix wirklich stark bei allem was in Zahlen ausgedrückt werden kann. Es kann auch mit textuellen Informationen umgehen, aber nachdem ich damit ein paar kleinere Schwierigkeiten hatte versuche ich das nach Möglichkeit zu vermeiden. Zustände können in Zabbix auch numerisch dargestellt und als Ganzzahl gespeichert werden, mit dem Value Mapping kann man trotzdem gut lesbare Ausgaben erzeugen.

Heute bin ich an ein Problem gekommen das ich mit meinen üblichen Methoden erst nicht umsetzen konnte. Ein Webservice gibt mir den Status einer Applikation, die ist entweder RUNNING, STOPPING oder STOPPED. Es ist nicht schwer das in einem String-Item zu speichern, und einen Trigger anzulegen der reagiert wenn die Applikation STOPPED ist. In diesem speziellen Fall sollte ich aber einen Trigger bauen der meldet wenn der Dienst länger als eine gewisse Zeit im Status STOPPING ist, daran ist zu erkennen dass es ein Problem beim regulären Anhalten der Applikation gibt. Das war nicht trivial, da die Triggerfunktion str("STOPPING",15m) auch schon zuschlägt wenn mindestens einer der Werte in den letzten 15 Minuten „STOPPING“ war.

Item Preprocessing to the rescue!

Drei Schritte

Drei Schritte

Mit Version 3.4 hat ein Feature namens Item Preprocessing in Zabbix Einzug gehalten. Damit kann ein gemessener Wert auf verschiedene Arten weiterbehandelt werden bevor er gesichert wird. Eine der Methoden ist, durch reguläre Ausdrücke eine Art „Suchen und Ersetzen“ vorzunehmen.

Wie sich rausstellt brauchte ich dazu einen halbwegs komplexen regulären Ausdruck, aber am Ende konnte ich die Zustände des Webservices in einfache Ganzzahlen umwandeln. Bei einer Websuche habe ich etwas über „conditional replacement“ gefunden, und mit diesem großartigen Tester für reguläre Ausdrücke konnte ich diese Schönheit bauen:

Damit kann ich den String den ich mittels JSON Path aus der Ausgabe des Webservices ziehe in zwei weiteren Schritten umwandeln:

  • Erst hänge ich eine Art „Wörterbuch“ an meinen Wert: ich ersetze den kompletten Wert (.*) durch sich selbst, gefolgt von den Ersetzungswerten: \1:STOPPED=0:STOPPING=1:RUNNING=2.
  • Dann ersetze ich den regulären Ausdruck (STOPPED|STOPPING|RUNNING)(?=.*:\1=(\d)) durch den Wert der zweiten Capturing Group \2.

Auf die Weise kann ich mein Item als vorzeichenlose Ganzzahl konfigurieren, da hier nur noch die Zahlen 0, 1 oder 2 abgelegt werden müssen. Und ich kann die übliche Trigger-Funktions-Magie anwenden um zu melden wenn der Wert länger als eine gewisse Zeit bei 1 verbleibt. Ein weiterer Bonus: ich kann im Graphen des Items sehen wann der Webservice nicht im Zustand RUNNING gewesen ist, und wie lange das angehalten hat.

Vorschläge?

Ich bin ziemlich angetan davon, Werte auf diese Weise für die Weiterverarbeitung vorzubereiten. Aber ich bin auch an Meinungen interessiert: gibt es bessere Wege mit diesem Problem umzugehen? Irgendwas offensichtliches das ich übersehen habe?

Das war jetzt der fünfte Anruf den ich innerhalb von zwei Wochen vom „Microsoft Technical Support“ bekommen habe. Also: nicht wirklich von Microsoft, das ist mir klar. Ich weiß dass Microsoft sowas nicht tun würde. Sie haben sich so vorgestellt. Auf gebrochenem Englisch.

Beim ersten mal war ich perplex. „We don’t use any Microsoft software in this house, bye.“

Zwei Mal war meine Frau dran, die hat auch direkt aufgelegt. Beim letzten Mal war die Verbindung so schlecht dass ich keine Lust hatte mich darauf zu konzentrieren.

Jetzt gerade hatte ich Zeit, genug schlechte Laune und eine brauchbare Verbindung. Also habe ich mich mit dem Typen unterhalten. Hier mal ein Gedächtnisprotokoll, der Einfachheit halber direkt übersetzt:

„Hier ist der Microsoft Technical Support. Ich rufe an weil wir sehen dass Ihr Computer von Hackern angegriffen wurde. Sitzen Sie an ihrem Computer?“

„Ja.“

„Ich möchte dass Sie alle Fenster verkleinern, so dass Sie den Desktop sehen. Koennen Sie das machen?“

„Ja.“

„Jetzt möchte ich dass Sie sich auf die Tastatur konzentrieren. Unten links sehen Sie eine Taste, beschriftet mit S-T-R-G. Sehen Sie die?“

„Ja.“ (Gelogen — auf meiner US-Tastatur Steht da Ctrl. :-) )

„Daneben sehen Sie eine Taste mit vier Flecken, die stellen ein Windows-Logo dar. Sehen Sie die?“

„Ja.“

„Ich möchte dass Sie die Taste gedrückt halten und mit der anderen Hand auf R drücken.“

„OK.“

„Was ist passiert?“

„Nichts.“ (Auch gelogen, aber es ist sicher nicht das passiert was er erwartet hat.)

„Welche Tasten haben Sie gedrückt?“

„Windows und R, aber bei mir wird da nichts passieren.“ (Naja, ich benutze den Awesome Window Manager, da kann ich auf die Weise tatsächlich Kommandos starten — mache ich aber nicht für jeden. :-P )

„Bitte?“

„Ich benutze kein Windows, ich benutze gar keine Microsoft Software. Ich bin IT Professional, und ich werde mich von Leuten wie Ihnen nicht verarschen lassen. Bitte nehmen Sie meine Telefonnummer aus der Datenbank, ich will nie wieder von Ihnen angerufen werden.“ (Ich hätte fest damit gerechnet dass er auflegen würde. Stattdessen…)

„Sie wollen dass ich Sie aus der Datenbank nehme? Das kann ich machen. Dafür müssen Sie mir 200 Euro überweisen, dann werde ich nie wieder anrufen.“

„…“ (Ich war wirklich perplex ob dieser Dreistigkeit.)

„Sie bezahlen 200 Euro, ansonsten werden wir wieder anrufen.“

„Hören Sie, Sie verschwenden nicht nur meine Zeit sondern auch Ihre eigene. Ich werde nichts bezahlen.“

„Ich habe jede Menge Zeit zu verschwenden, und ich werde Sie wieder anrufen wenn Sie nicht bezahlen.“

„Ich werde nichts bezahlen. Das führt zu nichts.“

„Wir werden weiter anrufen bis Sie bezahlt haben. Und Sie werden darunter leiden.“ (Der genaue Wortlaut war „and you will suffer“ — ich bin noch nie so offen bedroht worden.)

„Lassen Sie mich überlegen was meine Optionen sind. Die Telefonnummer die ich hier sehe zu melden macht keinen Sinn, die wird gefälscht sein (fing mit 0146474 an, letzte Woche hatte ich aber auch schon so einen Anruf mit einer Vorwahl die in NRW sein dürfte). Vielleicht kann ich meinen Telefonprovider anrufen, eventuell können die das tracken.“ (Können sie nicht, fürchte ich. :-( )

„Hören Sie, Sie können sich beschweren bei wem Sie wollen. Telefonprovider, Polizei, Militär. Ist mir egal. Die werden uns nicht kriegen. Wenn Sie nicht bezahlen werden wir weiter anrufen, und Sie werden darunter leiden.“

An der Stelle ging es noch ein bisschen hin und her. Ich habe das Telefon irgendwann laut gestellt und ihn gebeten seine Drohungen für meine Familie zu wiederholen. Hat er auch gemacht. Dann habe ich mich daran erinnert dass er jede Menge Zeit zu verschwenden hat. Bitte, kann er haben. Also habe ich das Telefon zur Seite gelegt und mich mit erfreulicheren Dingen beschäftigt. Nach einer halben Minute hat er aufgelegt.

Angst habe ich nicht vor ihm, aber sowas nervt! Wenngleich ich die Dreistigkeit schon fast ein Bisschen beeindruckend finde. Ich hätte fest damit gerechnet dass er auflegt nachdem ich ihm sagte dass wir kein Windows benutzen.

Mir fällt nicht ein was man dagegen tun kann. Vorschläge?

Achtung, sicher!

Achtung, sicher!

Es ist wirklich kein schöner Anblick, und ich fühle mich jetzt auch etwas schmutzig. Fragt bitte nicht wo ich mich mit einem Windows 2003 Server in Verbindung gesetzt habe.

Fakt ist: ich habe versucht den Server mit Google in Verbindung zu bringen. Und der verwendete Internet Explorer hat mich gewarnt (!) daß ich auf einer sicheren Verbindung unterwegs bin.

Früher war nicht alles besser. Echt nicht. Das gilt für Windows doppelt…

Vorweg: Ich habe das noch nicht selbst ausprobiert, aber ich weiss dass ich mal nach sowas gesucht habe.

Viele Gruppen nutzen zur Findung von Terminen die Webseite doodle.com. Der Dienst funktioniert prima, für einige Anwendungen fände ich es aber wesentlich angebrachter einen solchen Dienst selbst zu hosten. Wenn ich mal wieder Bedarf habe werde ich auf jeden Fall einen Blick auf Dudle werfen. Die Funktionalität scheint in etwa die gleiche zu sein, und man kann es „zu Hause“ installieren. Wer das nicht mag findet bei der TU Dresden eine gehostete Version.

Ich hatte schon öfter was über ungewöhnliche Programmiersprachen geschrieben. Zuletzt über Folders, eine Sprache die ganz ohne Dateien auskommt.

Heute habe ich zwei neue Sprachen kennengelernt. Nein, nicht gelernt. Nur erfahren dass es das gibt. Da wäre zum einen Qalb, eine Sprache in der die Quelltexte (eigentlich auch der Name, aber bei قلب hätte ich noch weniger Ideen zur Aussprache als bei der lateinischen Umschreibung) in arabischer Schrift verfasst werden. Hier gibt es alles was man braucht bei Github. :-D

Die Sprache ist aber schon älter, neuerdings gibt es — ebenfalls bei Github — eine Sprache namens Potaka (wieder eine lateinische Umschreibung, für পতাকা fehlt mir nicht nur eine Idee zur Aussprache sondern sogar die Zeichen im Font). Um die zu beherrschen sollte man bengalische Schrift entziffern können. Wer es versuchen mag: das hier sieht nach einem Spielfeld aus — genau sagen kann ich das aber nicht… ;-)

Sommerlich warm

Sommerlich warm

Der Lüfter an meinem Taschenrechner (Lenovo Thinkpad X201, Baujahr dürfte 2010 sein) hat mich schon länger genervt. Der ist nicht sonderlich laut, lief aber praktisch durchgehend. Gestern habe ich das Ding unbeaufsichtigt liegen lassen weil es Messwerte erfassen sollte. Als ich wiederkam war es aus, nach dem Neustart stand in den Logs… naja, siehe Bild. :-(

Ich bin froh dass die Kernschmelze verhindert wurde.

Mit einer Hand habe ich nachgesehen was ein Ersatz kosten würde, mit der anderen habe ich die Tastatur abgeschraubt. Da findet man den Lüfter direkt vor sich. Auf den ersten Blick sah der ganz OK aus, ich habe ihn trotzdem mit einem Zahnstocher stillgelegt (wichtig, der wirkt sonst wie ein Dynamo und frittiert unter Umständen den Rechner) und dann großzügig Druckluft aus der Dose angewendet.

Unglaublich, wie gut das wirkt, das sollte man vielleicht regelmäßig machen. Beim nächsten Mal traue ich mich vielleicht auch die Wärmeleitpaste auszutauschen. Die Bildschirmauflösung ist nicht ganz zeitgemäß, ansonsten bin ich immer noch rundum zufrieden mit dem Notebook.

Ich sehe mir immer mal wieder gerne esoterische Programmiersprachen an. Lustig, auf was für Ideen Leute kommen — einfach nur weil es geht. :-)

Die meisten Sprachen haben eine vergleichsweise einfache Grammatik (es sei denn sie legen es speziell darauf an eben keine einfache Grammatik zu haben). Bei fast allen werden die Quelltexte in ASCII-Notation verfasst. Nennenswerte Ausnahmen sind Piet (da liegen die Quelltexte als GIF vor) und neuerdings vielleicht noch Emojicode. Aber selbst wenn es kein ASCII ist: es sind Dateien.

Jetzt habe ich von Folders gehört. Bei der Sprache liegen Quelltexte nicht mehr als Dateien vor, sondern als Ordner. Und damit die Ordner nicht so aus der Reihe tanzen haben sie griffige Namen bekommen: so heißt die Entsprechung für if jetzt New Folder, und aus print wird Setup. Der Datentyp für Integers heißt Vacation photos, der für Texte ist Img

Eingängig, oder? Und das beste: Quelltexte haben eine Länge von Null Bytes (nur halt eine komplexe Verzeichnisstruktur). Wer schreibt jetzt einen Flugsimulator? :-D