MIME Types unter Linux

Die Multipurpose Internet Mail Extensions sind entgegen ihrem Namen auch für die Identifizierung eines Dateityps auf Linux Desktops verantwortlich.

Eine gemeinsame Technik der freedesktop Organisation sorgt dafür, dass ein Verfahren dabei auf allen Desktops‘ – Gnome,KDE,Unity.. – gleichermassen funktioniert. Die gemeinnützige Organisation kümmert sich dabei vor allem um die Standardisierung und stellt teilweise sogar SW (software) bereit.
Eine Übersicht der MIME-Type Spezifikation findet sich hier, während der Ordner mit den letzten verfügbaren Änderungen sich hier befindet.

Wenn man einen oder mehrere neue MIME-Types (mit dazugehörigem Programm) einführen möchte, geht man am besten folgendermaßen vor:

  1. Man sucht sich einen passenden Ablageordner – die auf dem System vorhandenen sind
    $XDG_DATA_DIRS/mime
    $XDG_HOME_DIR/mime

    falls XDG_HOME_DIR nicht gesetzt ist, gilt
    ~/.local/share/mime
    Natürlich kann man bspw. XDG_DATA_DIRS auch erweitern um einen neuen Pfad einzuführen
  2. Eigene MIME-Type Deklarierungen müssen innerhalb einer standardisierten XML-basierenden Datei im Ordner packages (unterhalb des Ordners mime) gespeichert werden, bspw
    ~/.local/share/mime/packages/myType.xml
    Eine xml Datei kann dabei auch mehrere MIME-Types definieren. Der genaue Vorgang erklärt eine hervorragende Tutorialseite auf freedesktop:
    Tutorial: adding MIME information to the database
  3. Die sog. MIME-Type database muss aktualisiert werden. Dazu gibt es ein Skript welches die ganzen im Punkt 1. erwähnten Verzeichnisse durchscannt und dort jeweils dezentral binär aufgebaute Hilfsdateien anlegt. Das shell script welches natürlich mit Administrationsrechten ausgeführt werden muss, lautet
    update-mime-database
  4. Die Verknüpfung eines MIME-Types mit einem Programm ist nicht Sache der MIME-Type Definition. Stattdessen legen die Programmbeschreibungsdateien, die sog. desktop-Dateien, offen welche MIME-Types sie bearbeiten. Diese Dateien mit der Endungs .desktop, liegen in
    XDG_DATA_DIRS/application
    XDG_HOME_DIR/application

    mit denselben Ergänzungen wie im Punkt 1.
    Die freedesktop Spezifikation findet man auf folgender Seite. Ein anschauliches Beispiel findet sich hier.
  5. Nachdem man die MIME-Types und Anwendungen die bestimmte MIME-Types bearbeiten können festgelegt hat bleibt noch folgende Frage zu klären: Welche Anwendung ist die bevorzugte Anwendung eines MIME-Types, bspw. image/png ?
    Dort hat jeder Desktop (bspw. KDE) seine Voreinstellungen in der generierten mime.cache Datei (siehe Punkt 3. – Hilfsdateien) getroffen. Diese Entscheidungen können aber ergänzt oder geändert werden.
    Dazu muss man die Datei
    mimeapps.list
    unterhalb von
    XDG_DATA_DIRS/application
    XDG_HOME_DIR/application

    ändern. Wie genau erklärt die Spezifikation auf freedesktop an dieser Stelle.
    Neben der Angabe einer bevorzugten Anwendung für einen MIME-Type in der Sektion
    [Default Associations]
    gibt es auch noch die Möglichkeit zusätzliche Assoziationen zu kreieren oder zu vorhandene zu löschen.

  6. Am Ende bleibt noch die Frage wie man an diese MIME-Type Informationen gelangt? Sicher, haben die grossen Desktops Routinen dafür entwickelt die den Spezifikationen von freedesktop genügen, aber wie kommt man als ISV (Independent Software Vendor) an diese Informationen.
    Vorab – eine API gibt es nicht – unter keiner Sprache. Was es gibt sind Skripte allen voran
    xdg-mime
    des Portland SW Paketes von freedesktop (der SW Part von freedesktop, siehe Einleitung). Unter Ubuntu/Debian gibt es auch noch das Perl-Skript
    mimetype
    mit welchem man wesentlich mehr Informationen abgreifen kann.
    Zu diesem Thema möchte ich noch auf 2 nützliche Links verweisen
    http://wiki.ubuntuusers.de/MIME-Typ
    http://aksubuntu.com/questions/279899

Abschliessend lässt sich sagen, dass die MIME-Type Informationen unter Linux ausgereift und ausreichend ist. Was verbesserungsbedürftig ist, und leider gerade dahindarbt, ist die SW-Unterstützung, v.a. eine C/C++ API seitens freedesktop.org wäre wünschenswert. Dies soll aber nicht darüberhinwegtäuschen, dass die Zusammenarbeit der Linux Desktops gut funktioniert.

gcc: benötigte Bibliotheken nach dem object file

Eine Überraschung erlebte ich beim Bauen einfacher Demonstrationsprogramme unter Ubuntu 12.04. Folgende Anweisung:

gcc -lpthread -o pthread_demo pthread_demo.c

erzeugte beim Linkvorgang mehrere unresolved symbols bzgl. pthread Methoden. Tatsächlich wurde aber mit gleicher Anweisung das Programm zu den Anfangszeiten von Ubuntu 12.04 gebaut. Eine Umstellung des Linker Programms ld bzw. der Aufruf desjeniegen durch gcc dürfte daran schuld sein. In ld Version 2.20 führt der Linker-Flag

--as-needed

dazu, dass Bibliotheken nur noch gelinkt werden wenn diese undefined Symbols im Objekt File oder einer zuvor gelinkten Bibliothek auflösen kann. Daher muß von nun an das Objekt File vor den benötigten Bibliotheken im gcc Aufruf stehen.

gcc -o pthread_demo pthread_demo.c -lpthread

Alternativ könnte man das alte Verhalten mit folgendem Linker-Flag wiederherstellen

gcc -Wl,--no-as-needed -lpthread -o pthread_demo pthread_demo.c

Libraries Suchpfade (DT_PATH vs. DT_RUNPATH)

Seit geraumer Zeit gilt in der ELF Spezifikation (betrifft Linux) das ELF Symbol DT_RPATH (oder nur rpath) als deprecated, also veraltet. Der Nachfolger ist DT_RUNPATH (oder nur runpath) und wird von den GNU linkern seit langem unterstützt.

Es gibt nur ein entscheidenden Unterschied: Während DT_RPATH zur Laufzeit vor der Umgebungsvariable $LD_LIBRARY_PATH durchsucht wurde, wird DT_RUNPATH erst nach der Umgebungsvariable ausgewertet.

Wenn diese beiden ELF Symbole gleichzeitig vorhanden sind wird DT_RPATH ignoriert. Die gcc Linker Option -Wl,-rpath erzeugt derzeit standardmässig beide, was man aber mit dem Flag –disable-new-dtags ausschalten kann um das alte Verhalten (rpath gewinnt vor $LD_LIBRARY_PATH) zu erzwingen.

Der Grund für diese – zugegeben nicht neue – Änderung besteht wohl darin mehr Druck aufzubauen um zumindest auf SW-Distributionsseite nicht mehr den LD_LIBRARY_PATH zu benutzen. Dieser sollte nur noch dem Benutzer vorbehalten sein um seine speziellen Wünsche abzudecken.

Dieses Verhalten, sowie eine genauere Beschreibung des Suchmechanismus unter Mac OS X, ist in der Präsentation über Portablen Code aktualisiert.

Metadaten in Bilddateien (shotwell vs. digikam)

Nichts ist einfach in der Informationsverarbeitung.
Um überhaupt ein Foto in einer schon mittelmässig großen Sammlung wiederzufinden, benötigt man Tags – sog. Metainformationen – bspw. den Namen des Aufgenommenen.
Diese Informationen setze ich bspw. im Raw-Programm Corel Aftershot Pro. Es bietet sog. hirachische Tags an, bspw: „Persons/Alexandra“. Diese Tags werden auch in das exportierten JPEG miteingebettet.

Sowohl shotwell als auch digikam (zwei Bildverwaltungsprogramme für Linux) zeigen mir sie an – soweit, so gut. Allerdings möchte ich mit solch einem Bildverwaltungsprogramm auch JPEG’s verwalten, die ungetaggt durch bspw. das iPhone auf dem Rechner gelandet sind. Da ich unlängst auf den Linux Rechnern Ubuntu zum Einsatz bringe, setzte ich auf das dortige Standardprogramm shotwell, welches durch aufgeräumte Bedienoberfläche und durchdachte Benutzerführung glänzt….

..aber nur damit. Denn das setzen der Metainformationen ist in shotwell 0.12.3 (Ubuntu 12.04) eine Katastrophe. Mit der Option Tags, Titel und andere Meta-Daten in die Bilddateien schreiben können die gesetzen Informationen zwar wirklich in die Datei geschrieben werden, was da aber reinkommt ist Murks.
Und das ist genau das Gegenteil von dem was digikam macht – denn das Standard KDE Bildverwaltungsprogramm behandelt die Metainformationen vorbildlich. Hier die Erklärung

Bei den Metainformationen müssen wir EXIF, IPTC und XMP unterscheiden:

EXchange Image Format for Digital Still Cameras – Informationen werden direkt von der Kamera in die Bilddatei geschrieben (v.a. technische Informationen des verwendeten Equipments) und sind nicht dafür gedacht geändert zu werden, auch wenn das natürlich mit einigen Programmen möglich ist.

International Press Telecommunication Council – Informationen sind die älteren, einfach gehaltenen Informationen. In diesem Format – wir reden immer noch über die in der Bilddatei eingebettenen Informationen – gibt es das Feld Keywords bei dem mit Komma separiert eigenen Tags (z.B. „Alexandra“) gesetzt werden können.
Leider ist die Angabe eines Zeichensatzes nicht zwingend vorgeschrieben, weswegen man Ihn entweder angeben kann, oder den Umgebungszeichensatz wählt (UNIXoide Betriebssyteme: UTF-8).
Und schon die erste Schwäche von shotwell: Die Keywords werden mit einem Latin-1 Zeichensatz (wahrscheinlich ISO-8859-1) hereingeschrieben – ohne Angabe dessen – was alle anderen Programme, inkl. des Referenzprogramms exiftools dazu veranlasst bspw. Umlaute falsch darzustellen.

eXtensible Metadata Platform ist Adobe’s letzter Streich um eine XML-basierte offene und erweiterbare Metainformationsplattform zu schaffen. Durch die Erweiterbarkeit gibt es allerdings gleich mehrere Abschnitte einer XMP Information – die übrigens sowohl in die Bilddatei eingebettet werden, aber auch als sog. sidecar file separat vorliegen kann.
Die wichtigesten Abschnitte sind Dublin Core bei den die Informationen im Feld Subject vorliegen als auch lr (Adobe Lightroom) – bei dem das Feld hierarchicalSubject gesetzt wird und genau hier kann man anstatt „Alexandra“ bspw. „Persons|Alexandra“ setzen (genau mit dieser Schreibweise).
Und genau hier versagt shotwell grandios: Anstatt „Persons|Alexandra“ in das Feld zu schreiben, wird „Persons, Persons/Alexandra“ geschrieben und in Dublin Core wird anstatt „Alexandra“, „Persons, Alexandra“ geschrieben. Diese Fehlinformationen bringen dann wiederum andere Programme, die die Metainformationen richtig handhaben (digikam,Corel Aftershot Pro,Adobe Lightroom) ausser Tritt. Die Portabilität ist hinüber.

Trotz Ubuntu ist digikam wieder das Bildverarbeitungsprogramm der Wahl auf Linux!

Murks beim Batteriewechsel

Als ich mal wieder Batterien im Kinderspielzeug austauschen musste, ist mir ein ganz dreister Fall untergekommen. Folgendes nettes Drückspielzeug

ls1

entpuppte sich als dreister Murks. Die 2 Knopfzellen (LR41, aka AG3) lassen sich sehr schwer entnehmen. Entweden man lötet die Halterung ab, oder man hebelt die eingeklebte Elektronik aus.
ls2

Diese Art des Batteriewechsels ist schon scharf an der Grenze des ElektroG §4, welche eine Europäische Richtlinie umsetzt, die festeingebaute Batterien in Elektrogeräten verhindern soll. Zudem hat das gute Teil auch kein WEEE-Symbol für gesondert zu entsorgende Elektrogeräte.
Man geht halt davon aus, dass es einfach nach Kurzgebrauch im Mülleimer landet. Die Zeche zahlen dann alle…

useradd vs. adduser

Möchte man einen bestehenden User auf einem Ubuntu System eine weitere Gruppenzugehörigkeit spendieren, so geht das auf 2 verschiedene Arten.

  1. adduser <username> <groupname>
  2. usermod -a --groups <groupname> <username>

Der Befehl der ersten Variante ist eher von High-Level Natur, der zweite hingegen von Low-Level. Gerade hier muß man aufpassen, dass der Parameter -a (append) gesetzt ist, sonst wird mit diesem Befehl die bereits bestehenden Gruppenzugehörigkeiten gelöscht!
Dies fällt überlicherweise auch erst nach einem Relogin auf.

USB Tastatur für GRUB Bootloader aktivieren

Beim Starten eines Rechners passierte jahrelang ein komische Sache, die ich erst jetzt – bedingt durch einen Anfängerfehler – auf den Grund gehen musste.

Direkt nach dem Start meldet sich wie üblich das BIOS.. und hat keinerlei Probleme mit der USB-Tastatur.
Danach die Übergabe an den GRUB Bootloader – der auf einmal keinerlei Tastatureingaben mehr entgegennimmt. Bei der finalen Übergabe an das Betriebssystem (Ubuntu Linux, openSUSE Linux) wird die Tastatur wieder erkannt

Offengestanden habe ich aus Zeitmangel die eigentlich Ursache, oder das Zusammenspiel der Komponenten im Hintergrund nicht recherchiert, hier ist aber die Abhilfe an meinem System:

Im BIOS (Phoenix BIOS) die Option Enable Legacy USB im Menu Advanced aktiviert!

Änderung der voreingestellten places (Orte) in Nautilus

Beim Standarddateimanager von Ubuntu 12.04 Nautilus kann man in der Seitenleiste bekanntlich Lesezeichen (bookmarks) anlegen, deren Name und Zielverweis wählbar ist.

Voreingestellt sind unter der Rubrik Rechner bereits ein paar Ordner, bspw. Dokumente, Bilder, Musik, Videos. Das Zielverzeichnis dieser Einträge lässt sich in Nautilus selber nicht ändern.
Die Zielverzeichnisse holt sich Nautilus – wie auch andere Programme – vom Desktop-übergreifenden Projekt freedesktop.org, welches die Einträge in folgender Datei ablegt.

$(XDG_CONFIG_HOME)/user-dirs.dirs

also im Normalfall

~/.config/user-dirs.dirs

Dort ändert man bspw. das Verzeichnis für XDG_DOWNLOAD_DIR um das Zielverzeichnis für den Download-Ordner zu ändern.

Indizierung einer neuen Qt Help Project Datei schlägt fehl

Selten tritt im QtCreator ein merkwürdiges Phänomen auf. Man fügt im Optionen Dialog eine neue Qt Help Project Datei (*.qch) hinzu und die darauf hin automatisch startende Indizierung bricht sofort (klanglos) ab.
Man merkt den Effekt natürlich im Suchfeld, denn eine Volltextsuche auf diese Hilfe liefert keine Ergebnisse zurück

Den eigentlichen Fehler kann man nur entdecken, wenn man QtCreator auf der Kommandozeile startet – dann erscheint in diesem Fall

virtual void fulltextsearch::clucene::QHelpSearchIndexWriter::run() : Failed because of CLucene exception.

Einzigste mir bekannte Lösung ist das Erzwingen einaer Neuindexierung aller Files – durch ein löschen des Index Ordners
~/.config/<Qt-Eigentümer>/qtcreator/.qhelpcollection

<Qt-Eigentümer> muss natürlich durch „Digia“ oder „Nokia„, ev. „Trolltech“ ersetzt werden. Das kommt darauf an, wann der Basisordner erstmalig erstellt wurde.

Kommando in bash kann nicht starten obwohl ‚which‘ es findet

Manchmal liegen Programme in verschiedenen Versionen vor und verlangen nach einem Ansatz der es erlaubt die verschiedenen Versionen relativ einfach zu starten.
Eine Möglichkeit ist es die PATH Umgebungsvariable so zu setzen, dass mehrere Verzeichnisse die das Programm beinhalten gelistet sind, z.B.

PATH=~/binNeu:~/binAlt

Ein fikives Programm testMe ,würde nun aus ~/binNeu starten. Wenn man nun temporär dieses Verzeichnis umbenennt, sollte testMe aus ~/binAlt gestartet werden.
Tatsächlich wird das auch vom which Kommando so angezeigt. Bei der Ausführung von testMe, gibt die bash erstaunlicherweise die Fehlermeldung aus, das ~/binNeu/testMe (!) nicht gefunden wird.

Grund dafür ist eine Cache-Hashtable welche die bash am Anfang anlegt um einen Programmstart zu beschleunigen. Und genau diesen muss man in diesem Fall mit folgendem Kommando löschen.

hash -r

Alternativ könnte man auch das File sourcen, welches direkt oder indirekt die PATH Variable setzt, oder schlicht die bash schließen und neustarten.