Divine Divinity unter Ubuntu spielen

Es geht! Ohne vorher Windows aus der VirtualBox zu starten! Und wenn es mit den anderen Spielen auch so einfach geht, sage ich Tschüß Windows, die Festplatte wird für Ubuntu neu formattiert, Tschüß VirtualBox, Hallo Wine! Ich habe gerade Wine komplett entfernt und reinstalliert, um mir die nötigen Schritte festzuhalten und um eine Einweisung zu haben, damit ich die andere Spiele installieren kann. Die Einleitung basiert zum größten Teil auf diese.

Wine ist ein Programm, mit dem man andere Programme, die für Windows geschrieben wurden, auch unter Linux zum Laufen bringen kann. Und begeistert bin ich auch, weil Programme, die mit Wine laufen, von weitem nicht so langsam sind wie unter Windows in der VirtualBox. Ich merke einen leichten Unterschied zu Divine Divinity unter nativem Windows, aber man kann damit leben.

Wie man Wine unter Ubuntu installiert, ist super einfach: sudo apt-get install wine im Terminal eingeben. Dabei wird ein neues verstecktes Verzeichnis .wine im Home-Verzeichnis angelegt. Ich habe nach der Wine-Installation den Rechner neu gestartet, weil ich die Empfehlung dazu von Ubuntu selbst bekommen habe. Gemäß dieser Anleitung habe ich noch Änderungen an den Einstellungen von Wine vorgenommen, mit dem Befehl winecfg:

Der nächste Schritt ist, den Inhalt der drei CDs vom Spiel in einem Verzeichnis zu kopieren. In Prinzip könnte man dieses Verzeichnis egal wo erstellen, aber es hat bei mir während der Installation vom Spiel nicht geklappt, wenn es nicht als Unterverzeichnisse von .wine angelegt wurde. Also habe ich unter .wine das Verzeichnis DD angelegt, und dort den Inhalt meiner CDs kopiert. Einfach durch „drag and drop“ von einem Fenster zum anderen. Die Spiel CD habe ich zuletzt kopiert, weil sie sich während der Installation explizit im CD-Laufwerk befinden muss.

Bevor man dann mit der Installation startet, sollte man noch unter Wine WinRAR installieren, weil es vom Installer von Divine Divinity benötigt wird. Auf der Download-Seite kann man die richtige Version für die Architektur vom Rechner und die gewünschte Sprache vom Programm wählen. Ich habe die Datei winrar-x64-550.exe unter meinem ~/Downloads/ Verzeichnis gespeichert. Dann im Terminal zu diesem Verzeichnis wechseln: cd ~/Downloads und WinRAR für Wine installieren: wine winrar-x64-550.exe. (Der letzte Punkt ist das Ende vom Satz und kein Teil vom Befehl.) Ich hatte selber dabei eine kryptische Fehlermeldung: err:winediag:SECUR32_initNTLMSP ntlm_auth was not found or is outdated. Die anderen (vielen) fixme Zeilen im Output von Wine kann man sonst ignorieren, aber eine Zeile die mit err anfängt mag ich gar nicht. Google hat mir verraten, dass ich vorher winbind hätte installieren sollen: sudo apt-get install winbind, und danach nochmal wine winrar-x64-550.exe ausgeführt, und alles war gut. Danach kann man winrar-x64-550.exe unter ~/Downloads/ löschen.

Jetzt kann es mit der Installation von Divine Divinity weiter gehen. Dafür, zuerst zum Verzeichnis DD wechseln: cd ~/.wine/DD, und den Befehl wine Setup.exe ausführen. Im Installationswizard sollten alle Standardeinstellungen behalten werden, außer zum Schluß, wo beide Häckchen für die Erstellung einer Verknüpfung und die Installation von DirectX weg genommen werden sollten. Das Spiel sollte nach der Installation noch nicht gestartet werden. Da meine Spielversion schon 1.0034A ist, brauchte ich den Patch nicht zusätzlich zu installieren. Es trifft sich gut, weil der Patch nicht mehr zu finden ist. Zum Schluß sollte man einige Zugriffsrechte richtig setzen. Zum Run-Verzeichnis von Divine Divinity wechseln: cd "~/.wine/drive_c/Program Files (x86)/Divine Divinity/Run" (die " Zeichen sind wichtig, weil unter Windows Leerzeichen Teil vom Pfad sein dürfen, was in Linux gar keine gute Idee ist). Dann: chmod +rw -R *. Als letzte Aktion habe ich, immer noch im Run-Verzeichnis, die Konfiguration vom Spiel gesetzt: wine configtool.exe. Dann erscheint das Fenster, das man sonst beim ersten Starten des Spieles sieht. Ich habe meine Auflösung auf 1024×768 mit Direct 3D gestellt. Es scheint damit gut zu funktionieren.

Zum Spielen habe ich mir ein Alias in meiner ~/.bashrc Datei gesetzt: alias play_divine_divinity='cd "~/.wine/drive_c/Program Files (x86)/Divine Divinity/Run"; wine div.exe'. Ich brauche nur noch im Terminal play_divine_divinity einzugeben, und das Programm startet. Es ist noch nicht perfekt, weil man dafür die Spiel-CD im Laufwerk braucht. Ist sie nicht da, wird man beim Starten vom Spiel danach gefragt, aber nach dem Einschieben der CD startet Divine Divinity immer noch nicht, und meine einzige Lösung war, aus einer anderen virtuellen Konsole (Ctrl+Alt+F1) das Spiel zu killen, zurück zu meiner Konsole (Ctrl+Alt+F7) zu gehen, festzustellen, dass ich mit einer unbrauchbaren Bildschirmauflösung nichts mehr machen konnte, und wieder in der anderen virtuellen Konsole den Rechner neu zu starten (shutdown -r now) — nicht wirklich optimal. (Das war bevor ich in den Einstellungen von Wine ein Häckchen bei Emulate a virtual desktop gesetzt habe.) Am besten ersetze ich bei Gelegenheit die Ausführung vom Alias durch ein kleines selbst-geschriebenes Skript, das vorher fragt, ob die Spiel-CD im Laufwerk ist, bevor das Spiel gestartet wird.

Wenn alles wie gewünscht läuft, kann man das Verzeichnis ~/.wine/DD löschen, es wird nicht mehr benötigt.

Advertisements

Windows aus der VirtualBox

Ich weiß nicht, was ich für einen Mist gebaut haben muss, aber gestern konnte ich plötzlich Windows 7 nicht mehr starten. Der Mainboard-Bildschirm erschien beim Hochfahren vom Rechner wie gewöhnt, danach hatte ich den schwarzen Bildschirm mit der Meldung, „Windows wird gestartet“, und dann wurde der Bildschirm ganz schwarz, mit dem Mauskursor in der Mitte, und dann passierte nichts. Gar nichts. Selbst nach zehn Minuten. Mir blieb nichts anderes übrig, als den Power-Knopf so lange zu drücken, bis der Rechner aus ging.

Beim nächsten Hochfahren ging es genau so. Und beim Nächsten. Irgendwann bekam ich die Auswahl zwischen normalem Start oder Starthilfe. Der abgesicherte Modus war komischerweise nicht vorhanden. Die Starthilfe wurde gewählt, aber sie konnte das Problem nicht beheben und alles, was man danach machen konnte war, den Rechner ausschalten zu lassen. Toll. Die Systemwiederherstellung, die ich vor einem Monat gemacht hatte, konnte ich also nicht nochmal durchführen.

Was ich noch machen konnte war, bevor Windows tut, als ob es hochfahren würde, die F11-Taste so lange zu drücken, bis ich ins Bootmenü komme. Von dort aus kann ich die Festplatte, wo Ubuntu installiert ist, auswählen, und Ubuntu starten. Ich denke, es war damals eine geniale Überlegung von mir, Ubuntu grundsätzlich auf eine neue, getrennte Festplatte zu installieren, obwohl die Windows-Festplatte noch viel Platz hat. Ubuntu funktioniert immer noch einwandfrei, und ich kann problemlos auf die Windows-Partitionen zugreifen und die Dateien lesen — selbst die vom Ehemann, die unter seinem Konto liegen und auf die ich unter Windows keine Leseberechtigung habe. Also scheint die Festplatte noch in Ordnung zu sein. Vielleicht ist der Boot Master Record beschädigt, und ich könnte versuchen, ihn mit dieser Anleitung wieder in Ordnung zu bringen. Vorausgesetzt, ich schaffe es, eine minimale Windows-Version mit Terminal zum Laufen zu bringen. Es erschien mir als eher unwahrscheinlich.

„Brauche ich wirklich Windows?“ habe ich mich gefragt. Ich benutze es nur noch, weil meine Lieblingsspiele auf Linux-Systemen nicht laufen. Ich gebe zu, ab und zu spiele ich immer noch sehr gerne super altmodische Spiele wie Baldur’s Gate, Neverwinter Nights oder Divine Divinity zum Beispiel. Alle mindestens fünfzehn Jahre alt, aber heutzutage findet man keine Rollenspiele mit solchen vielfältigen Geschichten mehr — sagte vor kurzem noch selbst der junge HiWi, der in unserer Gruppe arbeitet. Und wenn Diablo I nicht so schlecht mit den heutigen Grafikkarten aussehen würde, würde ich es auch noch spielen. Nachdem ich eine Sicherheitskopie von Spielständen auf der Ubuntu-Festplatte gemacht habe, habe ich mich mit virtuellen Maschinen auseinandergesetzt. Fertig bin ich noch nicht. Was ich bis jetzt gemacht habe, mit Hilfe dieser tollen YouTube-Anleitung (auf Englisch):

  • VirtualBox auf Ubuntu installiert: sudo apt-get install virtualbox (Version 5.0.40, nicht so aktuell wie die aktuellste Version auf https://www.virtualbox.org/wiki/Downloads).
  • VirtualBox Extension Pack für die VirtualBox Version 5.0.40 installiert (wenn man die aktuellste Version aufs Versehen installiert, bekommt man eine Fehlermeldung).
  • Eine geeignete ISO Datei für meine Windows-Version heruntergeladen. Die Installations-CD hatte ich zwar immer noch, aber ich fand es bequemer so. Dafür braucht man auch einen Lizenz-Schlüssel, den man beim Kauf vom Windows bekommen hat. Es liegt bei mir schon fünf Jahre her, ein Wunder, dass ich den Schlüssel trotz zwei Umzüge noch finden konnte.
  • Windows 7 in der VirtualBox gemäß der YouTube-Anleitung installiert, mit der Ausnahme, dass ich meinen Lizenz-Schlüssel eingegeben habe. Windows habe ich auf Englisch installiert, also sollte man für deutsche Versionen eventuell die Begriffe unten übersetzen. Da ich acht Prozessoren habe, habe ich vier davon Windows gegeben (unter „Settings“). Ich habe ebenfalls die Hälfte vom Speicher für Windows frei gegeben, und den ganzen Video-Speicher erlaubt. Man muss aufpassen, dass dem Host-Betriebssystem (Ubuntu) genug Ressourcen zu Verfügung stehen, um weiter laufen zu können. Sonst habe ich die automatisch ausgewählten Einstellungen benutzt.
  • Den Extension-Pack braucht man, um das Windows-Fenster maximieren zu können, sonst hat man ein Minifenster, mit dem man unmöglich spielen kann. Dafür muss man Windows in der VirtualBox im abgesicherten Modus starten können, und es funktioniert beim Drücken der F8-Taste beim Hochfahren nicht. Was man dafür machen muss (die vorgeschlagene Vorgehensweise auf der YouTube-Anleitung ab 12:07 hat bei mir nicht geklappt):
    • sich in Windows einloggen,
    • „Start“ klicken, dann im Suchfeld „run“ eingeben und die Eingabetaste betätigen,
    • im dadurch neu geöffneten Fenster, „msconfig“ eingeben,
    • im dadurch neu geöffneten Fenster, zum „Boot“-Tab wechseln und das Häkchen bei „Safe Boot“ unter „Boot options“ setzen,
    • „Apply“ klicken und Neustart zulassen,
    • dann, weiter wie in der YouTube-Anleitung ab 12:39 machen.
  • Die wichtigen Windows-Updates installieren.

Damit habe ich den Großteil von meinem sonnigen Sonntagnachmittag verbracht. Was mir noch fehlt:

  • die Auflösung vom Bildschirm richtig einstellen, vermutlich fehlt mir der Treiber der Grafikkarte,
  • Zugriff zu den externen Laufwerken (DVD…) bekommen,
  • Spiele installieren und testen, ob ich damit zufrieden bin.

Wenn alles klappt, mache ich die Windows-Festplatte platt und benutze nur noch Ubuntu und Windows in der virtuellen Maschine.

Blauer Bildschirm des Todes

Seit vorgestern kam mir mein Rechner komisch vor. Ich starte ihn normalerweise morgens beim Aufstehen, noch bevor ich die morgendliche Toilette anfange. Dann mache ich Kaffee und komme zum Rechner zurück. Seit vorgestern fand ich es merkwürdig, dass er so lange braucht, um zum Anmeldebildschirm zu kommen, weil er noch nicht damit fertig war, als ich zurück kam. Auch gestern Nachmittag nach dem Sport. Einmal meinte ich sogar, ich hätte mich schon angemeldet, aber so ganz sicher war ich es mir nicht. Nur komisch, dass ich nach der Anmeldung ein Fenster bekommen habe, ähnlich wie unten, mit der Nachricht, dass Windows nach einem unerwarteten Herunterfahren wieder ausgeführt wurde:

Heute Morgen bin ich die ganze Zeit dabei geblieben, und habe erkannt, dass es ein größeres Problem gab. Denn ich habe mich angemeldet, und habe gewartet, bis der Rechner benutztbar wurde (es dauert unter Windows 7 recht lange, bis alle Prozesse gestartet sind und ich etwas erledigen kann, obwohl CCleaner zum Einsatz kommt). Soweit kam es nicht, weil ich plötzlich einen blauen Bildschirm des Todes bekommen habe. Und kurz danach ist der Rechner wieder hochgefahren worden, und hat dabei gefragt, in welchem Modus er denn hochgefahren werden soll. Wäre ich wie üblich nicht vor dem Rechner gewesen, hätte er eine halbe Minute gewartet, bis er im normalen Modus gestartet hätte. Deswegen dauerte das Hochfahren seit vorgestern so lange. Und das hat er nicht nur einmal gemacht. Beim zweiten Hochfahren ist der blaue Bildschirm zurück gekommen, noch bevor ich mich angemeldet habe. Und beim Dritten. Gruselig. Ich hatte blaue Bildschirme so lange nicht mehr gesehen, ich dachte, sie wären aus der Welt geschafft worden. Nein.

Beim vierten Hochfahren habe ich beschlossen, Windows im geschützten Modus zu starten, und da ging es. In dem Fenster mit der Meldung zum unerwartetem Herunterfahren gab es noch Hinweise über Dateien, die mehr Informationen enthalten könnten. Alle Dateien unter C:\Windows\Minidump waren zwar binär und für mich unlesbar, aber aus deren Entstehungsdatum konnte ich erkennen, dass die Probleme vorgestern angefangen haben. Einem Vorschlag des Ehemannes folgend, habe ich den Rechner auf einen früheren Status von vor zwei Wochen wiederhergestellt. Wiederherstellungspunkte werden ja automatisch bei jedem Windows-Update kreiert. Das ist das erste Mal, dass ich eine Wiederherstellung benutzt habe. Nach dem nächsten normalen Neustart schien es in Ordnung zu laufen, außer dass Java ein Fenster öffnete, weil er eine bestimmte Datei nicht mehr finden konnte. Ja, stimmt, ich hatte doch diese Woche ein Java-Update gemacht, einfach, weil die automatische Meldung dazu kam. Vorgestern oder am Tag davor. Wozu brauche ich Java denn eigentlich? Es gab eine wissenschaftliche Software, die auf Java basiert, die ich aber seit meinem Institutswechsel nicht mehr brauche. Weg damit. Java deinstalliert. Der Rechner wurde nochmal neu gestartet, um die letzte Updates durchzuführen. Bis jetzt sieht es gut aus. Hoffentlich ist das Problem behoben.

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