Unglaubliches ist mir passiert!

Das ist eine unfassbare Erfahrung!

Man kann gar nichts machen. Gut – ich hätte den Haushalt mal etwas aufräumen, saubermachen, Spül- und Waschmaschine machen können, aber wenn man sich nicht heroisch überwindet, sondern von äußeren Umständen bzw. O2 dazu gezwungen wird? Am Ende ist man noch dankbar dafür!

Zwischendurch hatte ich auch kurz die Idee, jmd. dann für ein ausführliches Telefonat anzuklingeln, aber das Festnetz war ja auch tot.

Dazu kam noch der Umstand, dass ich 2 Tage vorher noch den Grill angeschmissen hatte um die Putenkeulen garen zu lassen, während ich einkaufe. Als ich zurückkam ging das Licht nicht.

„Naja“, dachte ich, „die Energiesparlampe hat jetzt aber auch bestimmt über 10 Jahre durchgehalten!“. Als ich dann mit dem Küchenlicht hell im Flur machen wollte, um die Birne zu wechseln, merkte ich erst: Die Sicherung ist raus – es ist gar nicht die Lampe. Naja, und wenig später die Erkenntnis, dass es wohl der Grill war. Der hat eine große und eine kleine Heizspirale und 4 Stufen: kleine, große oder beide an – oder alles aus. Aber die kleine Schleife geht noch, so wurde die Pute noch fertig.

Aber die Sicherungen sind so alter Keramikpatronen mit Metallhütchen, die abfallen, und dreht man eine neue Sicherung rein – kein neumodischer Kippschalter, wie man sie seit den 70ern hat – brazzeln alle Geräte, weil sie kurz Strom haben, wieder nicht, wieder Strom, wieder nicht.

Ein Gerät, dass die Zustandswechsel gar nicht mochte, war der Router. Zigmal musste ich den aus- und wieder anstellen, Telefonkabel ziehen, wieder rein, bis es nach 30 Minuten endlich wieder klappte, und das Telefon war solange auch tot.

Das war vorletzten Sa., und Montag, gegen 10, als dann Internet wieder weg war, hielt ich das für eine Langzeitfolge und für mein persönliches Problem, bis ich dann doch die Hotline anrief, die mir verriet, in meinem Vorwahlgebiet gäbe es generelle Schwierigkeiten.

Di. gegen 10:00 kam es stotternd wieder, im Nachmittag dann wieder stabil. Ohne Covid kann man in so Fällen in die Bücherei und mit dem Laptop da ins WLAN, oder in ein Cafe mit Internet, aber Quarantäne ohne Ineternet ist schon krass.

Es geht bergauf!

Es geht bergauf und es ist nicht schön. Jetzt hatten wir wochenlang Teillockdown und die Diskussionen gingen gerade los, wer zuerst aufmachen darf, mit Frisören und Schulen in Reihe eins, und dann sowas!

Für Mo., Di., Mi. und Do. zeigt der Wochentagsgraph (basierend auf den Daten von worldometers) hinten einen kleinen Anstieg – allerdings nicht für Fr. (gestern).

Woher sind die Grapen? Nun, mit einem Script selbst generiert. Der schleichende Durchschnitt hat auch seine Berechtigung – zumindest der über 7 Tage, in dem über 3 Tage sehe ich keinen Sinn, und die Haifischzähne im Wochenverlauf scheinen ein globales Phänomen zu sein.

Ich fürchte, dass während die Zahlen maßnahmenbedingt zurückgingen stiegen gleichzeitig die Zahlen durch die Mutanten im Untergrund an, und jetzt haben sich die beiden Trends gekreuzt. Ich bin da aber natürlich Laie, wie viele andere auch.

Das Basteln der ersten Graphen war noch viel Handarbeit, aber dann wurde es von mir teilautomatisiert, so dass das Script die Daten jeden Tag neu runterlädt.

#!/bin/bash
# 
# Coronadaten von worldometers nach Wochentag getrennt anzeigen
#
# @DONE: Lines einfärben nach Wochentag
# @DONE: Automatisieren. 
#
# Lizenz: GPLv3  
#

yvals=($(wget -O - https://www.worldometers.info/coronavirus/country/germany/ 2>/dev/null | sed -ne "s/,/ /g; /name: 'Daily Cases'/,/]/ {s/data: \[null//; s/].*}//p}"))

ny=${#yvals[@]}

for i in $(seq 0 $((ny-1)))
do
	echo -e "$i\t${yvals[$i]}"
done > xy.dat

tag=(dummy Sa So Mo Di Mi Do Fr)
farbe=(dummy black blue olive red dark-grey grey web-green)

max () {
	echo $@ | tr " " "\n" | sort -n | tail -n 1
}

maxy=$(max ${yvals[@]})

zeros=${maxy//[0-9]/0}
top=$((${maxy:0:2}+1))${maxy:3:-0}${zeros:2}
echo top $top

# leeren
echo >  plot7.plt

# In 7-Tagesschritten von Sa. bis Fr. (weil Sa. 1. Meßpunkt ist, Sa:=1) durchlaufen, getrennte Dateien erzeugen
for i in {1..7}; do sed -n "$i~7p" xy.dat > wotag-$i-${tag[$i]}.csv ; done
# Gnuplot-Datei erzeugen
for i in {1..7}; do
	echo "
	set term qt
	set xrange [0:$((ny*105/100))]
	set yrange [0:$top]
	set title \"${tag[$i]}\"
	plot \"wotag-$i-${tag[$i]}.csv\" using 1:2 with linespoint lc \"${farbe[$i]}\"
	set output  \"wotag-$i-${tag[$i]}.png\"
	set term png
	replot"
done >> plot7.plt
gnuplot -p plot7.plt
# eog: Eye-of-Gnome Bildbetrachter.
eog wotag-[1-7]-*.png

(Update 22.2.’21 Das Ausgabeformat habe ich nachträglich auf png geändert (set term png; set output ….png) und den Bildbetrachteraufruf eog am Ende angefügt.)

Anfangs speicherte ich die Seite vom Browser aus im Modus „Seitenquelltext anzeigen“. Er liefert keine fertige Bilddatei aus, sondern die Daten und generiert aus diesen die Grafik on the fly. So kommt man also einfach an die Daten.

Zu Beginn zeigt das Script einen Shebang, der dem Kernel sagt, wie das Programm auszuführen ist. Es folgen Kommentare mit der Gnu-Public-Lizence.

Dann der Code, um das HTML als Datei runterzuladen, dafür nimmt man wget.

yvals=($(wget -O - https://www.worldometers.info/coronavirus/country/germany/ 2>/dev/null | sed -ne "s/,/ /g; /name: 'Daily Cases'/,/]/ {s/data: [null//; s/].*}//p}"))

Mit -O gibt man den Outputort an, meist einen Dateinamen, aber wie viele Shellwerkzeuge, kann auch wget ein isoliertes Minuszeichen übergeben werden, dann wird die Ausgabe auf Stdout, den Bildschirm, ausgegeben.

Aber wget ist geschwätzig und zeigt mit großem Brimborium an, wieviel Prozent schon runtergeladen wurden, Datum, Uhrzeit, Url, IP-Adresse und weiß der Teufel – den Müll kann man mit 2>/dev/null ins Nirwana umleiten.

Der restliche Output wird mit einer Pipe an Sed geleitet, den Stream-Editor, spezialisiert für solche Jobs und mit einer konzentrierten Syntax ausgestattet, um die Ausgabe zu schneiden, umzuformen, zu ergänzen, zu manipulieren.

Mit sed wandel ich alle Kommas in Leerzeichen um. Ich will alles in ein großes Array schreiben, und die Syntax sieht so aus:

yvals=(3 4 2 1 9)

Aber die Quelle liefert

data: [3,4,2,1,9]

Auch interessiert mich nur der Abschnitt „Daily Cases“ und darin nur die Zeile „data“. Die nächste, kryptisch wirkende Zeile, ermittelt die Arraygröße.

Die folgende Forschleife läuft durch alle Werte, und gibt Zeilenweise die Indexnummer und die Anzahl bestätigter Neuinfektionen aus. Die Umlenkung hinter der Schleife lenkt all das in eine Datei xy.dat.

ny=${#yvals[@]}

for i in $(seq 0 $((ny-1)))
do
	echo -e "$i\t${yvals[$i]}"
done > xy.dat

Die Beispieldaten oben sähen damit etwa so aus:

0	3
1	4
2	2
3	1
4	9

Dann folgen zwei Arrays mit Namen für die Wochentage – da die Shell ab 0 zählt, aber ich ab 1, habe ich einen dummy für die 0 eingefügt. Ähnlich für die Farben des Graphen.

tag=(dummy Sa So Mo Di Mi Do Fr)
farbe=(dummy black blue olive red dark-grey grey web-green)

max () {
	echo $@ | tr " " "\n" | sort -n | tail -n 1
}

Dann sehen wir eine max-Funktion. Sie übergibt alle Argumente des Arrays, die mit Leerzeichen getrennt sind, und ersetzt die Leerzeichen mit tr, dem Zeichentranslator, mit Zeilenumbrüchen. Die Zeilen werden mit sort sortiert und tail -n1 nimmt vom Ende eine Zeile, da steht nach Adam Riese das Maximum drin.

Die nächste Zeile ruft die max-Funktion mit unserem Array auf.

maxy=$(max ${yvals[@]})

zeros=${maxy//[0-9]/0}
top=$((${maxy:0:2}+1))${maxy:3:-0}${zeros:2}
echo top $top

Dann folgt eine komplexe Häßlichkeit, die einen Wert wie 31554 nimmt, die 31 vorne abschneidet, zu 32 hochrechnet, und 000 hinten anhängt aber auch mit Werten zwischen 100 und 99999999 zurechtkommen sollte.

Sie dient dazu dem Plotprogramm zu sagen, wie groß der y-Wert werden darf, aber einen aufgerundeten Wert zu verwenden mit etwas Luft nach oben. Da die Werte je nach Wochentag gehörig schwanken führt die automatische Range-auswertung von gnuplot sonst dazu, dass der Achsenmaßstab von Tag zu Tag schwankt.

# leeren
echo >  plot7.plt

Dies löscht die plot7.plt-Datei von gestern oder neulich. Dann schreibe ich, wieder mit sed, das ein Kommando dafür hat, jede 7. Zeile in eine Datei, und das für 7 unterschiedliche Startwerte, sprich Wochentage, in 7 unterschiedliche Zieldateien (.csv).

for i in {1..7}
do
  sed -n "$i~7p" xy.dat > wotag-$i-${tag[$i]}.csv
done

Dann werden je Wochentag ca. 8 Befehle in die Plotdatei geschrieben.

# Gnuplot-Datei erzeugen
for i in {1..7}; do
	echo "
	set term qt
	set xrange [0:$((ny*105/100))]
	set yrange [0:$top]
	set title \"${tag[$i]}\"
	plot \"wotag-$i-${tag[$i]}.csv\" using 1:2 with linespoint lc \"${farbe[$i]}\"
	set output  \"wotag-$i-${tag[$i]}.png\"
	set term png
	replot"
done >> plot7.plt

Das set term qt setzt die Ausgabe auf den Grafikfenstermodus. QT ist eine Firma, QT-Trolltech o.ä., die eine bekannte, plattformübergreifende Grafikbibliothek für C++ geschrieben hat, ähnlich wie GTK (C) oder Swing (Java).

Mit set xrange [von:bis]` legt man die x-Achse fest. Auch hier lasse ich etwas Luft.

Das `set title XY` bringt die Wochentage von oben ins Bild. Man will nicht im Kopf behalten müssen, dass die Datenerfassung an einem Freitag begann – oder war es Samstag?

Dann wird verklausuliert gesagt, dass die Daten von – Beispielsweise wotag-3-Mo.csv zu plotten sind. Dann ist So=2 und Sa=1, also doch Sa! Using 1:2 sind die Spalten der Datei, mehr gibt’s eh nicht, und linespoint verbindet die Datenpunkte, hebt sie aber auch vor. `lc N` setzt die linecolor, falls das wer manipulieren will. Für jeden Tag gebe ich dann einen Dateinamen an, in den das Ergebnis geschieben werden soll. Man könnte auch png, jpg, pdf usw. wählen.

Mit set term png sage ich dem Programm, dass das Format png sein soll; das extrapoliert gnuplot nicht aus dem Namen.

Oben wurde schon mal plot aufgerufen. Hier reicht ein `replot`, wenn man keinen Parameter ändern will. Das eine zeigt am Schirm in einem Fenster an, das andere schreibt in eine Datei.

Die Befehle werden aber nicht unmittelbar ausgeführt, sondern in eine Datei geschrieben und am Ende wird gnuplot aufgerufen, um die Aktionen durchzuführen.

Dabei wird die Bildschirmausgabe aber so schnell durchlaufen, dass man außer dem letzten Bild nichts sieht. Zur Kontrolle, ob nichts schiefläuft, sollte das reichen.

Alle Dateien landen im aktuellen Verzeichnis, also empfiehlt es sich dafür ein neues Verzeichnis anzulegen.

Zusammengefügt habe ich ursprünglich 7 svg-Dateien von Hand.

Das habe nun zu PNG geändert, denn die lassen sich mit einem Betrachter wie eog leicht alle ansehen, oder als Referenzen in ein SVG laden, das sich dann automatisch aktualisiert, wenn die Dateien mit altem Namen und neuen Daten überschrieben werden.

Die CSV-Dateien sind z.Zt. kl. als 500 Bytes, die PNGs < 6kb, je.

Das Datum aus den xValues zu extrahieren ist möglich, aber eine lesbare Ausgabe daraus zu bauen ist mir zu viel Gefummel.

So sieht die fertige Plotdatei aus (hier noch mit SVGs):

	set term qt
	set xrange [0:388]
	set yrange [0:32000]
	set title "Sa"
	plot "wotag-1-Sa.csv" using 1:2 with linespoint lc "black"
	set output  "wotag-1-Sa.svg"
	set term svg
	replot

	set term qt
	set xrange [0:388]
	set yrange [0:32000]
	set title "So"
	plot "wotag-2-So.csv" using 1:2 with linespoint lc "blue"
	set output  "wotag-2-So.svg"
	set term svg
	replot

	set term qt
	set xrange [0:388]
	set yrange [0:32000]
	set title "Mo"
	plot "wotag-3-Mo.csv" using 1:2 with linespoint lc "olive"
	set output  "wotag-3-Mo.svg"
	set term svg
	replot

	set term qt
	set xrange [0:388]
	set yrange [0:32000]
	set title "Di"
	plot "wotag-4-Di.csv" using 1:2 with linespoint lc "red"
	set output  "wotag-4-Di.svg"
	set term svg
	replot

	set term qt
	set xrange [0:388]
	set yrange [0:32000]
	set title "Mi"
	plot "wotag-5-Mi.csv" using 1:2 with linespoint lc "dark-grey"
	set output  "wotag-5-Mi.svg"
	set term svg
	replot

	set term qt
	set xrange [0:388]
	set yrange [0:32000]
	set title "Do"
	plot "wotag-6-Do.csv" using 1:2 with linespoint lc "grey"
	set output  "wotag-6-Do.svg"
	set term svg
	replot

	set term qt
	set xrange [0:388]
	set yrange [0:32000]
	set title "Fr"
	plot "wotag-7-Fr.csv" using 1:2 with linespoint lc "web-green"
	set output  "wotag-7-Fr.svg"
	set term svg
	replot

Diese Ranges könnte man vor den Rest rausziehen, aber das ist mehr Arbeit als Nutzen. Fragen zum Script beantworte ich gerne.

Man benötigt Linux, bei dem die meisten Tools mit an Bord sind (tr, bash, sed, sort, tail) oder leicht nachinstalliert werden können (gnuplot, wget). Unter Windows ist es für jemanden, der nicht schon Erfahrungen mit Scripten hat, mühsam, alles zu installieren und einzurichten, aber möglich. Macs haben ja ein Open-BSD als Basis, inklusive Bash, da sollte es fast so leicht sein wie unter Linux.

Schon 8 Jahre nach der Erstveröffentlichung gibt es eine neue Version von fcd, dem schnellen Verzeichniswechsler für die Shell.

(Anm.: Mithilfe der Kommentare habe ich einen Bug gefunden, und in den Kommentaren wird auch erklärt, wie man ihn beseitigt. Ein Update des Artikels folgt daher in Kürze).

Die neue Version kommt mit Leerzeichen in Verzeichnisnamen zurecht – eine Funktion, die ich nicht direkt selbst brauche, da ich keine Verzeichnisse mit Leerzeichen mache, aber immer mehr Programme legen solche Verzeichnisnamen an (z.B. ‚VirtualBox VMs‘, Zoom: ‚Unknown Organization‘, …) und diese tauchen störend in den Auswahllisten auf.

Der Fix war überraschend einfach, nachdem ich mich erst mal zu der v.a. kosmetisch gedachten Verbesserung aufgerafft hatte.

Weiterlesen

Katzenjammer

Das Bild gab es schon mal, der Text dazu fiel mir erst jüngst ein. Shira ist recht wählerisch, was das Futter betrifft, aber auch ziemlich unberechenbar. Macht man ein neues Döschen auf, ist sie oft noch davon angetan, manchmal verschmäht sie es auch sofort.

Es schien sich abzuzeichnen, dass sie bei Stückchen mit Soße nur die Soße schleckt und man mit Pastete besser fährt, aber bei Pastete lässt sie auch Stückchen zurück und wenn man nur kleine Portionen reicht, dann frisst nach dem Soßenschlecken doch ein paar Stücke.

Nachdem ich herausgefunden habe, dass ihr eigentlich alles schmeckt, außer Wild, Rind und Lamm und die Vorbesitzer gewarnt hatten, Fisch möge sie nicht, blieb nur Geflügel, Huhn, Truthahn und Pute. Das wurde ihr aber wohl doch schnell zu einseitig.

Dann mag sie Futter nicht frisch aus dem Kühlschrank, weil zu kalt, und ohne Kühlschrank trocknet es aus oder wird schlecht, das mag sie auch nicht.

Man könnte vermuten, dass sie was an den Zähnen hat, aber Trockenfutter – da lehnt sie eigentlich alle Sorten ab, bis auf so eine teure Hightechsorte – nimmt sie dann doch, aber nur in kleinen Mengen. Und frisch von mir gegrilltes Geflügel aller Art frisst sie auch, sogar besonders gern, bis vor kurzem. Jetzt ist ihr 2x die Woche Hühnerbein und Putenkeule wohl doch zu einseitig.

Dafür hat sie Matjes in kleinen Dosen auch angenommen und Wolfsbarsch aus der Pfanne. Und jetzt auch Seelachs, aber nur ein halbes 85g-Döschen.

Womöglich nimmt sie auch Wild, Rind und Lamm an, wenn das Wetter und die Marke stimmt, und die Packungsfarbe zum Wochentag passt.

Aber sonst verstehen wir uns sehr gut.

Momamüllgrafik

Im Morgenmagazin, das sich selbst infantilisierend Moma nennt, sind wieder mal Müllgrafiken zu beklagen.

Eine Möglichkeit wäre, dass da niemand ist, der auf Realschulniveau Mathematik könnte, weder bei denen, die die Grafik machen, noch bei sonstigen Teammitgliedern, die mal einen Blick drauf werfen und sich fragen, ob das plausibel ist. 5 Mrd. sind zwar viel, aber an 700 Mrd. gemessen eben doch weniger als 1% und daher in einer Balkengrafik kaum zu sehen, folglich muss die Pi-mal-Daumen-Einschätzung lauten „eigentlich unverändert“.

Mir scheint eher die Einstellung vorzuherrschen, dass, egal was passiert, es wird dramatisiert. Man hilft dem Zuschauer was zu sehen, was nicht da ist.

Hier der zweite Knaller:

Was sie durchaus hinbekommen, das ist eine Quellennennung, ihr fettes Logo und eine wie hinter Milchglas liegende Hintergrundgrafik, die auch pfiffig durch den schraffierten Bereich durchscheint. Nicht unerwähnt sollte bleiben, dass es sich um eine ARD-Woche handelt – man müsste mal schauen, was so das ZDF abliefert.

Die Hauptkommentare habe ich gleich ins Bild gesetzt, damit ich sie so bei Twitter unterbekomme, ohne an 240 Zeichen gebunden zu sein.

Weil’s so schön war noch ein drittes:

Ich selbst habe mich schon beim Brennpunkt beschwert, beim Bericht aus Berlin, bei Quark und Caspers sowie bei Frontal 21.

Der Sinn eines Diagramms ist, das Verhältnis von Zahlen auf den ersten Blick sichtbar zu machen, nicht dass man nachrechnet und überschlägt, ob die Grafik überhaupt stimmen kann. Dann wäre der Zuschauer ohne irreleitende Balken besser dran. Ebensogut kann man einen plumpen Pfeil einblenden, der nach oben oder unten zeigt.

(Wer einen bruchstückhaften Blogbeitrag zu lesen bekam: Ich ärgere mich gerade mit WordPress rum. Mitten im Bearbeiten sagt es, ich sei nicht berechtigt Beiträge zu erstellen oder zu bearbeiten. Dann stellte ich auf HTML-Ansicht um, um möglichst viel in einen lokalen Editor kopieren zu können, öffnete eine Vorschau in einem neuen Tab, da schien der Beitrag da zu sein. Da konnte ich auch einen weiteren Tab öffnen „Bearbeiten“. Da hat dann die Hälfte gefehlt und das Spiel mit fehlender Berechtigung ging von vorne los. Schlagwörter, Kategorien waren auch hin.)