Daten mit Gnuplot darstellen

Auf meinem gestrigen Beitrag, wo ich meine Gewichtsentwicklung seit jetzt fast einem Jahr zeige, gab es einen Kommentar von Mimeiso, der gerne solche Darstellungen für sich machen würde, aber mit Apps zu diesem Zweck unzufrieden ist. Ich benutze keine App dafür. Ich benutze Gnuplot, und zwar auf meinem Rechner.

Gnuplot ist eine Open Source Software, die ich seit meinem Physikstudium in den Neunzigern benutze. Damals hatten wir sie gebraucht, um Daten darzustellen. Sie bietet aber vieles mehr, zum Beispiel um Funktionen an Daten anzupassen. Sie kann sogar Funktionen mit gemeinsamen Parametern an verschiedenen Datensätzen anpassen, was ich mit der kommerziellen Software Origin nie machen konnte — wenigstens nicht mit der alten Lizenz, die wir am Institut während meiner Doktorarbeit zur Verfügung hatten. Ich fand es sehr nützlich, um zum Beispiel bei einem Phasenübergang zweiter Ordnung den Ordnungsparameter anhand von verschiedenen, zeitgleich gemessenen Größen modellieren zu können. Die kritische Temperatur und der kritische Exponent sind für alle Größen gleich, nur der Skalierungsfaktor unterscheidet sich. Aber ich schweife wieder ab.

Das Tolle an Gnuplot ist also, dass es eine kostenlose, leistungsstarke Software für wissenschaftliche Darstellung und Analyse von Daten ist, und es ist für alle Betriebssysteme zu haben. Gut, für aufwendige statistische Analysen ist man mit R besser bedient, aber darum geht es hier nicht, sondern darum: Wie mache ich eine so geile Graphik wie hier unten? Es muss nicht unbedingt mit Excel gehen.

1. Gnuplot installieren

Hier zuerst das Link zum Herunterladen. Auf sourceforge muss man sich gar nicht anmelden, um Software herunterzuladen. Falls eine solche Einladung zum Anmelden angezeigt wird, einfach die paar Sekunden warten, bevor das Herunterladen gestartet wird. Ich denke, die Datei zum Herunterladen wird automatisch für das Betriebssystem angeboten, mit dem man gerade den Browser bedient.

Windows Nutzer laden die .exe Datei herunter, und der Rest sollte sich mit einem Doppelklick drauf von selbst ergeben, wenn man dieser Seite glaubt. Ich bin auf Ubuntu und brauchte nur sudo apt-get install gnuplot im Terminal anzugeben. Mac Nutzer sind selber Schuld und können Googeln, wie man Gnuplot installiert.

2. Daten vorbereiten

Alle meine Daten habe ich mit Hilfe eines Texteditors in einer Datei namens P.dat gespeichert. P, weil Gewicht auf Französisch poids heißt[1]. G.dat erfüllte den Zweck genau so gut. Oder wasauchimmer.txt, es ist egal. Meine Daten habe ich spaltenweise angeordnet, und darauf geachtet, dass jede Zeile den gleichen Format hat. Ein Leerzeichen zwischen den einzelnen Angaben, und für jede Gewichtsangabe zwei Nachkommastellen. So sieht ein Auszug meiner Datei aus:

04-12-2016 67.80 0.2 8 #black
05-12-2016 67.30 0.2 8 #black
06-12-2016 67.60 0.2 8 #black
07-12-2016 67.50 0.2 8 #black
08-12-2016 67.00 0.2 8 #black
12-12-2016 67.50 0.2 8 #black
13-12-2016 66.80 0.2 7 #red
14-12-2016 67.10 0.2 7 #red

Die erste Spalte ist das Datum. Das Format ist nicht wichtig, weil wir danach Gnuplot erklären, wie es zu verstehen ist. Man könnte Punkte oder Schrägstriche statt Bindestrichen benutzen, solange wir es später bei der Darstellung spezifizieren.

Die zweite Spalte ist das Gewicht. Die dritte Spalte enthält die Standardabweichung, oder eher meine Idee davon. Sie gibt an, in wie weit man dem Wert glaubt. Meine Waage zeigt Gewichte mit einer Nachkommastelle, daher könnte man ±0.1 angeben. Ich habe 0.2 gewählt, weil Wassereinlagerungen mehr als 100 g Unterschied von Tag zu Tag verursachen können. Das macht die Länge der Fehlerbalken um die Punkte aus. Wichtig ist hier, dass man den Dezimalpunkt statt einer Komma benutzt. Gnuplot spricht Englisch, das gilt auch für Zahlen.

Was in der letzten Spalte steht, ist nicht notwendig. Es ist die Farbkodierung, die in Gnuplot nicht einfach nachzuvollziehen ist. Als Kommentar habe ich mir als Gedächtnisstütze die Farbe aufgeschrieben — alles, was hinter einer Raute in einer Zeile folgt, wird von Gnuplot nicht interpretiert. Als Frau versteht man intuitiv, was es mit der Farbkodierung an sich hat. Wobei, als Mann könnte man es auch gebrauchen, wenn man zum Beispiel als Farbe kodieren will, ob man an dem Tag davor unterhalb oder oberhalb vom Tagesbedarf gegessen hat.

3. Mit Gnuplot Daten darstellen

Gnuplot starten. Unter Linux-basierten Betriebssystemen braucht man nur im Terminal gnuplot einzutippen. Auf Windows kann man auf dem Desktop eine Verküpfung zur ausführbaren Datei erstellen und auf diese klicken. Der Pfad zur ausführbaren Datei soll etwas wie C:\Program Files (x86)\gnuplot\bin\wgnuplot.exe sein. Dann öffnet sich ein Fenster mit einem Terminal, in dem man Befehle eintippen kann. Gnuplot ist auf Textbefehle basiert. Man schreibt etwas im Prompt, und beim Drücken der Eingabetaste interpretiert Gnuplot den Befehl und führt ihn aus. Oder gibt eine Fehlermeldung aus.

Ich empfehle, zuerst zu dem Verzeichnis zu gehen, wo die Datei P.dat liegt: cd 'C:\Pfad\zur\Datei', mit den einfachen Anführungszeichen, wobei C:\Pfad\zur\Datei natürlich nicht so eingetragen werden sollte, sondern durch den echten Pfad zur Datei ersetzt werden soll, wie zum Beispiel C:\Users\Toto\Documents. Wenn man sich vertippt, sagt Gnuplot Bescheid. Einfach nochmal probieren.

Das Darstellen von Dateien ist meistens ganz simpel: Man gibt plot 'P.dat' ein, und schon bekommt man ein neues Fenster mit einer Graphik. Der Anblick dürfte aber überraschend sein und gar nicht wie meine Graphik aussehen.

Es liegt daran, dass die erste Spalte, die der X-Achse entspricht, ein Datum-Format hat. Daher sollte man Gnuplot vorher darüber informieren: set xdata time. Der Punkt hier ist nur das Ende des Satzes und gehört nicht zum Befehl. Dann wollen wir Gnuplot das Format erklären: set format x "%d-%m-%Y" timedate. Somit weiß Gnuplot: Zuerst kommt der Tag (d für day), dann der Monat (m für month), dann das Jahr (Y für year), alles durch Bindestriche getrennt. Hier mehr zum Thema. Das reicht aber nicht, und man muss noch set timefmt "%d-%m-%Y" eintragen.

Der nächste Versuch mit dem plot Befehl scheitert, weil Gnuplot jetzt eine genauere Spezifizierung braucht, was dargestellt werden soll. Fragt mich nicht warum. Der neue plot Befehl lautet plot 'P.dat' using 1:2, was bedeutet, dass die 1. Spalte auf der X-Achse kommt, und die 2. Spalte auf der Y-Achse. Will man die Fehlerbalken dazu, heißt der Befehl plot 'P.dat' using 1:2:3 with errorbars. Wer wie ich noch möchte, dass die Punkte durch eine Linie verbunden werden, macht stattdessen plot 'P.dat' using 1:2:3 with errorlines. Jetzt fehlt nur noch die Farbkodierung: plot 'P.dat' using 1:2:3:4 with errorlines lc variable. Ich habe noch eine andere Form für die Punkte benutzt, mit gefüllten Kreisen: plot 'P.dat' using 1:2:3:4 with errorlines lc variable pt 7. Das gleiche nochmal ohne die Legende oben rechts: plot 'P.dat' using 1:2:3:4 with errorlines lc variable pt 7 notitle.

Nun sieht es schon mal besser aus, aber die Beschriftung auf der X-Achse ist total durcheinander. Das kann man verbessern, indem man das Datum vertikal und nicht horizontal schreiben lässt. Dafür zuerst den Befehl set xtics border in scale 1,0.5 mirror rotate by -270 autojustify eintippen, dann nochmal den plot Befehl. Die Legende der Y-Achse habe ich mit set ylabel "Körpergewicht [kg]" angegeben, für die X-Achse fand ich es nicht nötig.

4. Befehle zur Darstellung speichern

Puh, das war vielleicht aufwendig. Wenn man endlich soweit gekommen ist, eine zufriedenstellende Graphik zu machen, will man beim nächsten Mal nicht wieder von vorne anfangen. Zum Glück kann man alle bisher eingetragene und noch wirksame Befehle in einer Datei speichern: save 'P.gnu' zum Beispiel. Man braucht in Zukunft nur noch die Daten in P.dat zu aktualisieren, und in Gnuplot tippt man lediglich load 'P.gnu', was die ganzen Befehle wieder ausführt und die Graphik in einem neuen Fenster anzeigt.

Noch eine Anmerkung: Wenn man eine .gnu Datei auf einem Rechner erstellt hat, sollte man nicht glauben, dass man sie auf einem anderen Rechner mit Gnuplot so einfach benutzen kann. Je nach dem, welche Gnuplot-Version installiert ist, werden einige Befehle nicht mehr verstanden, und es bleibt nur noch übrig, wie in Punkten 3. und 4. für den neuen Rechner nochmal anzufangen. Trotzdem liebe ich Gnuplot.

[1] Na gut, Masse (masse auf Französisch) ist ein korrekterer Begriff als Gewicht. Im täglichen Leben außerhalb vom Labor benutzt man das Wort aber kaum, wenn man von der Zahl auf der Waage spricht, oder nur, wenn man sich gerne als Besserwisser mit einem Hang zum Narzissmus angibt.

Abnehmprogramm

Ein kleiner Spaß für Mimeiso, da ich gerade Mittagspause mache. Wie immer beim Programmieren ist das Prüfen der Richtigkeit der Eingaben am Aufwendigsten. Für mich wenigstens.

#!/usr/bin/python
def abnehmen(gewicht, abnahme, zeit):
    """gewicht und abnahme in kg angeben
    zeit in Wochen angeben"""
    abnahme_pro_woche = abnahme/zeit
    for i in range(zeit):
        gewicht -= abnahme_pro_woche
        print "Woche " + str(i) + ": Gewicht " + str(gewicht)

if __name__ == "__main__":
    while True:
        try:
            start_gewicht = float(raw_input("Wieviel wiegst du? "))
            if start_gewicht < 1:
                print "Das Gewicht muss positiv sein"
            else:
                break
        except ValueError:
            print "Das Gewicht muss als Zahl angegeben werden"
    while True:
        try:
            ziel_abnahme = float(raw_input("Wieviele Kilogramme sollen weg? "))
            if ziel_abnahme > start_gewicht:
                print "Von dir muss am Ende noch was uebrig bleiben!"
            else:
                break
        except ValueError:
            print "Die Abnahme muss als Zahl angegeben werden"
    while True:
        try:
            wochen = int(raw_input("Wieviele Wochen soll die Abnahme dauern? "))
            if wochen < 1:
                print "Die Dauer muss positiv sein"
            else:
                break
        except ValueError:
            print "Die Dauer muss als ganze Zahl angegeben werden"
    abnehmen(start_gewicht, ziel_abnahme, wochen)
    print "Gratuliere!"

Et voilà! Vielen Dank an Steve Ferg für diesen alten Artikel über das Eingeben von Code in WordPress! Sowas habe ich ewig gesucht!

UPDATE: Jetzt wird geprüft, dass kein Unsinn wie negatives Gewicht eingegeben wird. Dadurch wird ZeroDivisionError auch vermieden.

Plötzlich läuft Qwt nicht mehr

Schon wieder Stress mit dem Mac. Ich arbeite momentan wieder intensiv an Programm#1, und habe mich bis jetzt auf einer Linux-Maschine in unserem experimentellen Raum darum gekümmert. Da mein Zimmerkollege heute nicht da ist, wollte ich mal in Ruhe im Büro arbeiten. Auf dem iMac, den ich von Uschi geerbt habe. Mac hasse ich immer noch, aber es sollte für meine Zwecke heute reichen.

Also, neueste Dateien rüber kopiert und Programm#1 gestartet. Programm#1 ist mit Python und PyQt4 geschrieben, mit Qwt5 für die Darstellung von Graphen. Inzwischen weiß ich, dass diese Teile am besten mit homebrew zu installieren sind, und bin ohne große Probleme von Maverick zu Yosemite zu El Capitan gewechselt.

Heute beim Starten von Programm#1 klappte es plötzlich nicht mehr. Da hatte ich eine mir noch unbekannte Fehlermeldung beim Importieren von Qwt5, direkt am Anfang vom Programm:

RuntimeError: the sip module implements API v11.0 to v11.3 but the PyQt4.Qwt5.Qwt module requires API v10.1

Blöd geschaut. An meinen Installationen hatte ich ewig nichts mehr geändert, warum sollte es auf einmal nicht funktionieren? Homebrew hatte ich natürlich immer wieder mit brew update && brew upgrade aktualisiert, das war’s sonst. Wenn ich ehrlich bin, weiß ich eigentlich nicht mehr, wann ich zum letzten Mal Programm#1 auf dem iMac erfolgreich benutzt habe.

Erste Google-Ergebnisse haben den Hinweis geliefert, dass ich vielleicht konkurrierende SIP oder Qt oder sonst was Versionen habe. Tatsächlich gab es vom SIP mehrere Versionen, aber eine neue Installation hat das Problem nicht gelöst. Ich habe also in homebrew alles deinstalliert und der Reihe nach reinstalliert:

brew uninstall --force pyqwt
brew uninstall --force pyqt
brew uninstall --force sip
brew install sip
brew unlink sip && brew link sip
brew install pyqt
brew unlink pyqt && brew link pyqt
brew install pyqwt
brew unlink pyqwt && brew link pyqwt

Das war jedenfalls der Plan. Bei PyQt hatte ich schon die Meldung

==> Caveats
Phonon support is broken

Keine Ahnung, was damit gemeint war. Ich habe es ignoriert, da das Verlinken danach geklappt hat. Beim Installieren von Qwt5 ging es nicht mehr so gut. Nach make und install kam die neue Fehlermeldung:

/usr/local/Cellar/sip/4.18.1/include/sip.h:32:10: fatal error: 'Python.h' file not found

Erneut gegoogelt. Bei stackoverflow hatte jemand mal vorgeschlagen, vorher

export C_INCLUDE_PATH=/System/Library/Frameworks/Python.framework/Headers

anzugeben. Ich habe trotzdem die Fehlermeldung bekommen und konnte Qwt5 nicht installieren. Bei mir war Python.h auch unter dem selben Pfad zu finden. Die Fehlermeldung bezog sich auf einen Aufruf von der Datei innerhalb von /usr/local/Cellar/sip/4.18.1/include/sip.h. Ich habe einfach ausprobiert, für alle Dateien unter /System/Library/Frameworks/Python.framework/Headers einen symbolischen Link unter /usr/local/Cellar/sip/4.18.1/include zu setzen:

sudo ln -s /System/Library/Frameworks/Python.framework/Headers/*.h /usr/local/Cellar/sip/4.18.1/include/

Und danach ging’s! brew install pyqwt lief erfolgreich, und Programm#1 kann wieder benutzt werden. Es hat mir aber zwei Stunden gekostet. Und auf dem Laptop, auf dem ebenfalls El Capitan installiert ist, habe ich das Problem gar nicht erst bekommen. Ein Rätsel, warum es aufgetreten ist.

Blöde Tastenkombination im Terminal

Ich arbeite heute von zu Hause aus. Unter Ubuntu ist es einfach, mich auf meinem Rechner bei der Arbeit einzuloggen und dort zu programmieren.

Beim Programmieren benutze ich einen Texteditor. Am liebsten arbeite ich mit Emacs. Ich habe diesen Texteditor im Studium kennen gelernt, es ist schon zwanzig Jahre her. Man gibt emacs im Terminal ein, und prompt erscheint ein Fenster, in dem man Texte bearbeiten kann. Emacs ist in der Lage, die Syntax von vielen Programmiersprachen zu erkennen, und hebt manche Wörter farblich hervor, je nach dem, welchen Zweck sie in der Sprache erfüllen. Es ist für mich praktisch, wenn ich einen Variablennamen benutzen will und nicht weiß, dass es sich dabei um einen schon vergebenen Namen für eine Funktion handelt, zum Beispiel.

In all den Jahren habe ich viele Tastenkombinationen für Emacs verinnerlicht. Es ist so viel schneller, damit Funktionen auszuführen, als wenn ich mit der Maus vom Menü aus irgendeinen Eintrag suchen und klicken soll. Zum Beispiel gibt man Strg+K ein, um den Rest einer Zeile rechts vom Kursor zu löschen, oder Strg+S, um nach einem bestimmten Text zu suchen. Im Gegenteil zu allen anderen gängigen Programmen speichert Strg+S in Emacs nicht den Text, den man gerade auf hat. Zum Speichern muss man Strg+X gefolgt von Strg+S drücken. Mit Strg+X gefolgt von Strg+C verlässt man Emacs. Es klingt erstmals ganz furchtbar, aber man kann sich recht schnell daran gewönnen.

Heute arbeite ich von zu Hause aus. Da benutze ich nicht Emacs zum Programmieren. Das Erstellen einer graphischen Oberfläche dauert ewig, weil ich nicht direkt von meinem Rechner aus im Netzwerk von meinem Institut bin, und alle Änderungen brauchen auch ewig, um angezeigt zu werden. Ich benutze besser vi. Mit vi kann man ohne erkennbare Zeitverzögerung arbeiten. Ich habe lange vi ignoriert, weil es nicht so bequem wie Emacs ist. Gibt man vi gefolgt von einer Textdatei im Terminal ein, öffnet sich die Datei im Texteditor direkt im Terminal selbst. Mit der Maus kann man da gar nichts machen (manchmal geht scrollen, aber es gibt nicht mal einen seitlichen Balken dafür). Man startet vi immer im Kommando-Modus, und muss zuerst i tippen, um zum Editor-Modus zu wechseln. Erst dann kann man den Text editieren. Zum Speichern, Textsuchen usw. muss man zurück zum Kommando-Modus, indem man die ESC Taste drückt. Speichern geht dann mit :q (gefolgt von der Eingabetaste) in der Kommandozeile, speichern und vi verlassen mit :wq (write and quit).

Und so kommt es, wenn man sonst immer mit Emacs arbeitet, dass man in vi steht und als Automatismus zum Speichern Strg+X, Strg+S eintippt. So schafft man es, den Terminal komplett einzufrieren. Alles, was man danach eintippen mag, erscheint nicht mehr, wird aber trotzdem wahrgenommen. Als ich meinen Fehler gemerkt habe, habe ich zuerst ESC gedrückt und :wq eingegeben. Keine Änderung im Terminal. Beim Googeln bin ich darauf gekommen, Strg+Q einzutippen, und der Terminal wurde wieder belebt. Da ich vorher :wq eingetippt hatte, hatte ich schon vi verlassen. Unter Ubuntu auf meinem persönlichen Rechner habe ich vim installiert, eine Variante von vi, die ein bisschen cleverer ist und einen warnt. Beim Eintippen von Strg+X, Strg+C erscheint unten in der Kommandozeile die Nachricht: Type :quit<Enter> to exit Vim. Den Terminal muss man vorher natürlich trotzdem wieder beleben.

Strg+X friert den Terminal nur solange, bis man eine Taste drückt. Strg+S friert den komplett ein. Ich frage mich, warum jemand so ein komisches Verhalten bei diesen Tastenkombinationen im Terminal programmiert hat.

Rscript und Python

Ich hatte am Anfang des Jahres bei einem MOOC über Statistik mit R mitgemacht. Es war aus reinem Interesse. Ich habe an dem Kurs in meiner freien Zeit zu Hause teilgenommen. Ich hatte vorher von R gehört, weil ein Programm, mit dem ich eine Zeit lang arbeiten musste, R benutzte, und es musste auf meinem Rechner installiert werden. Und ich dachte, wenn ich mich weg bewerben will, wäre es nicht verkehrt, Kenntnisse über R zu haben.

Ich fand R ehrlich gesagt nicht so toll. Es ist eine mächtige Programmiersprache, um statistische Rechnungen durchzuführen, keine Frage. Die Benutzung fand ich sehr gewöhnungsbedürftig. Die Namen der Funktionen sind nicht immer nachvollziehbar und ohne erkennbare Systematik vergeben worden. Ich habe den Kurs zwar bestanden, aber immer gedacht, wenn ich R brauche, ist es am einfachsten, zu googeln, als mir zu überlegen, wie etwas gemacht wird.

Gebraucht habe ich R viel schneller als gedacht. Zwei Wochen später habe ich mich im Rahmen meiner Arbeit dafür interessiert, wie man hierarchische Clusteranalysen durchführt. Mir ging es darum, experimentelle Daten von verschiedenen Proben einer Substanz miteinander zu vergleichen. R war perfekt dafür. Mit gerade vier Zeilen Code hatte ich schon das gewünschte Ergebnis in Form eines Dendogrammes, obwohl solche Analysen nicht Teil vom Kurs waren.

Das war erst der Anfang. Danach ging mir durch den Kopf, dass ich eine solche Analyse in meinem Programm#2 gut gebrauchen könnte, als zusätzliche Information, und um Entscheidungen besser treffen zu können. Ich wollte eine große Anzahl von Modellen nach Ähnlichkeit sortieren.

Während des Kurses hatten wir mit einer graphischen Oberfläche gearbeitet. R kann man aber auch aus der Kommandozeile im Terminal benutzen, wie es eigentlich ursprünglich nur ging. Da ich es innerhalb von meinem Programm aufrufen wollte, sollte ich die Befehle der Kommandozeile benutzen. Diese werden aber nur von R interpretiert, wenn man R gestartet hat. Für die, die gnuplot im Terminal schon benutzt haben: So ähnlich ist es mit R auch.

Ich wusste zuerst nicht, wie ich vorgehen sollte, bis ich über Rscript gelesen habe. Es macht genau das, was ich wollte. Wenn man die Befehle für R in einer Datei gespeichert hat, nennen wir diese Befehle.R, kann man sie mit Rscript in R durchführen lassen. So:

Rscript Befehle.R

Von Programm#2 aus, das mit Python geschrieben wurde, sieht dann die Ausführung so aus:

import subprocess
Rins = open('Befehle.R', 'r')
Rout = open('R.log', 'w')
proc = subprocess.Popen("Rscript", stdin=Rins, stdout=Rout, stderr=Rout)
proc.wait()

Es hat nicht geklappt. Eine Fehlermeldung gab es nicht, mein Programm hat getan, als ob alles super gelaufen wäre. Die Befehle wurden richtig in den Befehle.R Dateien geschrieben. Die Dendogramme, die ich in PNG Dateien speichern wollte, wurden nicht erstellt. Die Dateien R.log waren leer, so dass ich nicht mal wusste, wo das Problem lag.

Vom Terminal aus, habe ich Rscript Befehle.R ausgeführt. Das hat funktioniert. Praktikabel ist es aber nicht, weil ich eigentlich Tausenden von solchen Rechnungen machen lassen wollte, für verschiedene Teile von den Modellen, und dafür die Jobs zu einem Pool geschickt hatte, um sie mit unserem Hochleistungsrechner parallel laufen zu lassen. Es musste von meinem Programm aus laufen können.

Im Terminal habe ich Python gestartet und die Befehle eingegeben. Diesmal wurde in die R.log Datei geschrieben. Drin war eine für mich kryptische Fehlermeldung, die so endet, nachdem die Hilfe von Rscript ausgedruckt wurde:

'file' may contain spaces but not shell metacharacters
Expressions (one or more '-e <expr>') may be used instead of 'file'
See also ?Rscript from within R

Nicht nachvollziehbar. Die Eingabedatei Befehle.R hatte doch keine Shell-Metazeichen in ihrem Namen enthalten. Am Ende habe ich den Code so geändert, und das hat geklappt:

import shlex, subprocess
Rcommand = "Rscript Befehle.R"
Rins = open('Befehle.R', 'r')
Rout = open('R.log', 'w')
proc = subprocess.Popen(shlex.split(Rcommand), stdout=Rout, stderr=Rout)
proc.wait()

Warum es bei der ersten Variante nicht funktioniert hat, weiß ich immer noch nicht. Es muss damit zusammen hängen, wie mit stdin die Eingabedatei zum Programm übergeben wird.

Zukunft in Geldwäscherei?

Das wollten mir heute gleich zwei „Arbeitgeber“ anbieten. Ein Traumjob. Stellt euch vor, knapp 4000€ monatlich für 5 Arbeitsstunden pro Woche verdienen, ohne besondere Kenntnisse zu haben… Gibt es wirklich so naive Leute, um drauf rein zu fallen? Ich kann es mir nicht vorstellen, aber lieber zu viel gewarnt. Vorsicht. Geldwäsche ist strafbar.

Merkwürdig fand ich, dass die Emails zu meiner „anonymen“ Adresse geschickt wurden, die ich nie bewusst breit öffentlich in Verbindung mit meiner Identität gebracht habe. Trotzdem bin ich mit Vornamen und Nachnamen adressiert worden. Also, ich habe die Adresse schon benutzt, um auf Ebay und Amazon mit Paypal Transaktionen abzuschließen, das war’s. Mein Paypal-Konto habe ich inzwischen gelöscht, mir war es immer ein bisschen unheimlich. Bei Amazon bin ich noch viel länger nicht mehr Kundin. Mein Konto habe ich ebenfalls löschen lassen. Ich vermute, dass die Daten bei einem Ebay-Händler geklaut wurden.

Die erste Email kam von der „Heinrich GmbH“. Die Email-Adresse, die, wie bei der zweiten Email, eh nicht mit den Absenderadresse übereinstimmt, habe ich ausgeixt.

Sehr geehrte/r <Vorname> <Nachname>,

unsere Gesellschaft ist ein erfolgreiches, europaweit agierendes Unternehmen und wir suchen im Augenblick motivierte und ehrliche Mitarbeiter zur Vervollständigung unseres Teams in der EU.
Der Lohn beträgt im Schnitt 3800 Euro monatlich bei ca 5 Stunden Arbeit pro Woche.
Der Mitarbeiter hat keine eigenen Ausgaben und muss keine technische Kenntnisse haben. Auch Rentner sind für diese Arbeitstätigkeit geeignet
Ihr Tätigkeitsfeld ist die Prozessoptimierung.
Die Arbeit ist europaweit angeordnet und derzeit noch frei.
Sie kriegen die Überweisung im Voraus, dierekt auf Ihr Konto überwiesen, und müssen für unsere Kunden Bitcoins erwerben, wofür Sie eine Provision von 20 Prozent pro Kauf erhalten.
Sie sollten Zielstrebigkeit zu Ihren Stärken zählen und grundlegende Computer Kenntnisse besitzen. Sicherer Umgang mit Internet sowie telefonische Erreichbarkeit sollten für Sie auch kein Problem sein.
Kontaktaufnahme:

Falls Sie interessiert sind, wollen wir Sie kennenlernen, dazu senden Sie uns Ihre Bewerbung an: Xxxxx.Xxxxxxxx@gmx.com

Ihre persönlichen Unterlagen behandeln wir natürlich vertraulich.
Wir freuen uns auf Ihre Bewerbung!

Heinrich GmbH

Die zweite Email, angeblich von einer Firma namens „Lange Vermittlungsagentur“, hat mich noch mehr irritiert, weil sie viele persönliche Informationen enthalten hat. Die allerdings nicht mehr aktuell sind. Die Telefonnummer ist aus meiner Zeit vor Berlin, die schriftliche Adresse ist die meiner vorletzten Wohnung. Dort hatte ich zuletzt etwas auf Ebay bestellt.

Zu Händen von:

<Vorname> <Nachname>
<Alte schriftliche Adresse>

Tel. <Meine uralte und nicht mehr aktuelle Telefonnummer>

Email: <Meine anonyme Email-Adresse>

Wollen Sie 3900 Euro im Monat erhalten?
Unsere Gesellschaft wirbt im Augenblick zuverlässige Mitarbeiter um das Kollektiv in der EU zu vervollständigen

Der Mitarbeiter ist ca. 6 Arbeitsstunden in der Woche beschäftigt und hat keine eigenen Ausgaben.
Auch Berufstätige sind für diese Tätigkeit bestens geeignet, da keine spezielle Kenntnis erwartet wird.

Genauigkeit, Eigenverantwortung und Zielstrebigkeit sollten zu Ihren Fähigkeiten zählen, Umgang mit Email und anfängliche PC Kenntnisse müsste auch keine Schwierigkeiten erstellen. Ständige telefonische Erreichbarkeit ist Pflicht.

Ihre Aufgabe ist die Prozessoptimierung.

Sie bekommen das Geld im Voraus, direkt auf Ihr Konto überwiesen, und müssen für unsere Kunden Bitcoins erwerben, wofür Sie eine Provision von 20 Prozent pro Transaktion erhalten.

Der Auftrag ist Eu-weit angeordnet und derzeit noch frei.

Kontaktaufnahme:

Falls Sie sich angesprochen fühlen, möchten wir Sie kennenlernen, hierfür senden Sie uns Ihre Bewerbung an: xxxxxxxxxxxxx@gmx.com

Ihre persönlichen Daten behandeln wir natürlich vertraulich.

Wir freuen uns auf Ihre Bewerbung!

Lange Vermittlungsagentur

Eine gefälschte O2 Email?

Oder vielleicht nicht?

Lieber O2 Kunde,

uns fehlen wichtige Informationen. Bitte lesen Sie dazu die beigefügte pdf-Datei.

Hinweise zum PDF-Format:
Zum Lesen, Drucken und/oder Speichern von PDF-Dateien benötigen Sie das Programm Acrobat Reader von Adobe. Sollte der Acrobat Reader noch nicht auf Ihrem Computer installiert sein, können Sie ihn hier kostenlos herunterladen: http://www.adobe.de/products/acrobat/readstep2.html

Noch ein Tipp: Wenn Sie die Datei sofort auf Ihrem Rechner abspeichern möchten, verwenden Sie einfach die rechte Maustaste, wählen „Ziel speichern unter“ und anschließend ein Verzeichnis auf Ihrem Rechner, in dem die Datei abgespeichert werden soll.

Freundliche Grüße

Ihr O2 Team

Die Email ist von dsl-kundenservice@cc.o2online.de geschickt worden. Im Empfang steht „o2 DSL Auftrag: Postretoure (Kundennummer  DEXXXXXXXX)“ und die angegebene Kundennummer ist wirklich meine. Die Ansprache „Lieber O2 Kunde“ löst bei mir aber gleich den Spam-Virus-Phishing-Alarm aus. Und dann habe ich gemerkt, dass alle meine Rechungen auch auf dieser Weise geschickt werden. Ich habe mich daran gewöhnt und nur bei dieser unüblichen und unerwarteten Email gemerkt, dass es bei O2 völlig unprofessionell gemacht wird. Diese neue Email und die Rechungsemails haben den gleichen Ursprung: Received: from esifpa01 (unknown [10.242.13.62]) by mailgate03.hansenet.com, so steht’s im Quelltext der Email.

Wahrscheinlich geht’s um meinen DSL Vertrag. Ich habe ihn nicht gekündigt. Tomasz, mein Nachmieter (der auch mein Nachfolger bei der Arbeit ist und mir gegenüber im Büro sitzt) benutzt ihn und überweist mir die Rechnung jeden Monat. Der Vertrag läuft eh nur noch bis Juni. Seit einigen Wochen will O2 mich dazu bringen, meinen vermeintlich alten Router tauschen zu lassen. Was ist, wenn ich es mache, und sie es als Anlass sehen, meinen Vertrag zu verlängern? So läuft’s gut, meint Tomasz, es kann sicherlich bis Juni reichen. Dann schließt er seinen eigenen Vertrag ab.

Sicher ist sicher. Ich werde die PDF Datei im Anhang erst unter Ubuntu öffnen.

Ich hasse Mac

Diesen Satz bekommen meine Kollegen im Büro immer wieder zu hören.

Ich habe für meine Arbeit einen Mac von Uschi zur Verfügung gestellt worden. Ich entwickle ein wissenschaftliches Programm, das Nutzer sich auch zu Hause herunterladen und installieren können, und sollte daher prüfen, dass es auf allen Lunix-basierten Betriebssystemen läuft.

Inzwischen habe ich einen eigenen dienstlichen Mac Notebook. Uschi hatte sich freudestrahlend wie der Weihnachtsmann verhalten, als er mir den Laptop brachte. Ich hatte nur „Ach du Scheiße“ gedacht. Nicht nur, dass das Betriebssystem mir nicht passt. Das Ding ist alt und super schwer. Es herum zu schleppen macht keinen Spaß.

Unsere Beziehung ist seitdem nicht viel besser geworden. Den Laptop benutze ich hauptsächlich für Präsentationen, da ich lieber mit Microsoft Office arbeite als mit LibreOffice & Co (Uschi und Winfried beschweren sich sowieso immer, wenn sie etwas anderes als Office Dateien zugeschickt bekommen). Word und Powerpoint verhalten sich aber nicht gleich auf Mac und unter Windows. Videos in Powerpoint? Die Präsentation kann ich dann nur auf meinem Laptop zeigen. Dateien auf Stick kopieren klappt nicht, das Video startet nicht. Obwohl ich drauf achte, dass das Video nicht verlinkt sondern eingefügt wird. Aber egal. Meistens liegt der Laptop auf meinem Schreibtisch ausgeschaltet, und ich arbeite auf meiner Maschine mit Scientific Linux.

Es fing schon damit an, dass man mit dem Mac nach unten scrollen muss, um nach oben in einem Fenster zu navigieren, und umgekehrt. Oder in einem Bild zum rein- und raus-zommen. Welcher kranker Geist denkt sich denn so was aus? Die Maus hat nur einen Knopf, und man muss die ctrl-Taste beim klicken halten, um einen Rechtsklick durchführen zu können. Apropos Bild, ich muss immer wieder googlen, um herauszufinden, mit welcher komplizierten Tasten-Kombination man ein Screenshot auf dem Mac macht. Über Bildbearbeitung denke ich lieber nicht nach, obwohl ich GIMP installiert habe. Und alle wichtigen Tasten zum Programmieren sind auf der Tastatur nicht zu finden. Man muss sich alle diese alt+Zahl Kombinationen merken, um geschleiften oder eckigen Klammern einzutippen: alt+5 [, alt+6 ], alt+7 |, alt+8 {, alt+9 }, alt+n ~. Steht nicht auf den Tasten. Immer wieder durchprobieren, bis ich das gewünschte Ergebnis bekomme. Am liebsten würde ich das Ding aus dem Fenster schmeißen.

Ich bearbeite gerade eine Präsentation für nächste Woche. Ich wollte eine Folie mit speziellen Bildern machen. Dafür brauchte ich ein Programm, das auf meinem Mac noch nicht installiert ist. Heruntergeladen, unter /Applications/ verschoben. Beim Ausführen gemeckert: Irgendeine X11 Library konnte nicht gefunden werden. Unter /usr/ geschaut: Es gibt ein X11R6 Verzeichnis, mit allen benötigten Dateien, aber kein X11. Symbolischen Link kreiert: sudo ln -s /usr/X11R6 /usr/X11, dann lief es. Meine Screenshots habe ich noch nicht machen können. Kurze Zeit später kam die Meldung, dass es eine neuere X11 Version gibt. Ok, aktualisieren. Gewartet. Und gewartet. Der Laptop machte nichts, ich konnte den Lüfter gar nicht hören, der sich nochmalerweise bei Installationen hörbar macht. Nach einiger Zeit habe ich Fenster minimiert und siehe da, es gab ein Fenster für die Installation von X11, das im Hintergrund erschienen war. So was von blöd. Jetzt läuft das Programm. Die Funktion, die ich brauche und mit Rechtsklick aktiviere, nicht. Nicht mit ctrl+Klick. Mit dem Doppel-Finger-Klick schon.

Außerdem sind Mac-Teile überteuert. Ich habe vor meiner letzten Dienstreise den Ladekabel im Büro liegen gelassen. Am Samstag vor meinem Flug war Martin in der Stadt zum Einkaufen unterwegs und ich habe ihn gefragt, mir ein neuen Kabel zu besorgen. Sonst wäre ich mit der Bahn zwei Stunden hin und zurück unterwegs gewesen. Er rief mich später an und meinte, 85€ für so ein Ladegerät. Ich habe ihm vorgeschlagen, wo sich die Verkäufer den Kabel stecken könnten und habe den vom Büro geholt.

Uschi hat uns jetzt schon verlassen. Ich habe ihn vor seinem letzten Tag bei uns hoffnungsvoll gefragt, ob er das Laptop wieder haben möchte. Er hat mich misvertanden und gesagt, klar, ich könnte den tollen iMac aus seinem Büro bekommen. Mist. Auf meinem Schreibtisch ist sowieso kein Platz mehr. Ich habe schon vier Bildschirme drauf.

Ein einfacher Taschenrechner

Ich habe vor einigen Wochen an einer Schulung zum Thema „Software-Entwicklung für Wissenschaftler“ in meinem Fach teilgenommen. Die Idee kam nicht von mir sondern von Winfried. Er hatte die Ankündigung der Veranstaltung gesehen und meinte, ich sollte mich sofort einschreiben und Programm #1 vorstellen. Seit einiger Zeit ist er der Meinung, ich sollte aktiv Werbung machen und an Workshops teilnehmen. Eine gute Idee, aber wie es bei Winfried häufig der Fall ist, hat er sich bei dieser Schulung nur einige Stichwörter gemerkt und nicht wirklich dafür interessiert, worum es eigentlich ging.

Ich habe mich laut seiner Anweisung angemeldet und angekündigt, dass ich gerne ein Tutorial über Programm #1 anbieten würde. Die Antwort war „gerne, aber es geht vor allem darum, über Software-Entwicklung zu erzählen, nicht um einzelne Programme vorzustellen“. Tja. Dann zu sagen, „ach nee, mache ich doch nicht“ wäre nicht gut angekommen. Eigentlich habe ich Physik studiert. Programmieren war im Studium Nebensache, und immer für bestimmte Projekte benutzt (Monte-Carlo-Simulation eines Spin-Systemes, zum Beispiel). Ich dachte eher, ich habe mehr zu lernen, als ich lehren kann. Aber gut. Ich sollte über etwas erzählen, das ich gar nicht wusste, bevor ich mit meinem Projekt angefangen habe. Die Auswahl war groß, da ich Python erst kennen gelernt habe, als ich die Stelle angenommen habe.

Ich habe mich für den Entwurf von graphischen Nutzeroberflächen mit Python und Qt4 entschieden, am Beispiel von Programm #1. So etwas habe ich noch nie vorgetragen. Es hat mir viel Stress vorbereitet, und viele Stunden zu Hause gekostet, um Videos auf YouTube darüber zu sehen und selber endlich mal zu begreifen, wie PyQt4 funktioniert. Ich habe bis jetzt im Programm immer Änderungen gemacht, und da mein Vorgänger die ganze Arbeit mit der Oberfläche geleistet hatte, habe ich nicht viel Gelegenheit gehabt, mich mit dem Thema auseinander zu setzen (und es gibt ja Qt Designer). Ich habe dann ein sehr einfaches Tutorial vorbereitet, vom leeren Fenster bis zur Verlinkung von Signalen und Aktionen. Ich dachte schon, es wäre zu trivial für die anderen Teilnehmer. Eigentlich ist es zu einem der meist gefragten Tutorials geworden. Ich war überrascht. Meine Teilnehmer waren begeistert und haben tatsächlich etwas gelernt. Ich auch.

Zum Schluss habe ich als weiterführende Übung das Basteln von einem einfachen Taschenrechner vorgeschlagen, ohne Lösung. Hier ist mein Vorschlag, leider als Bild, weil man Code hier sehr schlecht indentieren kann. Er ist nicht perfekt, vor allem ist das Benutzen von eval() sicherheitstechnisch nicht empfohlen und führt zu ungenauen Ergebnissen, wie es unten benutzt wird, aber es ging darum, zu zeigen, wie man mit Signalen arbeitet.

calculator_code