[[:mac|{{ :Apple.png?40|}}]]
===== Preferences & User Defaults System =====
==== Preferences ====
Die Preferences Files (auch Property List((http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/man5/plist.5.html)) -> plist) sind bei Mac OS Konfigurationsdateien. Sie liegen im binär-Format oder als Textdateien (XML) vor. Sie sind in etwa mit der Microsoft Registry vergleichbar, wobei die Preferences Files bei Weitem nicht die Komplexität einer Windows Registry erreichen. Im Prinzip lassen sich die Preferences grundsätzlich mal in User Preferences und System bzw Application Preferences einteilen. Die meisten Anwendungen lassen benutzerdefinierte Einstellungen zu; in Mac OS wird dies in Anwendungen idR über das Menü Preferences bzw. Einstellungen erledigt bzw bei Systemkonfigurationen, wie zB die Netzwerkkonfiguration oder die Ländereinstellungen, über die Systemeinstellungen bzw. das Preferences Pane. Diese Einstellungen sind, bis auf wenige Ausnahmen (zB Netzwerk Einstellungen -> Dynamic Store((http://developer.apple.com/library/mac/#documentation/Networking/Conceptual/SystemConfigFrameworks/SC_Components/SC_Components.html))), permanent und werden beim Start der Anwendung bzw. beim Systemstart ausgewertet. Durch die Trennung der User-Preferences und System-Preferences ist es möglich, jedem Anwender seine eigenen Einstellungen zu ermöglichen. Ähnlich wie bei Microsoft die Registry Rootkeys HKEY_CURRENT_USER und HKEY_LOCAL_MACHINE.
Die Preferences Files werden im Filesystem idR für den Benutzer in seinem Homedirectory ~/Library/Preferences bzw. für das System in /Library/Preferences abgelegt und (sollten) haben ein Prefix, welcher den Hersteller der Anwendung identifiziert wie zB bei Apple com.apple, sowie den Namen der Anwendung oder möglicherweise auch nur eine Systemfunktion im Namen. Als Suffix wird .plist verwendet -> //VendorPrefix.AppFunction.plist// (zB com.apple.TextEdit.plist). Es finden sich aber auch noch Dateien in den Preferences Verzeichnissen, welche sich nicht nach dieser Nameskonvention richten. Oft sind das irgendwelche älteren Formate aus veralteten Anwendungen oder Third-Party Anwendungen haben ihre eigene Philosophie, was ihre Konfigurationsdateien betrifft.
Eine besondere Rolle spielt die .GlobalPreferences.plist. Man findet sie sowohl im ~/Library/Preferences/ Verzeichnis wie auch im /Library/Preferences Verzeichnis. Sie representiert die Domain NSGlobalDomain. In ihr werden alle Einstellungen abgespeichert, die nicht einer bestimmten Anwendung zugeordnet werden. Da kommt zB das Aussehen des »Öffnen« oder »Speichern Unter« Dialogs in Frage oder auch diverse Farbeinstellungen wie zB die Highlight Color. Kurz gesagt, wenn eine plist einer Anwendung eine bestimmte Eigenschaft nicht beinhaltet, diese aber in der .GlobalPreferences.plist definiert ist, wird diese verwendet.
Es ist auch möglich, dass Anwendungen ihre Preferences weder in ~/Library/Preferences noch in /Library/Preferences ablegen sondern zB im Programmverzeichnis selbst. Quark Express bietet zB diese Möglichkeit an, was in Verbindung mit einem Lizenserver (QLA) uns in die Lage versetzt ein Image einer kompletten Installation inklusive benutzerdefinierter Einstellungen zu erstellen und am nächsten Mac wieder zu installieren. Dieser Wanderzirkus der Konfigurationsdateien hat aber auch den Nachteil, dass man sich nicht auf einen Ablageort verlassen kann. Auch vermisse ich ein Tool oder Shell-Kommando, welches mir zu einer Applikation die zugehörige Konfigurationsdatei ausgibt.
Die Preferences Files spielen beim Troubleshooting eine wesentliche Rolle. Bei fehlerhaften Anwendungen hat man zB die Möglichkeit, die dazugehörige(n) Preferences zu löschen (oder erstmal nur umzubenennen in zB *.plist.old), dadurch werden diese beim Start der Anwendung bzw. beim Systemstart neu, mit Standardeinstellungen, erzeugt. Neben diesem pragmatischen Lösungsansatz kann man auch hergehen und die Preferences der Anwendung zu analysieren aber im Prinzip ist man mit diesem Lösungsansatz eigentlich gut bedient und reicht in den meisten Fällen auch aus.
**Note:** Es ist dabei wichtig zu wissen, dass man nach dem Löschen der Preferences die benutzerdefinierten Einstellungen der betroffenen Anwendung neu setzen muss.
Für die Analyse und Bearbeitung stehen einige Boardmittel, sowohl in der GUI (-> Finder) wie auch im CLI (-> Terminal) zur Verfügung. Für die GUI kommt der Property List Editor in Frage, welcher sich in den Developer Tools auf der Mac OS Installations CD befindet. Diese werden bei einer Standardinstallation nicht mit installiert. Des Weiteren kommen zB die CLI Tools plutil((http://developer.apple.com/Mac/library/documentation/Darwin/Reference/ManPages/man1/plutil.1.html)) und defaults((http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/man1/defaults.1.html)), auf welches der folgende Abschnitt näher eingeht, in Frage. Eine besondere Rolle spielen die Preferences Files in /Library/Preferences/SystemConfiguration. Sie repräsentieren den Dynamic- bzw. Persistant Store, in welchem die Netzwerkeinstellungen gespeichert werden.
==== User Defaults System ====
Das Mac OSX User Defaults System ist eine Schnittstelle zur Verwaltung von Voreinstellungen. Die Voreinstellungen sind in Domains organisiert, die nach dem umgekehrten DNS Namens Schema bezeichnet werden. So sind die Domains der Apple Programme und Systemdienste durchweg nach dem Muster com.apple.xyz benannt, wobei xyz normalerweise für den Programm- oder Dienstnamen wie com.apple.mail oder com.apple.finder steht. In manchen Fällen ist dieser Bereich noch in Unterdomains wie zB com.apple.menuextra.clock oder com.apple.menuextra.textinput gegliedert. Wichtig ist hierbei nur, dass der Name systemweit eindeutig ist. Einige Einstellungen werden von mehreren Programmen oder Diensten gelesen; die Auswahlfarbe, die Spracheinstellungen oder die zuletzt benutzten Ordner in Öffnen- und Sichern Dialogen sind ein Beispiel dafür. Diese Voreinstellungen werden in einer eigenen Domain mit dem Namen NSGlobalDomain gespeichert.
IdR werden die Voreinstellungen der einzelnen Programme in deren Menüpunkt Einstellungen vorgenommen und dadurch in die plist-Datei geschrieben. Es gibt aber etliche Ausnahmen, wie zB Systemdienste, die gar keine Benutzerschnittstelle besitzen, oder schlicht und ergreifend fehlende Einstellmöglichkeiten im betreffenden Einstelldialog von diversen Anwendungen. Mit dem Programm defaults können auch diese Voreinstellungen gelesen, geändert oder gelöscht werden. Es ist ratsam, das betreffende Programm (wenn möglich) zu schliessen, wenn man mit defaults in deren Preferences Dateien etwas ändert.
Die Syntax lautet folgendermaßen: //defaults Modus Domain [Schlüssel | .plist]//
**Die Modis:**
* **read:** Werden Domain und Schlüssel weggelassen, erfolgt die Ausgabe sämtlicher Einstellungen des Benutzers -> defaults read. Dabei kommt es aber zu einer Datenflut, die im ersten Blick nur bedingt brauchbar erscheint aber man kann sich das auch zu Nutze machen; weiter unten dazu mehr. Ohne Angabe eines Schlüssels werden alle vorhandenen Einstellungen einer angegebenen Domain angezeigt -> defaults read org.mozilla.firefox. Kennen Sie den Namen des Schlüssels bereits, können Sie diesen gezielt abfragen:\\ \\ $ defaults read org.mozilla.Firefox NSNavLastRootDirectory
~/Desktop
* **read-type:** Schlüssel sind immer Strings, der dazugehörige Wert aber kann ausserdem ein Dictionary, Array oder Binärdaten sein. Mit read-type lässt sich der Typ eines Schlüssels in Erfahrung bringen. Dieser ist notwendig, wenn Sie den Wert eines Schlüssels mit dem Modus write ändern oder setzen wollen:\\ \\ $ defaults read-type org.mozilla.Firefox NSNavLastRootDirectory
Type is string
$ defaults read-type com.apple.finder _FXShowPosixPathInTitle
Type is boolean
* **rename:** Der Name eines vorhandenen Schlüssels wird in diesem Modus umdeklariert. zB defaults rename com.apple.finder _FXShowPosixPathInTitle ShowPath würde den Schlüssel _FXShowPosixPathInTitle in ShowPath umbenennen, den Wert des Schlüssels aber beibehalten.
* **delete:** Löscht sämtliche Informationen der gesamten Domain, wenn nur diese übergeben wird. defaults delete org.mozilla.firefox setzt den Internetbrowser Firefox auf seine Standardeinstellungen zurück. Das käme dem Workaround des Löschens der gesamten Preferences Datei gleich.
* **domains:** Es werden alle vorhandenen Domains in einer Komma separierten Liste angezeigt. Da die Ausgabe recht unübersichtlich ist braucht es weitere Tricks, um sie leserlich und somit brauchbar zu gestalten. Das [[tux:tr| -> tr-Kommando]]((http://wiki.unixboard.de/index.php/ManPage:tr)) wird dabei verwendet um Zeichen zu ersetzen. Hier wird das Komma ',' in der Ausgabe von defaults domains (ohne weiterer Kommandos) mit einem Zeilenvorschub '\n' ersetzt. Das nl-Kommando((http://unixhelp.ed.ac.uk/CGI/man-cgi?nl)) nummeriert jede Zeile:
$ defaults domains | tr ',' '\n' | nl
1 DVD Ripper for Mac
2 Icns2Rsrc
3 MacSOUP
4 Wondershare DVD Ripper
5 Wondershare Video Converter
6 ca.mactracker.mactracker
7 ca.mactracker.mactracker3
8 ch.sudo.cyberduck
9 com.Geezerbuttz.mtr
10 com.adobe.ARM
11 com.adobe.Acrobat.Pro
~~~ snip ~~~
174 org.mozilla.crashreporter
175 org.mozilla.firefox
176 org.mozilla.thunderbird
177 org.sil.Ukelele
178 org.smfr.mtnw
179 org.videolan.vlc
180 org.videolan.vlc.LSSharedFileList
181 org.x.X11
182 pbs
183 widget-com.apple.widget.calendar
184 widget-com.apple.widget.weather
185 widget-com.apple.widget.worldclock
* **write:** Dieser Modus erfordert alle Argumente, wenn ein Schlüssel geändert werden soll. Das Kommando defaults write com.apple.finder _FXShowPosixPathInTitle -bool YES zB zeigt im Finder Fenster Titel den vollständigen UNIX Pfad an.\\ \\ Bei Strings ist die Angabe des Schlüsseltyps nicht erforderlich, bei anderen Typen gibt es die Flags -bool mit den Werten YES/NO bzw. TRUE/FALSE. -int für Ganzzahlen, -float für Gleitkommazahlen, -array für Felder, -dict für Dictionarys und -data für Hexadezimalzahlen. Beispiele finden Sie im folgenden Artikel: [[:mac:defaults_tweaks|-> Plist Tweaks]]
* **find:** Mit find kommen wir zu einem äusserst nützlichen Modus. Da, wie ich oben bereits erwähnte, das Defaults System schlecht dokumentiert ist, wie ich finde und manchmal nicht klar ist, in welche Preferences Datei eine bestimmte Einstellung geschrieben wird, muss man sich selbst auf die Suche machen. find - wie der Name schon sagt - kann mit weiteren kleinen Tricks dafür verwendet werden. Der Modus find durchsucht das gesamte Defaults System nach einen Stichwort, dabei werden Domainnamen, Schlüsselnamen und Werte berücksichtigt.\\ \\ Eine Möglichkeit die Änderungen am System bei einer bestimmten Einstellung in den Preferences Files nachzuvollziehen besteht darin, das Defaults System vor und nach seiner Änderung miteinander zu vergleichen. Es macht Sinn alles für dieses Vorhaben vorzubereiten, da schon alleine das Öffnen bestimmter PrefPanes eine Vielzahl von Änderungen im Defaults System vornimmt, die unser Ergebnis verfälschen könnten oder die Suche nach den eigentlich interessanten Dingen erschweren.\\ \\ Ich demonstriere das hier mal am Beispiel der Änderung des Systems Warntons in den Systeimstellungen im PrefPane Ton. Zuerst werden die kompletten Systemeinstellungen in eine Datei »vor« geschrieben (-> defaults read > vor). Im Anschluss wird die Änderung in den Systemeinstellungen vorgenommen, dann werden erneut die kompletten Systemeinstellungen in eine Datei »nach« geschrieben (-> defaults read > nach). Zuletzt werden diese beiden Dateien miteinander verglichen (-> diff vor nach):\\ $ defaults read > vor
~~~ Änderung der Systemeinstellunge ~~~
$ defaults read > nach
$ diff vor nach
12124c12124
< "com.apple.sound.beep.sound" = "/System/Library/Sounds/Funk.aiff";
---
> "com.apple.sound.beep.sound" = "/System/Library/Sounds/Frog.aiff"; Wir sehen jetzt, das der Schlüssel com.apple.sound.beep.sound heißt und der Wert vor der Änderung /System/Library/Sounds/Funk.aiff war und nach der Änderung /System/Library/Sounds/Frog.aiff ist. Aber wir wissen noch nicht in welcher Domain sich dieser Schlüssel befindet. Dafür nutzen wir jetzt den find-Befehl:\\ $ defaults find com.apple.sound.beep.sound
Found 1 keys in domain 'com.apple.systemsound': {
"com.apple.sound.beep.sound" = "/System/Library/Sounds/Frog.aiff";
} Wir sehen jetzt also, dass sich unser Schlüssel in der Domain com.apple.systemsound befindet. Jetzt können wir den write-Modus verwenden um unseren Test wieder auf die ursprüngliche Einstellung zurückzustellen:\\ \\ $ defaults write com.apple.systemsound com.apple.sound.beep.sound /System/Library/Sounds/Funk.aiff Und die Gegenprobe:\\ $ defaults read com.apple.systemsound com.apple.sound.beep.sound
/System/Library/Sounds/Funk.aiff
--- //pronto 2010/05/25 20:12//
Eine weitere Möglichkeit das (oder die) Preferences File(s) zu ermittel, welche für einen bestimmten Zweck verwendet werden, ist das Tool fseventer((http://www.fernlightning.com/doku.php?id=software:fseventer:start)), es eignet sich hervorragend um Dateisystem Aktivitäten zu visualisieren. Mit den passenden Filtern versehen, entsteht recht schnell ein Überblick was da wo gerade passiert. Im Falle der Preferences Files liegt es nahe den Filter auf .plist zu setzen:
{{ :mac:fseventer_ton.png?650 |}}
Wenn man die Aufzeichnung startet und im PrefPane Ton die Änderung vornimmt, wird sehr schnell ersichtlich, welche plist-Datei in die Sache verwickelt ist.
--- //pronto 2010/07/22 12:18//
{{keywords>preferences osx snow leopard prefpane nsglobaldomain}}