GTK-Qt Theme

Nach einem Gnome-Update auf 2.12 an einem SuSE Linux 10.1 Rechner mit primären KDE Desktop ging der Look der GTK Programme wieder baden (Firefox,Thunderbird,Adobe Reader usw..)

Auf der Konsole wurde das Problem schnell lokalisiert:

 Gtk-WARNING **: Unable to locate theme engine in module_path: "qtengine"

Das Problem kam offenkundig von der qtk-qt Theme Engine. Mit Hilfe dieses Programms kann das KDE Kontrollcenter das aktuelle Theme/Style des KDE Desktops für GTK mit Hilfe der dynamisch erzeugten Datei:

~/.gtk_qt_engine_rc

erzeugen. Leider ist diese Paket auf den SuSE Repositories nicht mehr auf dem aktuellen Stand. Das Projekt selber ist auf diese Seite umgezogen. Dort schreiben die Maintainer, das die aktuellen Versionen (>0.6) nur noch im SourceCode erhältlich sind. Also hab ich das SuSE rpm Paket (qtk-qt….) deinstalliert, das tarball (Version 0.8) gezogen und mit der auf der Webseite stehenden Anleitung installiert (cmake muss installiert sein). Nach einem SuSEconfig erscheint der Menüpunkt „GTK-Stile und Schriftarten“ wieder im Bereich „Erscheinungsbild“ im KDE Kontrollcenter – dort nochmals den Punkt „Use my KDE Style in GTK Applications“ angewählt und schon wieder sehen alle GTK Anwendungen bestens aus.

CalDAV

eMail gehört schon seit langem zu den selbstverständlichsten Dingen auf jedem Computer. Daneben wird aber ein zentraler Kalender immer mehr ebenso zu einer Selbstverständlichkeit, welche in der Implementierung im Netzwerk aber wesentlich problematischer ist.

Denn im Gegensatz zu den eMail Standards wie POP3/IMAP4 gab es bei der Kalenderverwaltung lange Zeit keinen (Industrie)Standard. Dies nutzte in erster Linie dem Platzhirschen Microsoft mit seiner Groupwarelösung Exchange Server / Outlook Client.

Tatsächlich ist das Produkt aber für viele Netzwerke ein Overkill, kostet doch etwas Geld und ist Clientseitig nur gut auf Windows nutzbar – äusserst dumm für ein UNIX zentriertes Netzwerk.

Seit März 2007 scheint gibt es aber für diesen Fall einen absoluten Exchange Killer

CalDAV / RFC 4791

Um was geht es dort:

  • CalDAV operiert aussschliesslich mit Daten im iCalendar Format (ics)
  • Im Gegensatz zum simplen ics over HTTP, kann CalDAV den Zugriff auf die Kalenderresourcen limitieren und greift molekular auf alle einzelnen Einträge in einem iCalendar zu
  • Diese Technik wird als Erweiterung von WebDAV implementiert.

Somit steht CalDAV in bester UNIX Tradition – keep it simple. Endlich lassen sich auf UNIX (aber auch Windows) Plattformen Kalenderinformationen beliebig austauschen und verwalten. Was folgt ist noch eine Auflistung der möglichen Clients und Server:

CalDAV Clients:
  • Mozilla Sunbird / Lightning (Thunderbird plugin)
  • iCal (ab Mac OS X 10.5)
  • Novell Evolution
  • KDE Kontact (wahrscheinlich ab KDE 4.1 )
CalDav Servers:

Qt Programme als Universal Binaries erstellen

Natürlich ist es kein Problem auch Qt Programme als UB’s (Universal Binaries) zu erstellen. Allerdings ist es unter Qt 4.x wesentlich einfacher als unter Qt 3.x, weswegen ich die Vorgehensweise kurz getrennt darstelle

UB’s mit Qt 3.3

Rein theoretisch kann man auch hier beide Zielplattformen (ppc und i386) auf einer Maschine erstellen, was aber zusätzlichen Aufwand erfordert. Einfacher ist es binaries für die beiden Plattformen auf einer passenden Maschine zu erstellen und später zusammenzufügen. die 64bit Targets (ppc64 bzw. x86_64) spielen hier übrigens keine Rolle, da Mac OS X 10.4 sowieso keine 64bit GUI Programme unterstützt.

Das Hauptproblem bei Qt 3.3 ist, dass die Qt Library selber nicht als UB vorliegt oder out-of-the-box erstellt wreden kann. Daher muss man auf jeder Zielplattform diese Library erstellen.

Danach erstellt man sein Programm und/oder seine Libraries/Frameworks auf jeder Maschine. Am Schluss legt man auf jeder Maschine ein Build-Verzeichnis i386 und ppc an, kopiert die Binaries rein und führt Sie mit dem lipo Befehl zusammen, bspw:

lipo -create  build/i386/test build/ppc/test -output test.app/Contents/MacOS/test

mit dem file Kommando sieht man, dass das neue test Binary nun 2 Plattformen unterstützt:

file  test.app/Contents/MacOS/test

test.app/Contents/MacOS/test: Mach-O universal binary with 2 architectures

test.app/Contents/MacOS/test (for architecture i386): Mach-O executable i386
test.app/Contents/MacOS/test (for architecture ppc): Mach-O executable ppc

UB’s mit Qt 4.x

Hier ist das Sache wesentlich einfacher. Wenn man das Toolkit mit dem -universal Flag übersetzt hat man ein UB fähiges Qt Framework. In seinem .pro File muss man dann nur noch

QMAKE_MAC_SDK=/path/to/MacOSX10.4u.sdk
CONFIG+=x86 ppc

angeben um ein fertiges Binary zu erzeugen. Im Hintergrund schleusst Qt einfach die -arch Flags an den g++ Compiler weiter.

weitere Hinweise:

gfortran unterstützt in der eigentlichen Fassung diese -arch Flags noch nicht. Hier gibt es allerdings einen weiteren experimentellen Fork der das schon kann:

http://r.research.att.com/tools/

Um die Qt Bibliothek mit dem eigenen Programm auszuliefern muss der install_name (Linux: soname) geändert werden, dies ist hier am Bsp. von Qt 3.3 dargestellt:

..für die Qt Library selber

 install_name_tool id @executable_path/../Frameworks/libqt.3.dylib 
demo.app/Contents/Frameworks/libqt.3.dylib

und für das Programm:

install_name_tool -change libqt.3.dylib 
@executable_path/../Frameworks/libqt.3.dylib 
test.app/Contents/MacOS/test

Multiuser Umgebung und subversion

Multisuser Umgebungen sind nun in der UNIX Welt Sachen aus einer Zeit in der ich geboren wurde – dennoch ist bis zum heutigen Tag die Sache nicht ganz unproblematisch.

Subversion (svn) – Multiuseraccess auf Repository und Working Directory

Das Repository kann auf 4 Arten angesprochen werden:

  1. svn client auf regulärem (lokalen) Filesystem
  2. ssh-spawned svnserve Prozess
  3. svnserve Prozess
  4. Apache HTTP Prozess

Methode 1+2 laufen mit normeln Benutzerkennungen auf den Maschinen. Daher macht es Sinn für jedes Repository eine Gruppe zu definieren, welche Schreibberechtigung hat.
Wenn man eine normale POSIX Rechtestruktur zugrundelegt (keine ACL’s), dann müssen folgende Schritte ausgeführt werden.

1. Dem angelegten Repository Verzeichnis – meist auf dem svn Server unter /var/svn – müssen rekursiv alle Gruppenrechte (-bits) gegeben werden.

chmod -R g+rw /var/svn/<REPOSITORY>

2. Das sgid bit muss für dieses Respository etabliert werden, da die Benutzer unterschiedliche primäre Gruppen haben können.

chmod -R g+s /var/svn/<REPOSITORY>

3. Die umask muss auf dem subversion Server so eingestellt sein, dass die Gruppe immer Schreibrecht hat, bspw:

umask 0002

Damit funktionieren die beiden ersten Zugriffsmethoden. Die dritte und vierte Methode (HTTP) führt die Operationen immer mit der Benutzerkennung des Dämonenprozesses durch. Der Benutzer muss sich an diesem Prozess authentifizieren – seine Kennung wird innerhalb der svn Files mitdurchgeschleust (svn blame zeigt damit immer den richtigen Author an).

Somit erfordern diese Zugriffsarten nochmals Anpassungen

4. Die Ownership des Repositories wird auf den Owner der HTTP/svnserver Dämonen angepasst. Dieser Benutzer muss allerdings auch Mitglied der Gruppe sein, die Schreibzugriff auf das Repository hat.

5. Bei HTTP muss man ev. die Benutzerkennung des Prozesses anpassen (siehe 4.). Falls mehrere HTTP Dienste laufen, weicht man auf einen virtuellen Host aus, der auf einem gesonderten Port läuft.

6. Die Dämonen müssen ebenfalls die unter 3. genannte umask respektieren – oder Sie muss angepasst werden durch ändern der AP_SUEXEC_UMASK Variable

Das war’s auf Repository Seite – ich bin der Meinung, die Einschränkungen pro Repository sollten reichen, falls aber eine noch filigranere Abstufung der Rechte (händisches ACL) gewünscht ist, muss man die Path-Based Authorizations in svnserve.conf benutzen.

Diese greifen beim Zugriff mit den Methoden 1-3 automatisch wenn auch kostspielig was die Performance betrifft.

Für den HTTP Zugriff muss serverseitig das Modul mod_authz_svn geladen und in der Konfiguration AuthzSVNAccessFile eingetragen werden.

Beim Zugriff auf das Working Directory wird’s undefinierter

Eigentlicht ist das working directory eher pro user gedacht auch wenn dies nie explizit erwähnt wird.

In einem Working Directory auf einem POSIX (UNIX) Rechner macht der svn client folgendes:

  • Die Struktur im .svn Unterverzeichnis (zeigt den Zustand des working directories an) wird unabhängig von der umask angelegt, d.h. zentrale Dateien habe immer nur ein Leseflag.
  • Wenn die Rechtestruktur im working directory ebenfalls so angelegt ist, dass Mitglieder einer Gruppe immer Schreiben können, sollte es zum Konflikt kommen wenn Dateien im .svn Verzeichnis geändert werden….
  • … denn bei einem svn commit wechselt die Ownership einiger Dateien im .svn Verzeichnis auf denjeniegen der diese Operation durchgefüht hat. Der svn UNIX client macht folgendes:
  1. betreffende Datei kopieren (..tmp)
  2. diese Datei dann beschreiben.
  3. die zu ersetzende Datei löschen
  4. die temporäre Datei wieder zurückzukopieren (mv Operation)

All diese Punkte erfordern nur die Schreibberechtigung auf dem .svn Verzeichnis

Schwieriger wird’s bei einem Windows svn client (Tortoise oder Kommandotool)

die oben genannten 4 Punkte greifen nicht, denn unter Windows haben wir statt dem einfachen POSIX Rechtemodell die Windows ACL’s.

Daher muss gewährleistet sein, dass alle Benutzer der zugreifenden Gruppe die ACL’s

  1. Take Ownership
  2. Change Permissions

gesetzt haben – Schreibberechtigung sowieso vorrausgesetzt.

Dann geht es auch hier – dieses Verfahren hat aber seine Grenzen wenn das working directory auf einem SAMBA Server liegt, der nur einfache POSIX Rechte auf Windows ACL’s mappt und somit diese beiden ACL Flags nicht setzen kann.

Hier könnte höchstens noch ein Samba Server mit aktivierten ACL’s helfen. Allerdings wäre die Kompatibilität zwischen Windows – POSIX und NFS4 ACL’s zu testen. Eventuell werden die neuen NFS4 ACL’s der neue POSIX Standard, was wegen der besseren Kompatibilität zu den Windows ACL’s zu begrüßen wäre.

Java 1.6 Desktop-Performance

Tatsächlich wollte ein typisches Desktop Programm unter Linux das neueste Java 1.6 haben. Hab von SUN das JRE rpm package gezogen und installiert.

Zum ersten mal was das Feeling eines fetten Desktop Programmes analog zu einer nativen Anwendung. Alle Aktionen auf das User-Interface reagierten prompt ohne Verzögerung. Wäre schön wenn Java sich in diesen Performanceregionen etablieren könnte.

Die Schriften sehen jetzt auch einwandfrei aus – ein GTK Feeling kann ich allerdings noch nicht erkennen

Adobe Reader und Kommentare

Der kostenlos erhältliche Adobe Reader hat ja bekanntermassen eine Funktion zum Kommentieren. Zumindest gerüchtemäßig hiess es immer, dass diese Funktion nur für .pdf’s die auf Webservern liegen funktioniert. Tatsache ist aber, dass die Kommentarfunktion zumindest seit PDF Version 1.6 (Adobe Reader/Acrobat 7), einfach beim erstellen aktiviert werden kann. OpenOffice kann leider (noch) keine Version 1.6 pdf’s erstellen, hier ist aber ein Link auf eine pdf die mit QuarkXpress erzeugt wurde. Nach dem Herunterladen kann man munter kommentieren.
http://www.novell.com/collateral/4641022/4641022.pdf

(externe) iSight Kamera unter Linux (SuSE 10.1)

Bereits nach dem Einstecken in den FireWire Port ist die Kamera rudimentär erkannt. Im Linux Treiberbereich wurde ein zeichenorientiertes Device angelegt:
/dev/video1394-0
der Ordner
/dev/video1394
enthält einen Link auf die erste Datei, hat aber die Rechtemaske 0600 statt 0700, so dass hier ein Zugriffsfehler (kein Eintritt in das Directory) vorliegt. Diesen Mißstand (wahrscheinlich nur SuSE 10.1 spezifisch) muss man händisch beseitigen.

Wie komme ich zum Videobild? Das erste Problem ist schon das einschalten der Kamera. Unter Mac OS X wird Sie automatisch beim Zugriff eingeschaltet. Unter Linux brauche ich ein Programm, bspw coriander (package der Distribution)

Dieses (GUI-) Programm kann nicht nur die Kamera ein- und ausschalten, mittels

Services -> ISO Control: START
In diesem Bereich stllt man am Besten gleich die Auflösung 320×240 ein, die von den ganzen Kommunkationsprogrammen benötigt wird.

sondern auch die Auflösung einstellen und alle Anzeigewerte kalibrieren.
Messenger und VoIP Programme wie kopete und skype erwarten aber ein v4l device unter /dev/videoX (X als Ganzzahl)

Um das Video ieee1394 Device umzuleiten braucht man das Kernelmodul vloopback. Da dieses zumindest unter SuSE 10.1 nicht dabei ist, muss man die Quellen herunterladen und selberkompilieren (make;make install)

Danach muß man das Modul vloopback und videodev einladen – dauerhaft als Eintrag in MODULE_LOADED_ON_BOOT im Bereich sysconfig.

Danach geht man wieder ins das GUI Programm Coriander und drückt im Services Bereich den Knopf „Receive“ und „V4L“ um das Video Signal mittels vloopback in /dev/video0 einzuspeissen. Dieses Signal kann dann unter /dev/video1 von den Anwedungsprogrammen ausgelesen werden.

Lange Übergangszeiten bei Unicode und 64bit

Probleme mit falschen Umlauten oder Sonderzeichen sind auf der Tagesordnung. Prinzipiell müsste das nicht sein, aber fehlerhafte Programmierung und fehlende Erkennungsmerkmale führen zu hohen Fehlerquoten.

Hintergrund ist dass auf allen gängigen UNIX Systemen UTF-8 als Standardkodierung sowohl für den Inhalt von Klartextdateien als auch für die Kodierung von Dateinamen (siehe auch Form C/D Unterschied) verwendet wird.

Bei Windows wird in unseren Breitengraden standardmässig Latin-1 verwendet (exakt: Windows CP-1252). Dies führt zu Problemen beim Dateiautausch, wenn kein Transformationsmechnismus (bspw. bei Mac OS X wenn Windows Shares via SMB kontaktiert werden) eine Anpassung vornimmt.

Angesichts zigfacher Austauschmöglichkeit (email,USB-Stick,WebDAV,scp..) wird es meines Erachtens noch bis zu 10 Jahre dauern bis dieses Problem nicht mehr auftritt.

Die zweite Sache die m.E. noch bis zu 5 Jahre problematisch sein kann sind 64bit Plattformen. Unter Linux Standard, da der Distributionsinstaller auf allen x64 Plattformen vorschlägt die 64bit Variante zu installieren. Das hat aber zur Folge, dass 3rd party Desktop Programme die nur als 32bit Version oftmals nicht installierbar sind, da die 32bit Bibliotheken fehlen. Auch beim selber kompilieren mit automake&friends gibt es hin und wieder Probleme, wenn man an zig Stellen redundant einen 32bit Flag setzen muss.

Unter Mac OS X wird das Problem mit Fat-binaries erschlagen die einfach immer alles mitbringen. Application+Libraries in 32/64bit ev. noch als Universal Binary.

Einfach für den User aber mittlerweile extrem Resourcenintensiv. Auf einem Apple Laptop mit ca. 100GB HD kann man davon ausgehen, dass Ruck-Zuck 50GB nur für die installieren Programme und das Betriebssystem draufgeht.

Der einfachste Ansatz zukünftig wäre alles nur noch 64bit – dass dauert aber noch und bringt derzeit auch noch Nachteile mit sich (64bit Pointer Overhead).

rulefile für streamripper

Wer bspw. den AF.HM shoutcast stream mittels streamripper aufnimmt, wird anfangs keinen Spass haben, denn alle paar Minuten wird das mp3 file unterbrochen durch ein

Next on Air – ….

file, da der stream diese Information als Titelinformation sendet. Ein kleines sog. rulefile für streamripper erzwingt diese spezielle Titelinformation zu ignorieren. In dieses File muss dann folgende Zeile:

m/^Next on Air:/e

m bedeutet matching rule und e bedeutet verwerfen (drop). Beim nächsten Start mit:

streamripper -w mein_rulefile

wird streamripper den ganzen schönen Mix aufnehmen.