Schon November

Unser neuer Türkranz

Ich spüre fast den Wind, so schnell die Zeit an mir vorbei läuft. Schon November! Ich hatte so viel zu tun, dass ich mein armes Tagebuch im Stich lassen musste.

Was ich seit der Rückkehr aus dem Urlaub (und eigentlich schon im Urlaub) getrieben habe: Ganz viele Online-Kurse belegt. Im September gab’s plötzlich viele interessante Angebote, das Nerd in mir konnte sich nicht zurückhalten. Dabei habe ich mich bis jetzt nur auf zwei Plattformen für kostenlose Kurse beschränkt: openHPI und France Université Numérique (kurz: FUN). Der erste Kurs, Einführung in die Mathematik der Algorithmik, hatte es ganz schön in sich, und statt nur die versprochenen wöchentlichen 3-6 Stunden dafür zu brauchen, habe ich, trotz Physikstudiums und Doktortitels, gut fünfzehn Stunden jede Woche dran gesessen. Andere Kurse von der FUN Plattform mussten erstmal liegen bleiben, da beim openHPI jede Woche Prüfungen abgegeben werden sollten, und es bei FUN nur eine einzige Abgabefrist für alle Prüfungen nach Ende der Kurse gibt. Python 3.6 (ich habe bis jetzt hauptsächlich mit Python 2.7 programmiert), Statistik mit R (Wiederholung), Ruby, und wissenschaftliche Kurse zur persönlichen Weiterbildung im Zusammenhang mit der Arbeit… Da blieb wenig Zeit für etwas anderes. Langsam geht es besser, einige Kurse sind vorbei, und ich kann meinen Lebenslauf mit neuen Zertifikaten beschmucken.

Endlich kann ich berichten, dass unsere Küche völlig funktional ist. Fast vier Monate nach dem Umzug. Erst musste die Steckdose für den Backofen wieder zugänglich gemacht werden. Dann haben wir festgestellt, dass der Wasseranschluss, der ebenfalls zugemauert wurde, nach dessen Befreiung nicht zu unserer Möbeleinrichtung passte. Entweder die schweren Möbeln umräumen, was bei der Winzigkeit der Küche und der Empfindlichkeit des Parkettbodens sehr schwer wäre, oder unseren teuren Spülmöbel zersägen, um ihn an die Wasseranschlüssen anbringen zu können, meinte der erste Handwerker. Dass das nicht in Frage kam, brauche ich nicht zu erzählen. Ein zweiter Handwerker wurde bestellt, und es wurde doch möglich, die Anschlüsse selber an unseren Möbeln anzupassen. Seitdem müssen wir (hauptsächlich der Ehemann) nicht mehr das Geschirr in die Badewanne spülen, die Spülmaschine ist wieder im Einsatz! Der Wasserhahn leider nicht, er hatte scheinbar im Umzug gelitten und leckte. Einen neuen Hahn haben wir erst vorgestern angebracht. Wenigstens konnte ich seit ein paar Wochen endlich wieder hemmungslos kochen. Heute Abend gab’s den längst vermerkten Kürbis-Hummus. Das Einzige, was in der Küche noch nicht zufriedenstellend läuft: Warmes Wasser. Ich muss fünf Minuten lang den Hahn voll aufgedreht lassen, ohne  zu übertreiben, bevor das Wasser warm wird, wie ich heute Abend feststellen durfte. Das kann kein Dauerzustand werden.

Seit letzter Woche habe ich eine neue Beschäftigung gefunden: Jahresplaner für 2019 selber basteln, als Geschenkidee für die Nichten vom Ehemann. Meine Nichten. Nochmal danke Carrie. Die Notizbücher sind gekauft, ich habe mir ganz viele Videos auf YouTube angeschaut, wie man sowas macht, am Freitag noch mehr Material besorgt, wie Washi Tape, und angefangen, an den Monatsdeckblättern zu arbeiten.

Doch weg von den Farbstiften. Dafür habe ich, wie der Zufall es will, mein ebenfalls lange nicht mehr benutztes Wacom-Bamboo-Tablet wieder in Betrieb genommen. Batterie aufgeladen, und los ging’s. Das Ding hatte ich mir vor sechs Jahren geschenkt, und ich hatte viel Spaß damit, bis ich nach Berlin umgezogen bin. Danach hatte ich keine Zeit mehr. Irgendwie blöd. Ich meine, wie genial ist das denn, mit Strg-Z malen zu können? Ups, die Hand ist verrutscht, Strg-Z. Menno, der letzte Einfall mit der Wasserfarbe hätte nicht sein müssen, Strg-Z. Ich hatte sogar eine Taste vom Tablet mit der Tastenkombination belegt. Von Spielchen mit Ebenen ganz zu schweigen. Das hat aber mehr mit der Software zu tun, die mit dem Tablet geliefert war. ArtRage 3 Studio Pro. So intuitiv zu benutzen, viel besser, als Adobe Photoshop Elements, das ich mir auch herunterladen durfte. Ich hatte vor einigen Jahren Malkurse belegt, aber seit dem Tablet zeichne ich viel lieber digital.

Die Mieze hat auch einiges auf dem Tablet inspiriert… Daher mein Blog-Logo!

Und zunehmend denke ich daran, mir Fahrstunden zu buchen und mein MVV-Abo zu kündigen. Ich bin seit zwanzig Jahren nicht mehr selber Auto gefahren. Der miserable Zustand vom Münchner ÖPNV wird mich dazu bringen. Ein neues Auto haben wir schon geplant. Hybrid, automatisch, von Toyota. Viel umweltfreundlicher als unser aktuelles Diesel-Polo, und eine Stunde pro Tag gespart. So konkret haben wir keinen Zeitplan, aber es wird hoffentlich ziemlich bald kommen.

Ach, und was macht der Daum? Er erholt sich langsam. Sieht schon nicht mehr so übel aus.


Dieser Beitrag ist ursprünglich auf Meckereien & Co. erschienen.

Werbeanzeigen

Sonntag

Sportlich bin ich mit dieser Woche nicht zufrieden.

Nach dem Monstermuskelkater, der sich bis Dienstagabend spürbar gemacht hat, bin ich am Mittwoch nach der Arbeit zum Fitnessstudio gegangen. Ein bisschen früher als sonst, weil ich keine Lust hatte, schon wieder erst nach neun Uhr abends zu Hause zu sein. Ich fühlte mich an dem Tag sehr gut und voll motiviert. Bei einigen Geräten konnte ich das Gewicht leicht erhöhen. Leider war das Fitnessstudio extrem voll. Dass ich stehen und warten musste, um an Geräten zu kommen, hatte ich noch nie erlebt. Flexibel bin ich, aber wenn alle fünf Geräte, die ich noch auf dem Plan habe, und alle ihre Alternativen, belegt sind, geht es mir massiv auf dem Keks. Ich habe auf die drei letzten Übungen verzichtet und die abschliessende halbe Stunde auf dem Cross-Trainer verbracht. Als ich fertig war, war der Geräte-Raum schon viel leerer. Ich war einfach zu früh angekommen.

Ursprünglich wollte ich am Freitagabend zurück zum Sport. Wir haben uns aber bei der Arbeit fürs Feierabend zum Bier trinken getroffen, und das war’s mit dem Vorhaben. Immerhin habe ich es geschafft, mir auf dem Weg nach Hause ein Springseil zu besorgen. Durch Übungen könnte ich meine Muskeln bestimmt trainieren, die am Anfang der Woche so geschmerzt hatten. Ein Versuch ist es wert.

Ich bin gestern zurück zum Fitnessstudio gegangen. Motiviert war ich nicht, das Wetter lud nicht nach draußen ein, und ich habe mich dort nur verschleppt. Für meine übliche verbrauchte Anzahl von Kalorien am Cross-Trainer musste ich in der gleichen Zeit mit einem erhöhten Puls treten. Krafttraining war schwer, obwohl ich die gleiche Gewichte wie am Mittwoch benutzt habe. Zwischendurch habe ich das Springseil ausprobiert. Es war ein Fehler. Ich weiß nicht, wie ich es angestellt habe, aber ich habe vom Anfang an Schmerze im rechten Bein bekommen, und habe natürlich sofort aufgehört. Nur noch den Oberkörper trainiert. Sportvorhaben wieder nicht vollständig durchgeführt. Vielleicht sind die Schuhe, die ich beim Training an habe, nicht zum Springen geeignet. Oder ich bin zu schnell gewesen. Jetzt heißt es, wieder humpeln. Was weh tut ist der Fußgelenk, an der Außenseite, der Peroneus Brevis und hinter dem Knie spüre ich auch was.

Nach dem Fitnessstudio habe ich mit schmerzendem rechten Bein möglichst kurz eingekauft. Was zum essen, ich plane für heute eine Kartoffel-Tortilla, und neue Socken für den Winter. Beim TK Maxx habe ich tolle „Heat Holders[1] Socken entdeckt, und ich kann schon sagen, sie halten ihr Versprechen. Jetzt ist Schluß mit kalten Füßen.

Heute schmerzt das rechte Bein immer noch, trotz Voltaren über Nacht. Besser nicht laufen, ehe es schlimmer wird. Ich arbeite an den Ketten weiter, eine ist schon fast fertig, und hole nebenbei meine Verspätung beim aktuellen Python-Kurs (auf Französisch) nach. Ich habe Python durch Bearbeitung vom Code meines Vorgängers gelernt, aber nie so systematisch studiert. Es ist unglaublich, was ich alles in den letzten drei Jahren so programmieren konnte, ohne wirklich zu wissen, was dahinter steckt. Ich weiß nicht, wie mein Vorgänger die Programmiersprache gelernt hat, aber mir wird immer bewusster, dass es im Code viel Verbesserungsbedarf gibt. Wenn ich Zeit dafür hätte. Ich soll die Funktionalität von Programm #1 verbessern und erweitern, aber was vor allem nötig ist, ist was man refactoring nennt — keine Ahnung, wie es auf Deutsch heißt. Ach so, Restrukturierung. Ich hoffe, ich kriege es hin, bevor ich das Baby an meinem eventuellen Nachfolger überreiche, wann auch immer es sein wird. Eine mündliche Zustimmung von Winfried für eine Weiterbeschäftigung bis Ende 2017 habe ich schon bekommen.

[1] Unbezahlte Werbung, da Verlinkung.


Dieser Beitrag ist ursprünglich auf Meckereien & Co. erschienen.

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("Wie viel wiegst du? "))
            if start_gewicht  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("Wie viele 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.


Dieser Beitrag ist ursprünglich auf Meckereien & Co. erschienen.

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.


Dieser Beitrag ist ursprünglich auf Meckereien & Co. erschienen.

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 ') 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.


Dieser Beitrag ist ursprünglich auf Meckereien & Co. erschienen.

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-Systems, 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


Dieser Beitrag ist ursprünglich auf Meckereien & Co. erschienen.

Erschöpft

Müde mit Migräne. Kurz vor fünf habe ich eingesehen, dass es keinen Zweck hatte, länger bei der Arbeit zu bleiben. Ich konnte nur noch gähnen. Ich bin mit dem Fahrrad nach Hause gefahren, da ich morgen früh anfangen muss und mit dem Fahrrad schneller als mit der Tram bin. Ich bin langsam gefahren und habe jede Bodenunebenheit auf der Straße gespürt. Jedes Mal hat es einen stechenden Schmerz in der linken Schläfe ausgelöst, bis zum Auge.

Ich habe mir diese Woche nicht genug Schlaf gegönnt. Es war schon stressig, da wir seit dem Wochenende mit Martin viele Möbel-Läden besucht haben, um uns Küchen für die neue Wohnung anzuschauen. Zeitverschwendung. Wenn in Läden Preise stehen, beziehen sie sich nie auf das, was man ausgestellt sieht, sondern auf das Foto auf dem Plakat. Man kann sich so keine Vorstellung vom Endpreis machen. Wir sollten mit einem Plan der Küche kommen und sagen, was wir uns als Material und Geräte vorstellen, und einen Preisvorschlag erstellen lassen. Meine Mami sagt, dafür sollte man pro Laden gut anderthalb Stunden planen.

Heute Morgen bin ich von Martin’s Wohnung aus mit dem Fahrrad zur Arbeit gefahren. Ich hatte es seit fast drei Wochen nicht mehr gemacht. Ich habe anderthalb Stunden gebraucht. Mir ging’s zuerst gut, dachte ich, aber danach habe ich mich doch müde gefühlt. Kaffees und Schokoriegel haben nicht geholfen. Gegen 14:00 habe ich die ersten Anzeichen von einem Kopfschmerz wahrgenommen und Paracetamol geschluckt. Ohne Wirkung.

Bei der Arbeit ging es sowieso seit dem Morgen schleppend. Ich habe viel Zeit damit verbracht, Google-Suchen über Qwt5 und PyQt4 zu machen. Ich habe Daten, die mein Vorgänger in meinem Programm in einigen Plots dargestellt hatte. Ganz einfache x:y Daten. Die Darstellung sollte aber 1/x2:y sein, mit den Werten für x auf der x-Achse, nicht für 1/x2. Ein Kopfzerbrechen. Ich habe den Eindruck bekommen, dass QwtScaleEngine gebraucht wird. Was QwtScaleEngine macht, ist aber, zwischen linearer und logarithmischer Darstellung zu wechseln, mehr nicht. Ich müsste eine neue Funktion definieren, um eine eigene Darstellung mit 1/x2 zu kreieren. Es würde QwtScaleTransformation involvieren. Wie, ist mir nicht ganz klar, so spärlich die Qwt-Dokumentation ist. Dort ist nichts erklärt, es gibt nur eine Auflistung von allen Klassen und Attributen. Keine Ahnung, wie man sie benutzen soll. Ich habe sowieso nur die Dokumentation für die Version 6.1.1 gefunden, und ich arbeite mit einer älteren Version, bei der QwtPowerTransform nicht existiert. Ein Beispiel für eine personalisierte Skalierung habe ich gefunden, mit vielen neuen Klassen zu definieren, was mir zu aufwendig war. Eine einfache Lösung des Problems scheint es nicht zu geben. Kein Wunder, dass mein Vorgänger stattdessen

myengine = self.ui.qwtPlot.axisScaleEngine(Qwt.QwtPlot.xBottom)

Qwt.QwtScaleEngine.setAttribute(myengine, Qwt.QwtScaleEngine.Inverted)

benutzt hat. Das löst das Problem leider nicht wirklich.

Ich habe meine Suche aufgegeben, als Uschi nachmittags zu mir kam und meinte, er würde meine Daten über die Download-Statistik vom Programm, die ich ihm gestern geliefert hatte, für merkwürdig halten und ich sollte sie überprüfen, bevor er sie in seinem Vortrag morgen benutzt. Seit der Freigabe in Februar hat sich die Anzahl der Nutzer verdoppelt. Es kam ihm suspekt vor, weil wir bei jedem Download eine automatische Email bekommen, da die Nutzer ein Registrierungsformular ausfüllen müssen, und er hätte nicht so viele in seinem Postfach. Ich habe meine Zahlen geprüft, was mir eine Stunde gekostet hat, und dasselbe Ergebnis wie gestern bekommen. Das mache ich anhand einer Mailing-Liste, die per Hand gepflegt werden muss. Wir hatten unsere IT-Abteilung gefragt, die Email-Adressen der Nutzer automatisch in der Liste zu speichern, aber „es geht nicht“. Ich muss regelmäßig alle Emails öffnen und prüfen, ob die Adresse schon in der Liste ist, bevor ich eine neue einfüge (wenn ich Updates ankündige, laden die Nutzer das Programm erneut herunter).

Es hat meine Stimmung nicht verbessert, dass Kate mich immer wieder zwischendurch mit idiotischen Fragen belästigt. Heute wollte sie wissen, wie man mit PowerPoint unter Linux PDF-Dateien erzeugen kann. Seufzer. Wie häufig habe ich ihr schon gesagt, dass es unter Linux kein PowerPoint gibt? „Ach nee, mit OpenOffice“, korrigierte sie sich dann. Wir haben eigentlich LibreOffice, aber diese Feinheit habe ich nicht mehr erwähnt. Programm selber geöffnet, unter „File“ geschaut, und da war, mittig, nicht zu übersehen, die Zeile „Export as PDF“. Hätte sie bloss die Menü-Punkte gelesen, hätte sie die Frage nicht stellen müssen. Promovierte blöde Kühe gibt es wohl.

Ich wollte eigentlich heute Abend mit dem Vortrag anfangen, den ich nächste Woche bei einer Tagung halten soll. Mit der Migräne wird es heute nichts mehr.


Dieser Beitrag ist ursprünglich auf Meckereien & Co. erschienen.

Bad fd number

Ein Nerd-Beitrag, der hoffentlich weiter helfen könnte.

Das Bad fd number Problem ist aufgetaucht, als ich mein Python-basiertes Programm auf Ubuntu testen wollte. Im Code werden einige externe Befehle aufgerufen, mit Hilfe von os.system(command), wo command ein String ist. Auf Scientific Linux: Kein Problem. Das hatte mein Vorgänger selber so implementiert. Auf Ubuntu ist das Programm abgestürzt, mit der Meldung:

sh: 1: Syntax error: Bad fd number

Ich habe danach gegoogelt und herausgefunden, dass das Problem aus einem Shell-Link kam. Auf Ubuntu verlinkt /bin/sh zu dash, und nicht zu bash wie auf anderen Linux-Betriebssystemen. Die Lösung schlug vor, stattdessen /bin/sh zu bash zu verlinken:

sudo mv /bin/sh /bin/sh.orig

sudo ln -s /bin/bash /bin/sh

Ich habe es auf meinem Testrechner ausprobiert und kein Problem festgestellt. Seit über einem Monat steht diese Lösung auf der internen Webseite unserer Gruppe. Keiner hat etwas dagegen geäußert. Letzte Woche habe ich die Installationsanleitung für Ubuntu als Entwurf auf der Projekt-Webseite kopiert und Uschi gebeten, sich den Inhalt genau anzuschauen, bevor er die Webseite frei gibt. Die Webseite hat er veröffentlicht.

Diese Woche waren wir endlich so weit und mein Programm ist veröffentlicht worden. Rundmails zur Ankündigung geschickt, Anzahl der Downloads begeistert verfolgt, Rückmeldungen mit Wünschen für neue Funktionen oder (sehr wenig) Installationsproblemen bekommen. Gestern fragte mich Uschi auf einmal ganz überrascht, was die Änderung vom Shell-Link auf Ubuntu sollte. Es wäre nicht OK, dadurch könnte man das komplette System verschrotten, eine andere Lösung müsste her. Ich war irritiert, dass er das erst jetzt merkt.

Ich hatte vermutet, dass das Problem aus dem externen Befehl in command stammt und dachte, ich müsste mit dem Autor des Skriptes Kontakt nehmen, um nach einer Lösung zu fragen. Bestimmt hätten schon viele Ubuntu-Nutzer sein Skript benutzt und das gleiche Problem gehabt. Vorher wollte ich trotzdem sicher sein. Ich habe den ursprünglichen Shell-Link zu dash wieder erstellt. Ich habe das im Programm erzeugte command direkt vor seiner Ausführung und vor dem Programmabsturz ausdrucken lassen. Der Code sah so aus:

print(command)

os.system(command)

und im Terminal hatte ich das command ausgedruckt, gefolgt von der Bad fd number Meldung und den ganzen Tracebacks. Genau das gleiche auf Scientific Linux ging ohne Problem.

Zurück auf Ubuntu, habe ich mit copy/paste command im Terminal selber ausgeführt. Und Überraschung, auf einmal ging’s. Merkwürdig. Die ganze Zeit hatte ich das externe Skript für die Ursache des Problemes gehalten. Jetzt kam der Verdacht, dass os.system(command) auf Ubuntu anders als auf Scientific Linux funktioniert. Oder genauer ausgedrückt: os.system() ruft anscheinend /bin/sh, und /bin/sh -> bash auf allen Linux-Systemen, außer auf Ubuntu, wo das Ziel des Linkes dash ist. Daher die Fehlermeldung.

Ein Lösungsansatz war auf einmal klar. Alle externe Befehle mit os.system() sollten mit subprocess.Popen() ausgeführt werden. Und genau das hat funktioniert. Jetzt brauche ich nicht mehr die Fummelei mit dem Shell-Link.


Dieser Beitrag ist ursprünglich auf Meckereien & Co. erschienen.

Dienstag

Mir geht’s schon viel besser. Das hätte ich nach heute Nacht nicht erwartet. Mit Kopfschmerz gegen elf ins Bett, um halb drei aus irgendeinem Grund wieder wach. Unruhig. Ständig gewälzt. Um halb sechs habe ich noch den Wecker geschaut. Um sieben hat er mich plötzlich aus einem heißen lesbischen Traum gerissen. Am frühen Morgen nach langer Schlaflosigkeit sind meine Träume immer sehr merkwürdig.

Als ich auf dem Weg zur Arbeit in die Straßenbahn eingestiegen bin, war Winfried auch drin. Er wohnt ein bisschen weiter weg auf der gleichen Linie. Wir haben uns während der Fahrt über die Entwicklung meines Projektes unterhalten. Wenn Uschi nicht da ist, übernimmt er ja seine Funktion als Chef. Ich habe wieder im Büro meiner Kollegen gesessen und versucht, mein Programm auf einer frischen Installation von openSUSE 13.1 zum Laufen zu bringen. Vergeblich. Qwt5 kann nicht gefunden werden, obwohl ich alle Pakete installiert habe. Google hat mich im Stich gelassen. Die Kaffeemaschine hat erneut gestreikt. Martin war wegen eines Termins den ganzen Vormittag nicht da. Er ist kurz vor der Mittagspause angekommen. Mittags waren wir nicht alleine. Ich bin dafür mit ihm nachmittags im Labor geblieben, aber natürlich ging’s primär um die Arbeit. Keine süße Zärtlichkeit wie am Wochenende. Um fünf war er schon weg, um zum Sport zu gehen. Mist.

Nach weiteren erfolglosen Versuchen mit Qwt5 bin ich zum Fitness-Studio gegangen. Mein Training lief super. Zwei Stunden, wie immer. Ich werde beim nächsten Mal das gleiche machen, aber es wird danach wieder Zeit, einige Gewichte zu erhöhen, damit es anstrengend genug bleibt. Ich habe fast die 70kg verlassen. Das Gewicht hatte ich ewig nicht mehr erreicht, obwohl ich nicht besonders auf meine Ernährung aufpasse. Döner-Box mit Pommes gibt’s relativ häufig. Selbst als ich vor drei oder vier Jahren täglich trainiert hatte, vor meinem Ischias-Problem, war ich nie unter 74kg gekommen. Ich muss zum Arzt gehen, um meinen Zustand prüfen zu lassen. Ich habe seit dem Sommer zu schnell abgenommen, und ich erinnere mich an mein Diploma-Jahr, als ich wegen der ganzen Paukerei super dünn geworden war und den Sommer danach mit Eisen- und Magnesium-Tabletten verbringen musste, weil erhebliche Mängel durch eine Blutspende zufällig ans Tageslicht gekommen waren.

Aber jetzt fühle ich mich toll. Das Training hat Spaß gemacht. Mein Ischias verhält sich fast wieder, als ob nie etwas gewesen wäre. Morgen gibt’s ein enges Kleid mit Pumps. Vielleicht kann ich Martin überzeugen, etwas am Abend zu unternehmen. Ohne dass meine (deutlich ältere) Kollegin Mieke es mitbekommt. Ich mag es nicht, wie sie sich manchmal mit ihm verhält, vor allem, da sie sich vor kurzem von ihrem Mann getrennt hat. Als ich das letzte Mal mit Martin zum Weihnachtsmarkt verabredet war, hatte sie es irgendwie erfahren und wollte sich einmischen. Etwas hatte sie doch im letzten Moment daran gehindert. Es war ein bisschen der Grund, warum ich zum Labor mit ihm heute Nachmittag gegangen bin, da er zum ersten Mal dort arbeitet und sie ihn vorher einweisen musste. Ich habe selber nie im Labor etwas gemacht, ich konnte dadurch meine Absicht gut tarnen. Vielleicht bilde ich mir nur etwas ein. Mit mir verhält sie sich auch überfreundlich.


Dieser Beitrag ist ursprünglich auf Meckereien & Co. erschienen.

Maverick & PyQt…

Keine Ahnung, wie das gehen soll. Eins weiß ich, mir hat’s gereicht.

Am Anfang hörte es sich relativ harmlos an. Uschi wollte, dass ich die Installation meines Programms auf seinem Mac teste. Meine bisherige Erfahrung mit Mac-Rechnern: Ich habe die schon mal aus einem Schaufenster im Apple-Laden gesehen. Ich habe für mein Programm mit Python2.6 und PyQt4 auf Linux gearbeitet. Dass einige Sachen anders sein würden und ich viele Fehler auffangen sollte, wusste ich. Was mir nicht klar war, ist die Tatsache, dass PyQt4 auf Uschi’s Mac nicht installiert ist. Kein großes Problem, dachte ich. Schließlich habe ich zu Hause auf meinem Windows 7 Rechner ohne Problem aus einem Installer PyQt4 bekommen.

Der Hacken ist, dass es für Mac keinen Installer gibt. Anweisungen zur Installation habe ich auf Internet gefunden, die mich immer mehr verwirrt haben. Um PyQt installieren zu können, braucht man SIP. Ich hatte bisher von SIP noch nie was gehört. Ok, SIP installiert, dann PyQt4… Ach nee, Qt gibt’s doch gar nicht auf dem Rechner! Da fiel Uschi auf, dass er für die Installation von Qt noch Teile von Xcode brauchte. Ich habe nichts gesagt, keine Ahnung, wovon er redete. Ich habe ihn diesen Teil installieren lassen (2GB Download immerhin), dann haben wir Qt5.1.1 installiert, dann SIP4.15.4, dann die ziemlich letzte Version von PyQt, und es hat nicht funktioniert. Um zu diesem Ergebnis zu kommen, haben wir fast zwei Stunden gebraucht.

Da Uschi heute unterwegs ist, meinte er, die Gelegenheit wäre perfekt, damit ich alleine an seinem Mac arbeiten könnte, um PyQt zu installieren. Seit der Mittagspause habe ich an seinem Rechner gesessen. Ich habe ziemlich alles probiert, was mir durch den Kopf gegangen ist. Verschiedene Versionen, mit --arch x86_64 oder --arch i386, Qt4, Qt5…

  • Qt5.2.0 beta + PyQt4.10.4: Fehlermeldung /Library/Python/2.7/site-packages/PyQt4/QtCore.so: No such file or directory beim sudo make install (ich habe inzwischen Administratorrechte bekommen)
  • Qt4.7.3 + PyQt4.10.4: Ich war begeistert, es gab beim sudo make install keine Fehlermeldung, selbst wenn ich beim make jede Menge Warnungen über die nicht unterstützte Mac OS X Version (Maverick) gesehen habe. Aber als ich dann meinen Programm laufen ließ: Traceback bei from PyQt4.QtGui import *, mit der Beschimpfung ImportError: dlopen(/Library/Python/2.7/site-packages/PyQt4/QtCore.so, 2)
  • Ein Versuch mit einer 32-bits Architektur: mach -o, but wrong architecture
  • Qt4.6.4 + PyQt4.10.4: Am configure.py ist es schon gescheitert: Error: Failed to determine the layout of your Qt installation
  • Qt4.8.4 oder Qt4.8.5 + PyQt4.10.4: wieder die ImportError Meldung
  • Irgendein Build von Qt5.2.0 beta + das letzte Snapshot von PyQt5.2: SIP konnte beim sudo make install nicht gefunden werden (ich habe mich nicht darüber gefreut, dass die Fehlermeldung nach dem make kam, der schon 10mn braucht)
  • Statt python2.7, habe ich auch python2.6 versucht: ImportError

Das einzige, was ich nicht geändert habe, war die Version von SIP. Jetzt ist es fast neun, ich sitze immer noch im Büro und habe tierisch Hunger. Schnauze voll, ich gehe nach Hause. Warum soll es eigentlich mein Job sein, wenn wir im Team einen IT-Ingenieur haben? Schließlich habe ich Physik studiert, nicht Informatik.


Dieser Beitrag ist ursprünglich auf Meckereien & Co. erschienen.