Alex Online Today

some experience to be shared

By

$PATH unter Mac OS X

Was ist $PATH
Die $PATH Variable definiert, in welchen Verzeichnissen ausführbare Dateien d.h. per Befehl ausführbare Programme, abgelegt sind, sowie die Reihenfolge in welcher diese Verzeichnisse nach ausführbaren Dateien durchsucht werden.
$PATH besteht aus Einträgen des Systems, die für alle Benutzer gleich sind (systemweit), sowie individuellen Benutzereinträgen (benutzerspezifisch).
Die $PATH Variable gibt es übrigens nicht nur unter OS X sondern auf quasi allen Unix und Linux Systemen und auch unter Windows. Die Funktion ist hierbei allgemein die Gleiche – nur wie und wo $PATH definiert wird ist unterschiedlich. Die folgende Anleitung beschreibt das Verhalten unter OS X 10.5 bis 10.8.

1. $PATH auslesen
Um $PATH zu auszulesen öffnet man ein Terminal Fenster (Spotlight –> “Terminal”) und gibt folgenden Befehl ein:

echo $PATH

Man erhält dann beispielsweise folgende Ausgabe:

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin:/usr/local/git/bin:/usr/local/MacGPG2/bin:/usr/texbin

2. $PATH Syntax
Die Variable besteht aus einer Aneinanderreihung von Verzeichnispfaden, die durch einen Doppelpunkt “:” getrennt sind.
z.B. sind /usr/bin und /bin Standardverzeichnisse des Systems. Dort finden sich auch Programme wie “echo” -> wie wir es zur Anzeige von $PATH gerade verwendet haben. Wichtig ist folgendes – je früher ein Verzeichnis in $PATH auftaucht, desto höher ist seine Priorität.

Ein Beispiel:
Das Programm echo liegt standardmäßig im Verzeichnis /bin. Wird nun ein weiteres Programm mit dem Namen echo in /usr/local/bin abgelegt, so hat das Programm echo im Verzeichnis /bin immer vorrang, denn bei der Auführung wird beim Auffinden eines passenden Programms im $PATH die Suche abgebrochen. Wenn nun in Zukunft die Programme in /usr/local/bin vorrangig ausgeführt werden sollen, muss man $PATH ändern in etc/paths

3. $PATH systemweit anpassen
Seit Mac OS 10.5 Leopard wird $PATH durch das Programm /usr/libexec/path_helper verwaltet. path_helper wird durch /etc/profile beim Öffnen eines neuen Terminal Fensters ausgeführt.

1. Die Einträge der Datei /etc/paths
/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin

2. Die Einträge in allen Dateien im Verzeichnis /etc/paths.d/
– Hier hinterlegen häufig Frameworks ihre Pfad-Einträge, z.B. von git oder LaTex
– Diese Einträge werden in Alphabetischer Reihenfolge hinzugefügt
– Eine Datei muss mit einer leeren Zeile enden

Die Dateien sind für gewöhnlich schreibgeschützt und die Verzeichnisse versteckt. Am besten man arbeitet im Terminal:
a) Navigation zu den Ordnern:

> cd /bin

b) Editieren mit vim (sudo für root Rechte)

>sudo vi paths

Nütliche Befehle in vim sind:
i Editieren der aktuellen Zeile
dd Löschen der aktuellen Zeile
i und dd werden mit esc beendet.
:q! Beenden (explizit ohne Speichern der Änderungen)
:wq! Beenden und speichern einer readonly Datei

4. Benutzerdefinierte Einträge in $PATH
Vor dem Öffnen eines neuen Terminal Fensters werden werden die Datein .profile und .bash_profile (in dieser Reihenfolge) im Benutzerordner (~) des aktuellen Nutzers ausgeführt. Es handelt sich um versteckte Dateien (beginnend mit ‘.’) weshalb man sie normalerweise im Finder nicht sieht. Um sie im Terminal anzuzeigen geht man folgendermaßen vor:
a) Navigation zum Benutzerverzeichnis:

>cd ~

b) Anzeigen aller Dateien

> ls -a

Um die Dateien zu bearbeiten, nutzt man am besten wieder vim
c) Bearbeiten mit vim (ohne root Rechte)

vi .profile

In diesen Dateien kann durch den Eintrag

export PATH=$PATH:/newpath

die $PATH Variable für diesen Benutzer erweitert werden. Den bestehenden $PATH stellt man für gewöhnlich vorne an.

By

Automatisches Backup von FAT32 USB Sticks auf dem Mac

Leider unterstützt die hervorragende Backuplösung von Apple – Time Maschine – keine FAT32 formatierten USB Sticks als Quellmedien. Gerade bei diesen kleinen Dingern ist die Wahrscheinlichkeit eines Verlustes jedoch besonders hoch, weshalb man entweder gar keine kritischen Daten darauf speichern, oder regelmäßig Backups erstellen sollte.

Mein Ziel: Bei jedem Anstecken des USB Sticks wird der gesamte Inhalt automatisch via AppleScript und rSync auf ein Verzeichnis auf meinen Mac kopiert. Vor korrupten Dateien schützt mich dann das automatische Time Maschine Backup.

Ich bin natürlich nicht der erste, der sich mit der Thematik befasst. Im Internet fand  zwei etwas angestaubte Einträge, einer beschrieb eine Lösung mit AppleScript und dem Tool “Do Something When” [Link1], der andere mit einer FolderAction im Volumes Verzeichnis und einem Script auf jedem USB Stick [Link2]. Wem meine Lösung nicht gefällt, der wird eventuell dort glücklich.

Der Ansatz mit der FolderAction und einem Script auf dem USB Stick gefällt mir am besten. Allerdings habe ich das Script ein wenig für meine Bedürfnisse angepasst, da ich das Archivieren der Daten im Endeffekt Time Maschine überlassen möchte. Ausserdem habe ich eine Abfrage eingebaut, denn das Script startet in der ursprünglichen Form beim Anschließen eines Datenträgers ohne Rückfrage das Script rsync.app vom Stick, was Sicherheitstechnisch bedenklich ist.

Also folgend meine Lösung: (Der Code wurde größtenteils von hier kopiert und modifiziert)

Teil 1: Das Folderaction Script:

property backup_script : "rsync.app" (* add/change this string to match the name of your script *)
 
on adding folder items to this_folder after receiving these_volumes
tell application "Finder"
try
set the volume_list to every file of this_folder
 
(* go through all entries in /Volumes/ *)
repeat with i from 1 to number of items in volume_list
set this_item to the original item of item i of volume_list
if the kind of this_item is "Volume" then
set this_disk to (this_item as alias)
 
(* is this item the newly mounted disk? *)
if this_disk is in these_volumes then
 
(* iterate through all files in the root of disk *)
set searchCmd to "ls -d " & quoted form of POSIX path of this_disk & backup_script
(* check to see if a backup script is available *)
set searchResult to ""
try
set searchResult to do shell script searchCmd
end try
(* run the backup script *)
if (searchResult starts with "/Volumes") then
set backupFile to POSIX file searchResult as alias
display dialog "Backupscript auf Volume gefunden, backup ausführen?" buttons {"JA", "NEIN"} default button 2 with icon stop
if button returned of result is "NEIN" then return
open backupFile
end if
 
end if
end if
end repeat
on error error_message number error_number
if the error_number is not -128 then
display dialog error_message buttons {"OK"} default button 1
end if
end try
end tell
end adding folder items to

1. Kopiere das Script in den Script Editor

2. Speichern als… “Script” unter /Library/Scripts/Folder Action Scripts/

3.-  Mit 10.6 und folgenden: Öffne im Finder die Systempartition

Rechtsklicke auf /Volumes und wähle im Kontextmenü Folder Action Setup

– Mit 10.5 und früher: Öffne den Finder und wähle Gehe zu Ordner > /Volumes/

Öffne Folder Actions Setup (aus dem Dienstprogrammen)

Dragge das Ordnericon aus der Titelleiste des Finder Fensters auf das geöffnete Formular und klicke OK

4. Wähle im Dialogfenster das gespeicherte Script aus.

Teil 2: Das Script auf dem Datenträger

property display_notification : false
property backup_target : "Documents/Backups/" (* MUST be a folder location with trailing slash! Always relative to home folder *)
 
property rsync_params : "-aEz --delete-excluded"
(* END OF PREFERENCES *)
 
set WhereImRunningFrom to path to me
tell application "Finder"
 
(* NEVER run from the hard drive! comment: nice feature, thats why it stays!*)
set bootVolume to name of disk of home (* safety feature! *)
set NameOfDisk to name of disk of WhereImRunningFrom
if NameOfDisk is bootVolume then
beep
display alert "Should not run this script from the boot volume!"
return
end if
 
(* setup backup dir *)
set homeDir to path to home folder from user domain
set backup_folder to POSIX path of homeDir & backup_target
try
(* quick and dirty check to see if folder exists - must be a good way to do this in applescript? *)
do shell script "cd " & backup_folder
on error
try
do shell script "mkdir " & backup_folder
on error
display alert "There was an error creating the backup folder " & backup_folder
return
end try
end try
 
(* find source and target *)
set backupBase to NameOfDisk & "-Backup"
set targetDir to backup_folder & quoted form of backupBase
set sourceDir to quoted form of ("/Volumes/" & NameOfDisk & "/")
end tell
 
(* do the backup *)
 
set excluded to " --exclude='.Trash*' --exclude='.Spotlight*'  "
 
set theScript to "rsync " & rsync_params & excluded & sourceDir & " " & targetDir & "; touch " & targetDir
 
do shell script theScript
 
activate of me
beep
if display_notification then display alert NameOfDisk & " drive backed up"

1. Kopiere das Script in den Script Editor

2. Ändere die Konstante backup_targets, beachte dass das Script keine Adminrechte hat und deshalb nur in den Benutzerordner speichern kann!

3. Speichere das Script auf dem USB Stick als Application mit dem Namen rsync.app (oder dem Namen, der im anderen Script angegeben ist).

4. Teste ob es funktioniert! Beim erneuten Anschließen des USB Sticks sollte eine Warnung erscheinen, die fragt ob ein Backup erstellt werden soll.

By

Eigenes Keyboardlayout auf dem Mac

Wer einmal an einem Rechner in der Fremde arbeiten durfte, hat sicher erlebt, dass die Layouts der Tastaturen auf der ganzen Welt leichte bis mittelschwere Unterschiede aufweisen. Oft nervt das einfach nur, bei genauerer Betrachtung gibt es aber durchaus Layouts die Vorteile mit sich bringen. Während ich z.B. dem amerikanischen Layout relativ wenig abgewinnen kann (aufgrund der seltsamen Enter Taste), bin ich ein großer Fan des britischen Layouts. Deshalb bin ich jetzt umgestiegen. Einziges Problem für mich: Ich kann mich nicht an die Z/Y – Vertauschung gewöhnen, zumal ich abwechselnd auch immer deutsche Tastaturen verwende und: Schreiben der Umlaute mit Alt + U + Buchstabe ist mir definitiv zu umständlich.

Mac OS bietet  jedoch eine recht simple Lösung. Seit OS 10.2 unterstützt Mac OS das Verwenden eigener Unicode Layouts. Das Layout wird im XML Format gespeichert.


Man kann Keyboard Layouts unter Library ~ Keyboard Layouts ~ speichern.

Um jedoch nicht selbst die XML Datei bearbeiten zu müssen gibt es ein nette Freeware namens Ukulele.
Mit ihr lässt sich im Handumdrehen aus einem vorhandenen Layout ein neues erstellen. Dazu kann man einfach neue Befehle aus dem Mac OS Character Viewer auf das virtuelle Keyboard von Ukulele draggen und ein neues Layout erstellen.

Ich verwende z.B. Alt + O, U, A, S für Umlaute und habe Z und Y vertauscht. Ansonsten halte ich mich weitgehendst an das Britische Layout.
In diesem Zusammenhang möchte ich auch gerne auf das Simplified Dvorak Layout hinweisen. Ein optimiertes Tastatur Layout, das die am häufigsten verwendeten Buchstaben so anordnet, dass ein schnelleres Schreiben möglich wird. (Wenn man sich die Zeit nimmt, sich selbst darauf einzustellen).

Wünsche ein schönes, sonniges und erholsames Wochenende!

EDIT (2014): Das gleiche für Windows:
Da ich beruflich mit Windows Devices arbeite, mich aber sehr an mein eigenes Layout gewöhnt habe. Unter Windows gibt es ein kostenfreies Tool direkt von Microsoft, den Microsoft Keyboard Layout Creator. Download hier: http://msdn.microsoft.com/de-de/goglobal/bb964665.aspx

By

PostgreSQL 8.4 Autostart auf Mac OS 10.4 – 10.x abschalten!

Nervt das, wenn PostgreSQL auf dem Mac immer im Hintergrund läuft?

Dabei ist es wirklich einfach den Autostart abzuschalten. Der Mechanismus welcher sich dahinter verbirgt ist der LauchDaemon der seit 10.4 in Mac OS integriert ist.

Man öffnet die Datei /Library/LaunchDaemons/com.edb.launchd.postgresql-8.4.plist
mit einem plist Editor (z.B. TextWrangler, TextMate).

Dort ändert man folgenden Eintrag

<key>Disabled</key>
<false/>

auf

<key>Disabled</key>
<true/>

Und speichert die Datei ab.

Und wie startet/stoppt man den PGSQL – Server?

Unter /Library/PostgreSQL/8.4/scripts findet man ein start.applescript und ein stop.applescript Datei.
Diese öffnet man jeweils mit dem Scripteditor und speichert sie z.B. auf dem Desktop als startPGSQL.app ab.

Applescript als App speichern

Jetzt muss man sie nur noch ausführen et voilá! Man hat wie gewünscht die volle Kontrolle über seinen PostgreSQL Server.