Schlagwort-Archive: Shell

Vor einiger Zeit habe ich ein kleines Skript, journal.sh, vorgestellt, um Messwerte automatisch zu datieren und mit einem Stichwort in einer Datei abzulegen.

Angeregt durch Erzählmirnix, die auch den Blog Fettlogik überwinden betreibt, wollte ich meine Werte auch in grafischer Form aufbereitet sehen, aber nicht mit einer schnuckeligen App, einerseits weil ich gar kein Smartphone warte, andererseits will ich mein Gewicht auch nicht in der Cloud speichern und nach jwd leaken. Solche Apps scheinen oft mitteilungsfreudiger zu sein, als dem Anwender lieb ist.

gewicht

Bevor ich aber zum HowTo komme noch ein Abstecher zu einer anderen Nützlichkeit. Die Shell kennt Funktionen, und solche Funktionen kann man in der Datei ~/.bashrc ablegen. Dann stehen sie in jedem neu geöffneten Shellfenster zur Verfügung. Da ich mein Journal für immer wieder die gleichen Stichworte nutze (kg, ezig, rad) habe ich mir Funktionen geschrieben, die prüfen, ob ich neben dem Stichwort weitere Eingaben übergebe – wenn nicht wird mir nur die Liste bisheriger Werte ausgegeben. Ansonsten wird zuerst der neue Wert eingegeben. Und statt journal.sh 82,7 kg einzugeben gebe ich nur kg 82,7 oder kg ein.

Das ist für faule Menschen sehr praktisch.

kg ()
{
test $# -ge 1 && journal.sh $1 „kg“;
grep “ kg“ ~/journal.txt
}

ezig ()
{
test -n $# && journal.sh „ezig“ $1;
grep „ezig“ ~/journal.txt
}

Für ezig sieht es etwas anders aus, da dort ein Eintrag typischerweise unformatierter ist, etwa ezig 19,80 2 Päckchen neue Coils oder ezig 9,99 1L Basisliquid.

test $# -ge 1 prüft, ob die Zahl der Argumente größer-gleich 1 ist (-ge: greater-equal).

test -n $# prüft, ob die Argumentliste leer ist.

Soweit der Exkurs. kg liefert mir also eine Liste von Gewichtsmessungen, und in eine Grafik verwandelt man sie mit gnuplot. Angezeigt werden kann sie mit display, aber jeder andere Bildbetracher tut es, der das Bildformat beherrscht, etwa eog, inkview usw.

kg | sed ’s/^.. //;s/ kg//;s/,/./;s/ /., /‘ > gewicht.lst
gnuplot gewicht.plt && display gewicht.png

kg liefert also eine Liste an Gewichtsmessungen mit Datum.

So 2016.08.14 75.7 kg
Do 2016.08.04 76,8 kg
Di 2016.07.19 77.8 kg
So 2016.07.03 78.8 kg
So 2016.06.19 79.6 kg
Fr 2016.06.17 80.8 kg

Mit Sed schneide ich vorne den Wochentag weg. Wie man sieht erfasse ich undiszipliniert die Werte mal im deutschen, kontinentalen Format mit Komma, dann wieder im computernahen mit Punkt. Das zweite löscht das “ kg“ weg. Diese Kommas wandelt das dritte Sed-Kommando in Punkte um. Als Feldtrenner erwartet Gnuplot ein Komma, das macht das vierte Kommando und die Ausgabe leite ich in eine Datei gewicht.lst um.

Sed war hier ja schon gelegentlich Thema. Es steht für Strream-EDitor und wird von mir vor allem für solche Serien Suche-und-Ersetze-Kommandos genutzt (substitute). Jedes Semikolon trennt einen Befehl vom nächsten, daher vier Befehle. s/vorher/nachher/; bedeutet also Substituiere vorher durch nachher. Diese Kommandos sind leichter zu schreiben als zu lesen.

Dann kommt gnuplot zum Zuge, ein wahnsinnig mächtiges Werkzeug um ohne Open-Office Grafiken zu erzeugen – im Sinne von mathematischen, wissenschaftlichen Grafiken. Hier das Programm gewicht.plt:

set title „Gewicht nach Zeit“
set xdata time
set style data lines
# set terminal dumb feed 120 45
# set terminal svg
# set output „gewicht.svg“
#
set term png
set output „gewicht.png“
#
set timefmt „%Y.%m.%d.“
set format x „%m\n“
set xlabel „Monat“
set ylabel „Gewicht“
# # set autoscale y
set xrange [„2016.01.01″:“2016.12.31“]
set yrange [60:100]
# set autoscale y
set datafile separator „,“
plot „./gewicht.lst“ using 1:2 t „diaet“ w lines

Viele Kommandos sind sicher selbsterklärend; set title, xlabel, ylab el, xrange, yrange– das versteht sich von selbst aber die Syntax muss man natürlich kennen.

Das auskommentierte autoscale malt was, das Minimum und Maximum als Grenze nimmt. Damit würde aber über die Zeit der Graph mal auf der Gewichts- und immer auf der Zeitachse verzerrt – ich hätte lieber gleichbleibende Proportionen und muss dann an Sylvester das Programm anpassen. Dass auf der X-Achse die Zeit aufgetragen wird muss gesondert gesagt werden: set xdata time, Befehle um eine SVG-Grafik zu machen habe ich auskommentiert. Ebenso die praktische Option eine Asciigrafik im Terminal selbst auszugeben set terminal dumb feed 120 45  – das wären 120 Spalten bei 45 Zeilen und sollte natürlich an das eigene Terminal angepasst sein.

Das ganze einzurichten dauert natürlich, insbesondere wenn man die Programme erst installieren und sich in die Befehle einfuchsen muss, aber hat man es einmal eingerichtet ist es wesentlich komfortabler, als erst OpenOffice zu öffnen und eine CSV-Datei zu importieren, da die Achsen zu beschriften und den Grafiktyp auszuwählen oder den Wertebereich anzupassen. Für jede Messung will man auch nicht OpenOffice öffnen – dafür ist ein Kommando kg 77.7 doch sehr viel komfortabler.

Wer sich wundert, dass es im Graphen nur abwärts geht: Ich messe zwar mehrmals täglich, aber wegen der Wasserschwankung im Körper gibt es ein ständiges Auf-und-Ab. Also protokolliere ich nur den jeweils neuesten Rekord nach unten. Sollte ich wieder schwer zulegen würde ich wohl auch wieder einen höheren Wert protokollieren, aber zur Zeit läuft die Gesundschrumpfung ganz gut.

Sicher könnte man die Grafik noch ausbauen mit Linien für die Schwellwerte des BMI bei Übergewicht für die eigene Körpergröße, Adipositas I und II sowie Untergewicht, aber so bin ich erstmal zufrieden.

Display ist übrigens als Programm im Grafikpaket Image-Magick enthalten.

gnu

Die vorgestellten Skripte dürfen natürlich frei benutzt und nach Lust und Laune verändert werden.

 – Matrixfont, improved – 

(scroll for english Version)

aufklaerung-denken-furcht

Vor einiger Zeit habe ich an einem Font für Inkscape und andere Vektorgrafikprogramme gebastelt, der aus Rechtecken mit kreisrunden Löchern besteht, kein Truetype-Font, sondern ein Konsolenfont und auch aus einem solchen ursprünglich entwickelt, in dem die einzelnen Pixel einer 8×16-Matrix abgescannt wurden. Allerdings war das Zusammensetzen von Wörtern, geschweige Sätzen, aus einzelnen Buchstaben unbequem.  Weiterlesen

Störenfried Grafikterminal

Vielleicht kennt Ihr das Spiel. Man schlägt mit verbundenen Augen ein Lexikon oder Wörterbuch auf, und piekst mit einer Nadel oder einer Bleistiftspitze auf ein Wort. Das wiederholt man und muss dann aus den zufällig gewählten Worten eine Geschichte bilden oder einen Satz. Das kann ein Partyspass sein oder ein Trick, die eigene Kreativität anzuregen.

Statt sich mühsam die Augen zu verbinden und beim Gestocher zwischen den Wörtern mühsam zu entscheiden, welchem Wort die Stiftspitze nun näher war ist ein handlicher Rechner mit Shellscript viel handlicher, vorzugsweise ein Linuxrechner mit lustigen Pinguinaufklebern, OSX soll angeblich auch gehen, notfalls sogar Ballmerware für die es Native Win32 ports of some GNU utilities gratis und quelloffen gibt, ein unschätzbares Sammelsurium nützlicher Programme, von  cat über grep zu sed und wc. Ich habe vor ab und zu das ein oder andere kurz vorzustellen, und zum Experimentieren anzuregen.

Hier unten sehen wir eine Unsitte von Programmierern, nämlich ein ganzes, kleines Programm in eine Zeile zu quetschen:

<cite>

dat=/usr/share/hunspell/de_DE.dic; wcl=$(wc -l $dat); for dummy in foo bar; do z=$((RANDOM*RANDOM%${wcl/ */})); sed -n ${z}p $dat; done

</cite>

Störenfried/EPSTm

Graphikterminal/Sm Weiterlesen