Mittwoch, 6. Juni 2012

Ubuntu Softwarecenter und die Suchfunktion

Das die Suchfunktion für Programme (und Paketen) im Softwarecenter von Ubuntu "bescheiden" ist, habe ich schon öfters in Blogeinträgen erwähnt.

Nun, ich möchte mich korrigieren: Die Suchfunktion ist schlecht. Schlecht in sofern, dass die Treffer für Suchbegriffe Ergebnisse liefern, welche schlichtweg nicht die Pakete bzw. Programme enthalten, die man eigentlich erwartet oder erwarten würde.

Dazu ein aktuelles Beispiel aus jüngster Erfahrung: Ich wollte unter Ubuntu 12.04 Precise Prolog installieren (nein, ich kann kein Prolog, ich wollte lediglich ein Prolog-Programm testen, welches ich in einem Buch gesehen hatte). Gibt man nun im Softwarecenter den Suchbegriff "Prolog" ein, erhält man zwei Treffer: Einen Editor namens "jedit" und für ein 2D-Zeichenprogramm namens "TGif" (was immer das mit Prolog zu tun hat...). Weit und breit kein Prolog-Compiler zu sehen... Gut, es könnte natürlich sein, dass es kein Prolog für Precise gibt, was aber aufgrund der Paketvielfalt unter Ubuntu relativ unwahrscheinlich ist. Außerdem ist Prolog ein etablierte Programmiersprache und sollte von daher vorhanden sein.

Nun ist mein Wissen um Prolog relativ klein. Ich weiß, dass es verschiedene Prolog-Compiler gibt, mehr aber nicht. Also habe ich die Paketsuche von packages.ubuntu.com besucht und hier auch den Suchbegriff "Prolog" eingeben. Erster Treffer: Das Paket "gprolog", welches den GNU Prolog Compiler enthält. Gibt man den Suchbegriff in Synaptic ein, findet man neben gprolog auch noch einen anderen Prolog-Compiler. Gibt man übrigens "GNU Prolog" als Suchbegriff im Softwarecenter ein, dann findet es auch den gleichnamige Compiler - was aber im Umkehrschluss für eine erfolgreiche Suche voraussetzt, dass der Suchende weiß, dass es GNU Prolog gibt.

Aber warum klappt das mit der Suche denn nicht im Softwarecenter? Ich habe ja überhaupt kein Problem damit, dass Canonical das Softwarecenter auch als Vertriebsplattform für kommerzielle Software und ähnliches nutzt und die Startansicht des Softwarecenters Werbung dafür enthält. Nur: Solange hier keine brauchbaren Ergebnisse für (triviale) Suchanfragen nach "normalen" Programmen geliefert werden, ist das Softwarecenter für mich kein vernünftiger Ersatz für andere grafische Paketmanager wie Synaptic & Co.

Freitag, 18. Mai 2012

Falsche Verknüpfung von .exe-Dateien unter Windows durch Adobe Reader

Ich weiß nicht, wie man es hin bekommt, aber es kann bei der Installation des Adobe Readers unter Windows passieren, dass alle .exe-Dateien mit dem Reader verknüpft sind. Sprich, die exe-Dateien lassen sich nicht mehr ausführen. Sehr lästig...

Wie gesagt, wie und unter welchen Umständen das passiert weiß ich nicht. Es ist aber schon ein mal einer Kollegin und ein mal einem Verwandten passiert. Bei letzterem musste ich dann ran um es zu richten.

Was der Fehler ist, ist ja klar, nämlich dass die Verknüpfung falsch ist. Wie man es behebt war mir aber nicht ganz klar. Man kann zwar die Verknüpfung der meisten Dateitypen von Anwendungsprogrammen (z.B. .docx, .pdf, .jpg usw.) unter Windows via GUI bearbeiten. Aber eben nicht für .exe. Was letztendlich wohl auch sinnvoll ist, damit man sich nicht aus Versehen sein System abschießt.

Mit ein  bisschen googlen habe ich folgenden, sehr brauchbaren Link gefunden: http://www.pcpowerguide.com/processes/exe/fix-exe-file-association-errors/

An diesem habe ich mich dann letztendlich bei der Rettung auch orientiert. Vor dem manuellen Eingriff in die Registry habe ich noch Microsoft Regclean runtergeladen und laufen lassen. Da Tool ist zwar uralt, gilt aber immer noch als bewährt, um Fehler in der Registry zu beheben. Wobei der oben beschriebene Fehler dadurch nicht behoben wird.

Bevor's weiter geht noch die obligatorische Warnung:

Beim manuellen Bearbeiten der Registry kann man - bewusst oder unbewusst - sein System nachhaltig schädigen, grundsätzlich hin bis zur Nicht-Benutzbarkeit. Von daher wie immer vorab alle wichtigen Daten sichern und ggf. auch eine Sicherung der Registry machen.

Fühlt man sich bereit, kann es losgehen:

Als erstes muss man den Adobe Reader komplett deinstallieren. Dann startet  man den Registy-Editor, der bei allen Windows-Version an Bord ist. Dies geht über "Start -> Ausführen" und die Eingabe von "regedit". Jetzt navigiert man im Baum auf der linken Seite zum Schlüssel "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.exe". Dort ist hinterlegt, womit .exe Dateien verknüpft sind - nämlich üblicherweise mit nichts. Von daher sind die bei Unterschlüssel "OpenWithList" und "OpenWithProgids" bis auf die Default-Schlüssel leer. Auf einem System mit dem o.g. Fehler findet man hier Einträge, welche auf den Adobe Reader verweisen. Dies Schlüssel muss man nun alle Löschen. Nach einem Neustart des System ist wieder alles "sauber" und man kann eine neue Installation des Adobe Readers wagen.

Sonntag, 13. Mai 2012

Das harte Leben eines Fussgängers in China

Wenn man in einer chinesischen Stadt zu Fuß geht, hat man keine Rechte im Straßenverkehr. Das ist Fakt.

Wer denkt, die Autos würden an einem Zebrastreifen anhalten, wenn man diesen überquert, der liegt so was von falsch. Wer nicht sehr sorgfältig schaut, wird spätestens bei der 2. Straßenüberquerung gnadenlos um gefahren. Kommt mir jedenfalls so vor. ;-)

Auch grüne Fussgängerampeln sind kein Garant, dass man gefahrlos die Straße überqueren kann. Zum einem, weil Rechtsabbieger auch bei rot abbiegen dürfen, zum anderen, weil für viele Autofahrer die Beachtung der Lichtsignalanlagen optional zu sein scheint.

Aber: ich habe eine Taktik entwickelt, die eine sicher Überquerung von Straßen, auch großen Straßen in großen Städten wie Beijing, relativ sicher ermöglicht.

Diese sieht wie folgt aus:
  • Halte nach Einheimischen Ausschau, die auch die Straße überqueren wollen.
  • Wenn diese los gehen, gehe auch los.
  • Wichtig: Gehe bis zur Straßenmitte rechts vom Einheimischen und wechsle ab der Straßenmitte nach links. Grund: China hat wie wir Rechts-Verkehr, d.h. zuerst kommen die Autos von links, dann von rechts. Somit hat man immer jemanden zwischen sich und dem nahenden Auto laufen. Klingt hart, aber manchmal muss man auch nur an sich denken. ;-)
  • Sollte der Einheimische auf einmal anfangen, los zu laufen, laufe auch. Nicht lange denken, machen. Gleiches gilt, wenn für das Stehen bleiben.
Jedenfalls bin ich damit in China gut gefahren äh.. gelaufen. :-)

Donnerstag, 3. Mai 2012

Taxifahrt und Laufen in Shanghai

Wer reist, der erlebt immer was. So ich auch heute bei einer Taxifahrt in Schanghai, von der Endstation der Maglev (=Transrapid) zum Hotel.

Wie immer habe ich ein Taxi genommen. Für alle, die noch nie in China waren: Taxifahren ist hier ok. Fast alle Taxis sind in einem guten Zustand, als keine klapprigen alten Karren (was z.B. in Indien schon mal der Fall sein kann). Na ja, jedenfalls steige ich in ein handelsübliches Taxi ein, mache dem Fahrer klar, wo ich hin will und er fährt los.

Die Fahrt war soweit auch ok, nur dass der Fahrer nach ein paar Kilometern Fahrt drei oder vier Mal den Motor abgewürgt hat (hörte und fühlte sich zumindest so an). Bis dann beim vierten Mal das Auto partout nicht mehr anspringen wollte. Der Taxifahrer hatte dann zwar wie wild am Schaltknüppel rumgerudert und immer wieder probiert zu starten - das passierte aber gar nichts.

Glücklicherweise war die Stelle, wo wir liegen geblieben waren, aber nur ca. 100 m vom Hotel entfernt. Also bin ich den Rest gelaufen. Immerhin war es dem Fahrer sichtlich peinlich, dass das Auto schlapp gemacht hat. Aber so ist das nun mal. Besser so was passiert Mitten in der Stadt als irgendwo auf dem Land...

Montag, 23. April 2012

Rhytmbox in Precise und die Enttäuschung

Ich fange mal damit an, mich selbst zu zitieren:

> Als Mediaplayer ist Rhythmbox wieder zurück, was ich persönlich gut finden, weil Rhythmbox mir besser gefällt als Banshee. 
(Quelle)

Nun, ich muss das korrigieren: Ich bin von Rhythmbox in Precise enttäuscht und habe mir dann doch Banshee wieder nachinstalliert.

Gut, als Player an sich funtkioniert Rythmbox natürlich einwandfrei - aber das ist ja auch keine Kunst. Es gibt drei Sachen, die mich wirklich stören, wovon die dritte aber nicht so schlimm ist:

1) iPod läßt sich nicht mit Musik beladen: Mein iPod Nano 3rd Generation (also schon ein paar Jahre alt) läßt sich nicht mit Musik beladen. Das hat bisher, also bis Oneiric, ohne Probleme per Drag'n'Drop funktioniert. Unter Precise nicht. Lustigerweise funktioniert das ganze auf dem gleichen Rechner im gleichen Ubuntu (also mit den gleichen Bibliotheken) aus Banshee heraus nach wie vor ohne Probleme.

2) CDs rippen: Gestern habe ich eine gekaufte CD gerippt, ins MP3-Format. Mal abgesehen davon, dass es lange gedauert hat, ware die Kopie falsch. Falsch im Sinne von, dass die MP3s viel zu lang waren! D.h. das z.B. ein 6 Minuten Lied auf der CD als MP3 23 Minuten oder so hatte, halt mit Leerraum am Ende. Sehr seltsame Sache... Aber wieder: gleicher Rechner, gleiches System mit Banshee - funktioniert ohne Probleme.
Edit 24.4.2012: Von einem Leser habe ich den Hinweis erhalten, dass das Problem mit der falschen Liedlänge daran liegen könnte, dass Rhytmbox mit variabler Bitrate (VBR) rippt und dann bei Analysieren der MP3-Datei die Länge falsch berechnet. Könnte sein, nur leider ist unter Precise auch die Schaltfläche für die Einstellungen des MP3-Rippers deaktiviert, so dass hier keinerlei Änderungen möglich sind. Abgesehen davon funktioniert VBR unter Precise plus Banshee einwandfrei und auch ältere MP3s, welche auf anderen System erstellt wurden, auch einwandfrei.

3) Der dritte Punkt ist das nach wie vor fehlende Amazon Plugin für Rhythmbox. Banshee hat's nach wie vor an Bord. Aber, wie gesagt, Punkt 1 und 2 sind schwerwiegender.

Ich will damit nicht sagen, dass Banshee der bessere Player ist. Aber: so wie Rhythmbox in Precise funktioniert ist es für mich nicht wirklich akzeptabel und brauchbar. Vielleicht wird das ganze in den kommenden Wochen per Update noch nachgebessert - was ich persönlich aber (leider) bezweifle.

Dienstag, 13. März 2012

Erster Kontakt: Ubuntu 12.04 und ich

Am Wochenende habe ich auf eine freie Partition auf meinem Lenovo T410 Laptop Ubuntu 12.04 LTS Precise Beta 1 installiert. Normalerweise schaue ich auf neue Ubuntu-Releases erst ab dem Beta 2 (früher Release Candidate). Da aber diverse Blogeinträge dem Beta 1 (und auch schon dem Alpha 2) eine brauchbare Nutzbarkeit und Stabilität bestätigt haben, habe ich es auch mal installiert. Im folgenden nun mein erster Eindruck nach ca. 1h Nutzung.

Und der erste Eindruck ist: unspektakulär. Im positiven Sinne. Wer mit Ubuntu 11.10 Oneiric klar kommt, der sollte auch mit Precise klar kommen. Jedenfalls habe ich (noch?) keine gravierenden Änderungen gefunden. Ein neuer Punkt ist, dass man unter "Systemeinstellungen -> Privacy" einstellen kann, welche Aktivitäten Zeitgeist verfolgen soll - oder eben nicht. Zu HUD kann ich noch nichts sagen, weil habe ich noch nicht mit rumgespielt.

Firefox ist in der aktuellsten Version 11.0 an Bord. Als Mediaplayer ist Rhythmbox wieder zurück, was ich persönlich gut finden, weil Rhythmbox mir besser gefällt als Banshee. Angeblich soll auch noch die Amazon-Integration in den Mediaplayer kommen, im aktuellen Beta 1 konnte ich aber bis jetzt kein passendes Plugin finden... Gut, kommt vielleicht (hoffentlich) noch.

Gimp ist im Beta 1 auch wieder drin. Da das Beta 1 auch nicht mehr auf eine CD passt, sondern eine DVD benötigt (Größe des Images ca. 1,5 GB) musste Canonical wohl nicht am Platz sparen... ;-)

Auf dem besagten Lenovo T410 mit Intel Chipsatz und Intel GraKa funktioniert der Ruhezustand out-of-the-box, was aber auch schon bei älteren Ubuntu-Versionen der Fall war. Was nur halb funktioniert ist das koppeln eines Nokia C06 via Bluetooth. Das Koppeln an sich klappt zwar und man kann Daten von Rechner ans Handy senden, aber nicht umgekehrt bzw. der Laptop kann nicht aufs Handy zugreifen. Hier sei aber gesagt, dass (leider) Lucid die letzte Ubuntu-Version war, wo dies bei mir einwandfrei geklappt hat.

Was noch geändert ist, ist, dass beim Öffnen des Dash keinerlei Anwendungen mehr angezeigt werden. Es wird also nicht mehr, wie noch unter Oneiric, die Menüstruktur der Gnome-Menüs nachgestellt. Ob das jetzt wirklich schlau ist weiß ich noch nicht. Gut, für Anwender mit Erfahrung kein Problem, die Wissen, was auf dem System ist. Für komplette Neueinsteiger, die keine Ahnung von Ubuntu und den installierten Programmen haben, mag das aber verwirrend sein. Tipp: Wenn man nur "a" als Suchbegriff eingibt erscheinen alle Anwendungen.

Erstes Fazit: Ubuntu 12.04 Precise ist eine solide Weiterentwicklung der Linux-Distribution, ohne offensichtliche Highlights und auch ohne offensichtliche Schwächen. Das Beta 1 läuft gut und kann (in meinen Augen) zumindest privat oder als Zweitsystem ohne Probleme jetzt schon genutzt werden.


Montag, 12. März 2012

Windows, Trojaner, Linux und was man wirklich braucht

Es ist passiert.

Ich nutze Windows seit Win95, also seit ca. 17 Jahren. In den letzten Jahren privat zwar kaum noch, aber weder beruflich noch privat hatte ich je ernste Probleme damit.

Seit vorgestern ist das anders, weil sich beim Surfen via Firefox 10.x unter WinXP ein Trojaner auf mein System geschlichen hat. Der AVG Virenscanner erkennt diesen als "generic27.pn". Nur kann der AVG Scanner den Schädling nicht entfernen, weil der wohl tief im System sitzt und auch noch ein Rootkit mitbringt, was im Bootrecord der Win-Installation sitzt (im MBR der Platte sitzt Grub 2).

Ein bisschen Recherche im Internet hat ergeben, dass der Schädling wohl a) relativ neu ist und b) gerne System angreift, die eine ältere Javaversion haben (Hinweis: Angabe ohne Gewähr - das stand in einem Forum drin...). Nun ist meine Java-Version unter Win nicht wirklich alt im Sinne von "Jahre", aber es kann durchaus sein, dass diese seit sechs Monaten oder mehr nicht mehr aktualisiert wurde.

Was mich dann wieder an einen der Hauptgründe erinnert hat, warum ich Linux nutze: die (automatische) Paketverwaltung. Das alle Pakete systemweit (automatisch) aktualisiert werden ist in meinen Augen ein immenser Vorteil. Gerade für Gelegenheitsnutzer und Einsteiger. Bzw. generell für jeden, der nicht laufend manuelle Update-Origien aller Programme anstoßen möchte. Schnell ist da mal was vergessen, siehe oben.

Zurück zum Trojaner und Windows: Das Entfernen des Schädlings ich wohl nicht trivial. Sonst würde der Virenscanner das auch alleine schaffen. Die Meinung gehen hier je nach Forum ein wenig auseinander. Die eine Anleitung ist ein größerer Eingriff inkl. neu schreiben des Bootrecords von Windows, anderen "Anleitungen" sagen direkt: Neuinstallation.

Ehrlich gesagt: eigentlich habe ich auf beides keine Lust...Als Linux (Ubuntu) Nutzer bin ich es gewöhnt, dass Dinge einfach funktionieren ;-) Von daher habe ich mir dann mal die Frage gestellt, ob ich Windows überhaupt noch brauche...

Wie weiter oben bereits erwähnt, nutze ich Win so wie so wenig. Die Gründe sind:
  • Steuererklärung mit Elster
  • Beladen des Garmin GPS mit Geocaching Daten
  • Datensicherung Nokia Handy
  • Aktualisierung TomTom Navi
  • Lernsoftware von / für die Grundschule für das größere Kind
Gehen wir die Punkte mal durch:

Ersteres geht soweit ich weiß über Wine, jedenfalls gibt es im Wiki von ubuntuusers.de einen Artikel dazu.

Zweiteres ginge auch unter Linux über einen Zwischenschritt. Ist mit dem Garmin Communicator Plugin unter Win halt nur etwas komfortabler. Kann man aber auf jeden Fall ohne weiteres mit Leben.

Die Datensicherung geht zwar prinzipiell auch über eine Synchronisation mit einem MS Exchange-Server. Das ist aber nicht das gleich. Wobei ich vermute, dass es auch unter Linux eine Lösung gibt. Muss ich mal ein wenig suchen.

Die Aktualisierung des TomToms geht soweit ich weiß nur via Windows, da die aktuelle Lösung relativ tief ins System eingebunden ist.

Letzter Punkt Lernsoftware: Tja... könnte unter Wine laufen, müsste man aber von Fall zu Fall testen. Und wäre halt doof, wenn was nicht läuft... Mit Lernsoftware ist hier übrigens gemeint, was die Kinder von der Schule bekommen bzw. den Schulbüchern beiliegt. Nicht freie Lernsoftware wie z.B. die Edubuntu Programme.

Was ich mache, weiß ich aktuell noch nicht... Vielleicht doch ein Windows, was nur für die paar Sachen genutzt wird, die unter Linux nicht ohne weiteres gehen (Lernsoftware, TomTom)?

Was aber auf jeden Fall klar ist: Nutze Linux (in meinem Fall Ubuntu), wo immer es geht. Dann braucht man sich auch keine Gedanken über so blöde Trojaner und die Reparatur des Systems machen.

Dienstag, 6. März 2012

Autofahren abgeschaut in anderen Ländern - Indien

Wenn man im Ausland unterwegs ist sieht man viele Dinge, die anders sind als bei uns (in Deutschland). Mal besser, mal schlechter. Aber man kann sich natürlich auch Anregungen holen, um Sachen dann zu Hause zu optimieren.

Diverse Fahrten mit Autos in Indien haben zwei Punkte deutlich aufgezeigt, die wir in Deutschland auch in die Straßenverkehrsordnung aufnehmen sollten.

1) Nutze extensive die Hupe und Lichthupe! Innerorts tendenziell mehr als außerorts.
Gut, ist nach aktueller Rechtslage in Deutschland in vielen Fällen Nötigung. Aber es macht doch vieles so viel besser! Der vor einem fahrende weiß, dass man von hinten kommt und schneller ist. Und vorbei will (rechts oder links, geht zumindest in Indien beides). Besonders die Kombination aus Lichthupe und Hupe ist ein opto-akustisches Warnsignal, was kaum zu ignorieren ist.
Ansonsten sollte man so wie so die Hupe viel öfter benutzen, z.B. wenn man abbiegen will und dem Fahrzeug auf der Vorfahrsstraße so mitteilt, dass man jetzt rein zieht. Vorfahrt hin oder her.

2) Nutze die volle Breite der Straße!
Weiße Striche auf der Straße sind ja ganz nett, der sonst eintönig grau-schwarze Asphalt wird dadurch aufgehübscht. Aber dazwischen Fahren ist eine unnötige Beschränkungen. Wenn vier Autos auf zwei Spuren nebeneinander passen, dann sollte man das auch machen. Die Breite der Straße wird so maximal ausgenutzt. Oder, falls sich doch mal ein Stau ergeben sollte, dann wird dieser automatisch kürzer, weil ja mehr Autos nebeneinander stehen können.
Übrigens: Um die maximale Autodichte zu erhalten ist es weiterhin sehr sinnvoll, die Außenspiegel einzuklappen oder direkt ganz zu entfernen. So kann man noch näher an das Auto neben einem heran.

So weit, so gut. Arbeiten wir an der Umsetzung.

Sonntag, 22. Januar 2012

Die Untiefen des QIntValidators...

... oder auch: Wenn der Computer weiter denkt als der Mensch.

Für den Beitrag hier im Blog To GUI or not to GUI hat ich für das Qt4 / PySide eigentlich eine andere, kürzere Variante im Kopf.  Dabei sollte der try... except... Block wegfallen, weil für das Eingabefeld ein QIntValidator zum Einsatz kommen sollte. Dieser prüft, wie der Name schon vermuten lässt, ob eine Eingabe eine ganze Zahl ist bzw. Unterdrückt direkt die Eingabe von Buchstaben, Zeichen etc.

So weit, so gut. Hat aber nicht so funktioniert, wie ich dachte. Das zeigt auch das folgende, kleine Beispielprogramm:

#!/usr/bin/env python
# ~*~ coding: utf-8 ~*~

import sys

from PySide import QtGui

class MyClass(QtGui.QDialog):
    def __init__(self,parent=None):
        super(MyClass, self).__init__(parent)
        self.setWindowTitle('QIntValidator Test')
        layout = QtGui.QVBoxLayout()
        self.eingabe = QtGui.QLineEdit()
        self.eingabe_valid = QtGui.QIntValidator(0,1000,self)
        self.eingabe.setValidator(self.eingabe_valid)
        layout.addWidget(self.eingabe)
        self.button = QtGui.QPushButton(u'Echo')
        layout.addWidget(self.button)
        self.label = QtGui.QLabel(u'Echo...')
        layout.addWidget(self.label)
        self.setLayout(layout)
        self.button.clicked.connect(self.echo)

    def echo(self):
        wert = int(self.eingabe.text())
        return self.label.setText(unicode(wert))

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    my_class = MyClass()
    my_class.show()
    sys.exit(app.exec_())

Dieses gibt einfach die Eingabe (welches eine ganze Zahl sein muss) wieder. Wird nun aber z.B. "1.1" oder "1,1" eingegeben, so wird - zumindest auf meinem System (Ubuntu 11.10 mit deutscher Spracheinstellung) - "11" zurück geliefert. Punkt bzw. Komma werden also entfernt.

Leicht verwirrt habe ich dann im deutschen Python-Forum nach Rat gefragt und der Nutzer "lunar" wusste auch, warum dieses Verhalten so ist. Die Langversion kann man im verlinkten Thread nachlesen, die Kurzfassung ist: Aufgrund der Spracheinstellung werden Punkt und Komma als gültige 1000er-Trennzeichen akzeptiert. Tauchen diese aber an der falschen Stelle auf (wie z.B. bei 1.1), dann wird es einfach ignoriert bzw. entfernt. Ergo: It's not a bug, it's a feature! Da muss man aber erst Mal drauf kommen... (zu Mal es in der PySide Doku nur sehr kurz erwähnt ist).

Wer einen "echten" Validator braucht, welcher wirklich nur die Ziffern von 0 bis 9 als Eingabe akzeptiert, der findet im oben genannten Thread direkt auch noch die passende Lösung, ebenfalls vom Nutzer lunar.

Mittwoch, 18. Januar 2012

To GUI or not to GUI...

Schaut man in den Programmierforen nach, so kommt von Einsteiger öfters die Frage: "Ich möchte mein erstes Programm schreiben, das auch eine GUI haben soll.". Eine oft gehörte Antwort ist dann: "Programmier' erst Mal ohne GUI".

Das mag befremdlichen klingen, da seit vielen Jahren eine grafische Benutzeroberfläche absoluter Standard ist. Warum soll man also nun für das (erste) eigene Programm darauf verzichten? Diese Frage wird im folgenden ein wenig beleuchtet.

Dazu gibt es folgende kleine Aufgabe: Es soll ein Programm geschrieben werden, welches eine ganze Zahl als Eingabe nimmt und das Quadrat dieser Zahl als Ausgabe zurück liefert. Um das Programm einfach zu halten und den Fokus auf "To GUI or not to GUI" zu legen, soll das Programm lediglich prüfen, ob die Eingabe eine ganze Zahl ist. Wenn nicht soll eine Fehlermeldung ausgegeben werden. Weiterhin enthalten die Quelltexte keinerlei Kommentare.

Als Programmiersprache kommt Python zum Einsatz, wobei sich die Beispiele  sicherlich auch recht einfach auf andere Sprachen übertragen lassen.

Zurück zu "Programmier' erst Mal ohne GUI": Selbst Linux-Nutzer, welchen die Kommandozeile tendenziell geläufiger ist als z.B. Windows-Nutzer, erscheint es vielleicht doch ein wenig antiquiert "nur Text" zu Arbeiten. Der Grund für den Rat hierzu ist aber recht simpel: Selbst eine minimale GUI (wie im folgenden zu sehen) verlangt einiges mehr an Codezeilen. Plus, und das ist der wichtigere Punkt, die Einarbeitung in eine entsprechende Bibliothek mit entsprechend umfangreicher Dokumentation kann zeitaufwendig sein. Das heißt, dass der geneigte Programmieranfänger nicht nur die Grundlagen einer für ihn neuen Programmiersprache lernen soll, sondern auch direkt die Nutzung der GUI-Bibliothek - was die Sache definitiv nicht einfacher macht. Außerdem wäre es ja auch Schade, wenn er frustriert aufgibt, weil er (als Anfänger) nicht mit der GUI-Programmierung zurecht kommt.

Bevor wir zu den verschiedenen Versionen des Programms kommen noch eine Anmerkung vorab: Vor den Listings ist immer die Anzahl der Codezeilen angegeben. Die beinhalten nicht den Shebang und die Coding-Info (welche bei allen Listings so wie so gleich ist), weiterhin werden Leerzeilen nicht mit gezählt. Codezeilen, welche Zeilenumbrüche zur Verbesserung der Lesbarkeit enthalten, werden ebenfalls als eine Zeile gezählt.

Alle Programm sind unter Ubuntu 11.10 Oneiric getestet, die verwendete Python-Version bzw. GUI-Bibliotheken und Python-Anbindungen stammen alle aus den offiziellen Paketquellen.

Der erste Kandidat ist ein reines Kommandozeilen-Programm. Dieses erwartet, dass die zu quadrierende Zahl als Argument beim Programmaufruf mit übergeben wird. Heißt das Programm z.B. "quadrat.py", so lautet der Aufruf:

python quadrat.py 12

Hier das Programm für die Kommandozeile, 12 Zeilen:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys

if len(sys.argv) < 2:
    print 'Es wurde kein Wert vorgegeben!'
    sys.exit()

eingabe = sys.argv[1]
try:
    zahl = int(eingabe)
except ValueError:
    print 'Der Wert ist keine ganze Zahl!'
    sys.exit()
else:
    print zahl * zahl


Update 21.1.2012:
Das obige Beispiel läuft zu ziemlich unter allen Python-Version, selbst unter sehr alten. Wer Python 2.7  bzw. 3.2 und neuer nutzt, der kann den Code noch kürzer gestalten, und zwar unter Verwendung des argparse-Moduls:

Kommandozeile mit argparse, 5 Zeilen:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import argparse

parser = argparse.ArgumentParser('Programm zum Quadrieren von Integerzahlen.')
parser.add_argument('value', type=int)
args = parser.parse_args()
print args.value * args.value


Danke an Hyperion für den Hinweis hierzu in deutschen Python-Forum!


Nun ist der Vergleich eines reinen Kommandozeilen-Programms vielleicht nicht ganz fair, weil dieses für jede Rechnung erneut aufgerufen werden muss. Die Programme mit grafischer Oberfläche müssen nur ein Mal gestartet werden, dann können beliebig viele Rechnungen durchgeführt werden.

Doch auch auf der Kommandozeile gibt es dafür ein pythonische Lösung, das cmd-Modul. Eine Einführung in dieses Modul ist im Blogeintrag cmd - Python-Modul für text-basierte Programme hier bei mir im Blog zu finden.

Die Umsetzung sieht dann so aus:

cmd-Modul, 14 Zeilen:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import cmd

class SimpleCmd(cmd.Cmd):
      
    def do_quadrat(self, line):
        try:
            zahl = int(line)
        except ValueError:
            print 'Der eingegebene Wert ist keine ganze Zahl!'
        else:
            print zahl*zahl

    def do_EOF(self, line):
            print 'Programm beenden...'
            return True

simplecmd=SimpleCmd()
simplecmd.cmdloop()

Kommen wir zu den GUI-Bibliotheken. Betrachtet werden hier die beiden wohl populärsten Frameworks, nämlich Qt4 und GTK+. Erster wird dabei über PySide genutzt, letzter über das PyGObject.
Pyside + Qt4, 27 Zeilen:

#!/usr/bin/env python
# ~*~ coding: utf-8 ~*~

import sys
from PySide import QtGui

class SimpleQt(QtGui.QDialog):
    def __init__(self,parent=None):
        super(SimpelQt, self).__init__(parent)
        self.setWindowTitle('Qt4')
        layout = QtGui.QVBoxLayout()
        self.eingabe = QtGui.QLineEdit()
        layout.addWidget(self.eingabe)
        self.button = QtGui.QPushButton(u'Quadrieren')
        layout.addWidget(self.button)
        self.label = QtGui.QLabel(u'Ergebnis...')
        layout.addWidget(self.label)
        self.setLayout(layout)
        self.button.clicked.connect(self.rechnen)

    def rechnen(self):
        wert = self.eingabe.text()
        try:
            zahl = int(wert)
        except ValueError:
            msgBox = QtGui.QMessageBox()
            msgBox.setText(u'Der eingegebene Wert ist keine ganze Zahl')
            msgBox.exec_()
        else:
            self.label.setText(unicode(zahl*zahl))

app=QtGui.QApplication(sys.argv)
simple_qt=SimpleQt()
simple_qt.show()
sys.exit(app.exec_())

Und hier noch die Version mit grafischer Oberfläche, welche auf GTK+ setzt:

PyGObject + GTK+, 29 Zeilen:

#!/usr/bin/python
# -*- coding: utf-8 -*-
 
from gi.repository import Gtk
 
class SimpelGtk(object): 
    def Gtk.Window.__init__(self, title='Simpel Gtk+')
        self.window.set_default_size(200, 100)
        vbox = Gtk.Box(False, 20)
        vbox.orientation = Gtk.Orientation.VERTICAL
        self.window.add(vbox)
        self.eingabe = Gtk.Entry()
        vbox.pack_start(self.eingabe,True,True,0)
        button = Gtk.Button("Quadrieren")
        button.connect("clicked", self.rechnen)
        vbox.pack_start(self.button,True,True,0)    
        self.label = Gtk.Label("Ergebnis...")
        vbox.pack_start(self.label,True,True,0)
        
    def rechnen(self,data=None):
        try:
            wert = int(self.eingabe.get_text())
        except ValueError:
            text = 'Die Eingabe ist keine ganze Zahl!'
            dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.ERROR,
            Gtk.ButtonsType.CANCEL, 'Fehler bei der Eingabe')
            dialog.format_secondary_text(
                'Der eingegebene Wert ist keine ganze Zahl!')
            dialog.run()
        else:
            self.label.set_text(str(wert*wert))

    def main(self):
        win = Gtk.Window()
        win.connect("delete-event", Gtk.main_quit)
        win.show_all()
        Gtk.main()
 
if __name__ == "__main__":
    e = SimpelGtk()
    e.main()
    
#http://python-Gtk-3-tutorial.readthedocs.org/en/latest/introduction.html

Wie zu sehen ist, sind die GUI-basierten Varianten deutlich länger, nämlich rund 2,5x länger als die Kommandozeile-Version und circa 2x so lange wie die Version, welche das cmd-Modul nutzt. Das mehr an Codezeilen ist dabei natürlich durch das Hinzufügen der GUI-Elemente bedingt. Weiterhin ist der Quelltext für Anfänger (wahrscheinlich) deutlich schwieriger nach zu vollziehen.

Nur damit keine Missverständnisse entstehen: Dies ist kein Plädoyer gegen Programme mit GUI. Überhaupt nicht. Es soll lediglich gezeigt werden, wodurch der oft gehört und gut gemeinte Rat "Programmier' erst Mal ohne GUI" motiviert ist.

Abgesehen davon: beherrscht man die Grundlagen einer Progammiersprache ist es oft deutlich einfacher, die APIs weiterer Bibliotheken wie z.B. den zur GUI-Erstellung, nachzuvollziehen.