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! :-)

Nur ein kurzer Link, hauptsächlich um mich selbst dran zu erinnern: für eine private Bastelei brauchte ich einen bestimmten Font. Ich hatte eine PDF-Datei in der Teile in dieser Schriftart gesetzt waren. Aber wie kann ich daraus einen Font extrahieren?

Falls jemand einen Tipp hat wie ich das selbst elegant hinbekommen hätte nehme ich den gerne an. Auf die Schnelle konnte ich nur ein online-Tool finden: bei pdfconvertonline.com habe ich das PDF hochgeladen und im Austausch ein Zipfile mit allen Bestandteilen bekommen. Unter anderem war in dem Paket direkt eine benutzbare TTF-Datei — Ziel erreicht.

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?

Dritte bis sechste Hand

Dritte bis sechste Hand

Wo eine Lötstation ist muss man meist nicht lange nach einer „dritten Hand“ suchen. Bis letztens war das bei mir das Modell das man auch in dem Wikipedia-Artikel zum Thema findet, das ist vermutlich der Standard — und leider Käse. Glücklich war ich noch nie damit. Und eine kurze Marktforschung zeigt mir leider auch keine günstige Alternative.

Also basteln. Natürlich. :-)

Ich hatte schon eine ganz brauchbare Lupen-Leuchte. Eigentlich sehe ich gut, aber bei SMD kann die tatsächlich helfen. Und durch Zufall — ich war auf der Suche nach was ganz anderem — habe ich Leitungen für Kühlflüssigkeit gefunden. Man suche in der Online-Auktionsplattform seiner Wahl nach „Coolant Pipe“. Dazu noch ein paar „Alligator Clips“ aus der gleichen Quelle. Für sechs Leitungen habe ich keine drei Euro bezahlt, zehn Krokodilklemmen gab es für einen Euro.

Die Leitungen sind wirklich stabil. Man kann sie in jede Form biegen, und die halten tatsächlich besser die Stellung als die Arme an meiner alten dritten Hand.

Also habe ich die orangefarbenen Enden („Düsen“) etwas aufgebohrt und mit Superkleber die Klemmen eingesetzt. Das ganze dann von hinten mit Heißkleber vergossen, hält prima. Zum Zusammenbauen musste ich die Teile etwas heiß machen, sonst hätte ich die Düsen nicht wieder an die Leitung bekommen. Für das andere Ende habe ich passende Löcher in den Sockel der Lampe gebohrt. Da ist nicht genug Material um ein Gewinde zu schneiden, also habe ich auch die Enden verklebt.

Gut beleuchtet und mit Durchblick

Gut beleuchtet und mit Durchblick

Das Ergebnis erfüllt exakt seinen Zweck: vier sehr frei positionierbare Klemmen, direkt unter einer guten Beleuchtung in die für Extremfälle sogar eine Lupe eingebaut ist.

Ich habe auch schon weiterführende Ideen gesehen: kleine Lüfter statt einer Krokodilklemme, um Lötdämpfe wegzublasen, spezielle Halterungen für Tastköpfe und einiges mehr. Aber für mich ist das so erstmal sehr nah an perfekt. Ich bin zufrieden. :-)

Das gute Stück

Das gute Stück

Eigentlich brauche ich kein Fernglas, und ich bin mir ehrlich gesagt nicht mal sicher wie dieses Ding in meinen Besitz gekommen ist. Es handelt sich offenbar um ein Bresser Action 10×50, also zehnfache Vergrößerung bei 50mm Linsendurchmesser.

Das Teil lag jahrelang im Schrank. Erstens weil ich es wie gesagt in der Regel nicht brauche, und zweitens weil es böse verstellt war. Scharf einstellen war nie ein Problem, aber die Bilder beider Seiten waren vertikal verschoben. Das kompensiert das Gehirn nicht weg, also konnte man das Glas nur mit einem Auge benutzen wenn einem nicht schlecht werden sollte.

Heute habe ich mir das Teil doch mal vorgeknöpft. Irgendwie muss es ja einzustellen sein, und wenn nicht muss es eigentlich auch keinen Platz bei mir wegnehmen. Rein äußerlich habe ich aber keine entsprechende Mechanik gesehen. Alle Schrauben dienen entweder zur Verbindung der beiden Hälften, oder zum Verschluss des Gehäuses an der Okular-Seite. Die Objektive kann man auch mit einem beherzten Griff abschrauben.


Wenn man in das Gehäuse sieht kommt man an die Prismen. Und da ist mir eine sehr kleine Madenschraube aufgefallen, die gibt es an jedem Prisma. Von außen werden diese Schrauben durch die Gummi-Armierung verdeckt.

Ich hatte Glück: versuchsweise habe ich die vordere rechte Schraube einfach mal eine Drehung rein geschraubt, einfach um zu sehen was sich ändert. Und das scheint genau richtig gewesen zu sein, die Abbildung war direkt deckungsgleich.

So habe ich dann jetzt tatsächlich ein funktionierendes Fernglas.

Brauchen tu ich es immer noch nicht… :-D

Der erste Versuch

Der erste Versuch

Im letzten Jahr habe ich ja mehrere Projekte mit Hilfe eines Lasercutters gemacht, einige Organizer für Brettspiele. Freundlicherweise konnte ich dafür die Maschine beim Chaostreff Dortmund nutzen, nochmal: Danke!

Ich wusste also dass meine Konstruktionen prinzipiell funktionieren. Um so ärgerlicher dass die Maschine so weit weg steht. Außerdem hätte ich mir schon ein paar Mal gewünscht, mehr ‚iterativ‘ vorzugehen. Einfach mal ausprobieren, und Sachen ändern die nicht funktionieren. Also habe ich mich mal umgesehen…

In den letzten Monaten habe ich eine Menge zum Thema gelesen, also war die Inbetriebnahme nicht allzu kompliziert. Ich hätte damit gerechnet dass es eine Woche dauert bevor ich irgendwas mit dem Ding herstellen kann. Zum Ausprobieren habe ich mir dann erstmal ein Puzzle gemalt. So wie ich mir das ausgedacht hatte sind da die drei wichtigen Techniken zum Einsatz gekommen: die Schrift ist gerastert, die Sterne außen sind als Vektoren graviert, und natürlich wurde das ganze dann ausgeschnitten. Ich habe etwas gekämpft bis ich die Toolchain unter Kontrolle hatte, dann war es aber doch ganz einfach. Und für einen ersten Versuch echt überzeugend, finde ich.

Die Toolchain… ich lasse mich gerne eines besseren belehren, aber soweit ich weiß gibt es keine brauchbare freie Software mit der man so eine Maschine ansteuern kann. Deshalb war ich eigentlich wild entschlossen, mir dafür zumindest eine Windows-VM einzurichten, mit der ich dann die originale Software benutzen kann. Im letzten Moment ist mir dann eingefallen dass ich — ähnlich wie beim Schneidplotter damals — einen Versuch mit Wine starten könnte. Eine schnelle Suche hat mir gezeigt dass das bei einem Roger Clark in Australien auch funktioniert hat. Ich habe das Installationsverzeichnis aus der Windows-VM auf mein Linux kopiert, und: mit kleinen Einschränkungen funktioniert es mit Wine.

Eine Einschränkung ist, dass ich beim Start der Anwendung jedes Mal die Bearbeitungsgröße der Maschine einstellen muss, ansonsten erscheint die Darstellung auf dem Bildschirm merkwürdig verzerrt. Schwerer wiegt, dass ich aus Wine keine USB-Geräte nutzen kann. Brauche ich allerdings auch nicht, da ich die Maschine auch per Netzwerk ansprechen kann. So bin ich sehr zufrieden.

Keltischer Knoten und Nautilusgetriebe

Keltischer Knoten und Nautilusgetriebe

Nach dem ersten eigenen Puzzle habe ich noch ein paar Sachen aus dem Netz ausprobiert: ein Puzzle mit einem keltischen Knoten, kitschige Ü-Ei-Hasen, ein Nautilusgetriebe und ein paar weitere Kleinigkeiten.

Mittlerweile habe ich auch schon einen Spiel-Organizer aus der Maschine gezogen. Einen neuen, den stelle ich als nächstes vor.

Alles in allem hatte ich bis jetzt schon eine Menge Spaß an dem Gerät, und immer mehr Ideen für kleine und große Projekte die ich mit dem Ding umsetzen kann. :-D

Mein Design

Mein Design

Mit einem Lasercutter kann man jede Menge nützliche Sachen herstellen. Vor zwei Jahren habe ich mal ein schickes Raspberry-Gehäuse gefunden, das konnte ich einfach runterladen und mir beim Makerspace meines Vertrauens auslasern lassen. Das Ergebnis ist schick geworden, genau so ist der Raspi jetzt als Medienabspielgerät im Einsatz.

Aber wie komme ich an ein Gehäuse nach Mass, für eigene Projekte?

Das einfachste wird wohl ein kostenloser Online-Generator sein. Davon gibt es einige, mit unterschiedlich vielen aber doch ziemlich überschaubaren Features. Man gibt die gewünschten Masse ein, und bekommt ein PDF oder ein SVG das man direkt an den Cutter verfüttern kann.

Genauso einfach kann man Boxen wohl direkt in Inkscape erstellen. Dazu muss man ein Plugin installieren, das habe ich aber nicht ausprobiert.

Die nächste Stufe dürfte der Boxdesigner sein. Erstmal ist das auch so ein Online-Generator, aber dafür mit einer geradezu überwältigenden Zahl von Funktionen. Nett gemacht, und wer es braucht wird dafür sicher gern die 13 Euro im Jahr bezahlen. Hätte ich auch fast gemacht. Aber nur fast. Was ich gerade bauen will ist etwas zu speziell für den Designer. Mein Plan war, das grundlegende Design da raus zu ziehen, und den Rest in Inkscape

Da das aber auch eine Menge Planung erfordert, und noch dazu sehr fehlerträchtig ist, habe ich mich weiter umgesehen. Und so bin ich zur — für mich — idealen Lösung gekommen:

Schneidvorlage (ein Teil davon)

Schneidvorlage (ein Teil davon)

Mit FreeCAD hatte ich mich vor einiger Zeit schonmal beschäftigt, als ich Bedarf an 3D-Planung hatte. Was ich da nicht wusste ist, dass auch FreeCAD sich durch Plugins erweitern lässt. Und richtig genug: da gibt es eines namens LCInterlocking — auf den zweiten Blick verrät der Name dass man damit Interlocking Designs für den Laser Cutter machen kann. Leider ist die Doku echt dürftig, aber alles was ich wissen musste konnte ich dem Video entnehmen das in der Readme verlinkt ist.

Auch bei dieser Lösung kommt man um Nachbearbeitung in Inkscape nicht herum, aber die komplizierten Sachen sind da schon erledigt.

Man erhält so ein großes SVG mit den Schneidvorlagen. Die Kür besteht jetzt noch darin, die Einzelteile platzsparend aufzuteilen, so dass möglichst wenig Verschnitt anfällt. Das geht manuell, ich habe es einfach mal von SVGnest machen lassen. Dazu habe ich ein Rechteck in das SVG eingefügt das die maximale Arbeitsfläche des Lasers angibt. Das SVG lade ich dann in das Tool, und nach ein paar Klicks sortiert ein Algorithmus alles für minimalen Verschnitt.

Disclaimer: Ob die Vorlage jetzt tatsächlich zum Schneiden taugt muss sich noch rausstellen. Sobald ich das weiß, und sobald ich ein vorzeigbares Ergebnis habe, werde ich auch verraten was ich da gebastelt habe… :-)

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.

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.

Bislang hatte ich echt Glück mit meinen Notebooks. Die Platten sind stabil geblieben, und auch die Software hat mich nicht hängen gelassen. Backups habe ich sträflich vernachlässigt. Ich habe welche gemacht, ja. Aber manuell, und somit nur alle paar Monate mal. Mea Culpa.

OK, jetzt also richtig. Und mit meinem Werkzeugkasten.

Mein Handy sichere ich schon seit ich Android benutze mit rsync. Alle verwertbaren Daten werden so nachts in ein Verzeichnis auf meinem Backup-Server gesynct. Da habe ich also immer eine Kopie des aktuellen Standes. Um auch historische Versionen zu haben sichere ich dieses Verzeichnis auf dem Server nochmal mit dirvish. Das macht sogenannte Hardlink-Backups, so dass ich mehrere historische Stände haben kann in denen identische Dateien nicht mehrfach Plattenplatz brauchen.

So ähnlich machen wir das jetzt auch mit dem Notebook. weiterlesen