Subject: [.plan] Portables /home/, XDG und Android API
From: Boris Kraut <[email-masked]>
To: undisclosed-recipients: ;
Date: Sat, 11 May 2013 02:15:17 +0200

Ich bin bekanntlich kein grosser Fan von den XDG, den von
freedesktop.org aufgestellten X Desktop Guidelines. Sicher,
sie vereinheitlichen, aber manchmal steht diese Vereinheit-
lichung eben meiner speziellen Nutzungsart entgegen, z.B.
beim Aufbau und der Organisation des Home-Verzeichnises.

Bisher wurden Benutzerkonfigurationsdateien einfach im Home-
Verzeichnis des jeweiligen Nutzers abgelegt und trugen den
Namen der Anwendung Dem Namen war ein "." vorangestellt,
um die Datei zu verstecken und von Nutzerdaten unterscheiden
zu koennen. Reichte eine einzelne Datei nicht aus bzw. wurden
zusaetzlich zu den Nutzerdaten auch Anwendungsdaten angelegt,
nutzten die meisten Programme ein komplettes Verzeichnis nach
dem selben Namensmuster -- die Konfigurationsdatei war dann
mit den Anwendungsdaten innerhalb dieses Ordners zu finden,
der den Namen des jeweiligen Programms verwendete.

XDG legt nahe, dass man Anwendungsdaten und -konfigurationen
an sich oertlich trennen sollte und erst in zweiter Ebene
nach Programmnamen. Dazu gibt es die beiden Umgebungsvariablen
XDG_DATA_HOME und XDG_CONFIG_HOME -- falls nicht gesetzt
sollen die Ordner $HOME/.local/share und $HOME/.config ver-
wendet werden, anstatt auf das alte, oben erlaeuterte Schema
zurueck zu fallen: Diese sollen nur noch lesend genutzt werden.

In der XDG-Denke, haben auch andere -- besser: keine -- Daten
etwas im Home-Verzeichnis verloren und so werden weitere
Unterordner bestimmt. Diese werden jedoch nicht per Umgebungs-
variable festgelegt, sondern in $XDG_CONFIG_HOME/user-dirs.dirs
-- einer Datei die diese zusaetzlichen Variablen und Werte
festlegt:

XDG_DESKTOP_DIR="$HOME/Desktop"
XDG_DOWNLOAD_DIR="$HOME/Downloads"
XDG_TEMPLATES_DIR="$HOME/Templates"
XDG_PUBLICSHARE_DIR="$HOME/Public"
XDG_DOCUMENTS_DIR="$HOME/Documents"
XDG_MUSIC_DIR="$HOME/Music"
XDG_PICTURES_DIR="$HOME/Pictures"
XDG_VIDEOS_DIR="$HOME/Videos"

Es gibt noch weitere XDG-Variablen, aber dazu spaeter mehr. Im
Moment geht es mir um etwas anderes. Ich halte das Vorhandensein
solcher Variablen fuer eine gute Idee. Sie beschreiben Ordner,
die man in sehr vielen Faellen auf einem Desktop-System haben
und nutzen koennte. Was mich jedoch stoert ist, dass XDG sehr
viral ist: Zum einen muss ich XDG nutzen, um XDG-Anwendungen
mitzuteilen, dass sie nicht XDG nutzen sollen. Zum anderen wird
aktiv auf Entwickler Einfluss genommen, damit diese auch ohne dass
XDG-Variablen gesetzt sind, die XDG-Sturktur einhalten, anlegen
und dem "alten Weg" vorziehen. Auch schade: Man kann den Inhalt
von "user-dirs.dirs" nicht einfach per ENV-Variable ueberschreiben.

So sehr ich mich auch gegen XDG ausspreche, desto mehr Programme
nutzen XDG und folgen dessen Empfehlung, es proaktiv zu erzwingen,
indem sie "den alten Weg" nicht mehr oder nur lesend anbieten. Es
wird klar, dass ich fuer ein portableres Home-Verzeichnis zumindest
optional XDG beachten muss, deshalb habe ich mir Gedanken ueber
meine Verzeichnisstruktur gemacht. Im Vergleich zur letzten Be-
sprechung meines Homeverzeichnis bei ioexception.de, hat sich doch
einiges geaendert. Statt mit "Desktop" und "Downloads" Ordnern zu
leben, die diverse Anwendungen immer und immer wieder erstellen,
habe ich diesen -- in meinem Schema -- sinnvolle Namen gegeben.
Ausserdem wurde mein Ordner fuer Vortraege und Praesentationen
zum generellen Speicherort fuer Dokumente.. oder besser fuer
"dokumentierte Ereignisse".

XDG_DATA_HOME=$HOME
XDG_CONFIG_HOME=$HOME

XDG_RUNTIME_DIR=/run/krt
...

XDG_DESKTOP_DIR="$HOME"
XDG_DOWNLOAD_DIR="$HOME/tmp"
XDG_TEMPLATES_DIR="$HOME"
XDG_PUBLICSHARE_DIR="$HOME/pub"
XDG_DOCUMENTS_DIR="$HOME/doc"
XDG_MUSIC_DIR="$HOME/pls"
XDG_PICTURES_DIR="$HOME/pic"
XDG_VIDEOS_DIR="$HOME/mov"

Daneben gibt es noch die Ordner src, bin, man und mail, deren Sinn
wohl offensichtlich ist. Zudem gibt es weiterhin misc, der in
vielerlei Hinsicht die selben Aufgaben erfuellt hat, wie doc jetzt,
aber derzeit noch einem anderen Ordnungsparadigma folgt. Frueher
oder spaeter wird misc nicht mehr benoetigt werden.

Damit sollte dann ja alles gut sein, oder? Nicht ganz, denn wer
hier einige Zeit mitliest, weiss, dass ich mich auch mit dem
Nicht-so-ganz-Linux namens Android beschaeftige. Android kennt
prinzipiell eine aehnliche Verzeichnisstruktur, legt diese
aber nicht im Home-Verzeichnis -- das waere /data bzw. die
jeweilige Multi-User-Version davon -- ab, sondern nutzt dafuer
/sdcard -- auch hier: oder die jeweilige MultiUser-Version --,
was wenig mit der SD-Karte zu tun hat, sondern generell als
Name fuer nutzerspezifischen Speicher verwendet wird.

Ebenfalls nutzt Android hier keine veraenderbaren Umgebungs-
variablen, sondern festkodierte Werte, die ueber die API [1]
via getExternalFilesDir(NAME) abrufbar sind. NAME folgt dabei
einem relativ simplen Schema, z.B. DIRECTORY_MUSIC oder
DIRECTORY_RINGTONES. Die Standardverzeichnisse sind:

> Music/
> Media scanner classifies all media found here as user music.
> 
> Podcasts/
> Media scanner classifies all media found here as a podcast.
> 
> Ringtones/
> Media scanner classifies all media found here as a ringtone.
> 
> Alarms/
> Media scanner classifies all media found here as an alarm
> sound.
> 
> Notifications/
> Media scanner classifies all media found here as a notification
> sound.
> 
> Pictures/
> All photos (excluding those taken with the camera).
> 
> Movies/
> All movies (excluding those taken with the camcorder).
> 
> Download/
> Miscellaneous downloads.

Die einzige Option, dieses Verhalten zu beeinflussen, wird wohl
eine massiver Einsatz von Symlinks sein; nicht unbedingt die
ideale Loesung. Es wird immer ersichtlicher, dass -- so sehr mir
Android an der Oberflaeche gefaellt -- es nicht das ist, womit
ich gluecklich werde. Ich kann nur hoffen, dass es bald gut
nutzbare unixartigere Systeme fuer die ansonsten ganz gefaellige
Hardware gibt.

[0] http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
[1] https://developer.android.com/guide/topics/data/data-storage.html#AccessingExtFiles
[2] https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard
[3] https://en.wikipedia.org/wiki/Unix_directory_structure