Tips&Tricks

Memory Profiling mit LLVM/Clang

Nachdem ich schon öfters über den Static Analyzer „LLVM/Clang“ gestolpert bin, wollte ich ihn auch mal auf meine iPhone App HappyDayz! ansetzen. Nebenbei habe ich diesen kleinen Artikel verfasst indem ich die Verwendung beschrieben habe. Ihr werdet - so wie ich - überrascht sein, was da alles zum Vorschein kommt. Nun schaue ich mir die problematischen Codestellen im Detail an ... Happy Fixing!

Zum Artikel

Safari und schöne Lesezeichen Trenner

Zoom image
Vor gut einem Jahr bin ich vom Firefox auf den Safari umgestiegen und habe es bisher noch nicht bereut. Eine Kleinigkeit hat mich allerdings schon immer ein wenig gestört: Die Bookmarks können im Safari visuell nicht voneinander getrennt werden.

Abhilfe schafft hier das kostenlose Safari Plugin Glims. Das verwende ich schon seit vielen Betas, aber diese Funktion ist mir erst jetzt aufgefallen. Mit dem Ergebnis (siehe Screenshot) bin ich sehr zufrieden! Warum kann das der Safari nicht von Haus aus?

Zoom image
Und wie funktioniert es? Als erstes muss Glims installiert werden. Dann legt man in Safari einen neuen Bookmark an ( + D) und gibt als Namen einen oder mehrere Bindestriche „-“ ein. Das wars! Über die Lesezeichenverwaltung von Safari können die angelegten Trenner per Copy/Paste dupliziert und an den passenden Stellen platziert werden.

Da man die Adresse des Lesezeichens in Safari nicht komplett löschen kann und ich auf „saubere“ Trenner stehe, habe ich diese in der Bookmarks.plist direkt gelöscht. Die Bookmarks.plist findet Ihr unter „HDD Benutzer $USER Library Safari“.
Zoom image

Tastatursteuerung angepasst

Vor über einem Jahr bin ich privat von einer Windows-Büchse zum Mac gewechselt. Das Einzige was mich immer noch am Mac stört ist die unterschiedliche Cursorsteuerung per Tastatur. Die Windows/Linux typische Steuerung ist bei mir nach Jahren in Fleisch und Blut übergegangen. Da ich beruflich den ganzen Tag mit Java unter Linux entwickle und den Cursor sicherlich ein paar tausend mal pro Tag hin und her scheuche, ist es für mich fast unmöglich mich daran zu gewöhnen bzw. einen Schalter umzulegen je nachdem vor welchem Rechner ich sitze. Das muss sich ändern ...

[Zum Artikel]

CVS und binäre Dateien

bash
CVS speichert bei einem Commit nur die Differenzen zur Vorgängerversion. Dies macht bei binären Dateien (nib-Dateien, Bildern, PDF's, usw.) keinen Sinn bzw. zerstört diese unter Umständen (new lines). Deshalb werden solche Dateien wie folgt hinzugefügt "cvs add -kb bild.png". Damit man dies nicht für jede Datei machen muss und es auch nicht vergisst, verwendet CVS eine Datei Namens ".cvswrappers". Hier kann unter anderem für bestimmte Dateiendungen festgelegt werden, dass diese als binäre Dateien behandelt werden sollen.

Ich habe meine wieder in meinem Home-Verzeichnis abgelegt und sie hat momentan folgenden Inhalt:

*.nib -k 'b'
*.tiff -k 'b'
*.gif -k 'b'
*.png -k 'b'
*.pdf -k 'b'

CVS und ".DS_Store"-Dateien

bash
Wer wie ich mit dem Finder arbeitet, wird sich sicherlich schon über die ".DS_Store"-Dateien in seinen Projekt-Verzeichnissen geärgert haben. Die möchte man natürlich nicht in das Repository mit aufnehmen. CVS verwendet in diesem Zusammenhang eine Datei Namens ".cvsignore". Das CVS-Tool liest diese Dateien und ignoriert alle Dateien die darin zeilenweise aufgeführt sind. Diese kann man in spezialisierten Versionen in den einzelnen Verzeichnissen anlegen und committen. Für Dateien die in allen Verzeichnissen und allen Repositories ignoriert werden sollen, kann man sie auch im Home-Verzeichnis anlegen.

Meine "~/.cvsignore" sieht momentan noch so aus:

# ignore the build directories
build
# ignore the .DS_Store files
.DS_Store
# ignore the IB temp files
*~.*

CVS mit Xcode 3.0

icon_xcode
In dem Artikel von heute Morgen "SSH und CVS im Terminal" habe ich schon einmal die Grundlagen geschaffen, damit ich von meinem Mac auf ein CVS-Repository (welches auf einem Linux-Rechner gehostet ist) zugreifen kann. Nun geht es darum wie ich dieses mit Xcode 3.0 verwenden kann. Im Xcode heisst die Versionsverwaltung SCM. Das Akronym SCM steht dabei für "Software Configuration Management".

Damit das SCM benutzt werden kann, muss es erst einmal in Xcode eingerichtet werden. Dazu geht man erst mal zu den SCM-Einstellungen: "Xcode | Preferences | SCM".

In dem Reiter "Repositories" habe ich - um an dem Beispiel von heute Morgen zu bleiben - folgendes in das Feld "Root:" eingetragen: ":ext:hansi@213.55.44.33:/cvs". Xcode parst den Feldinhalt und trägt die Werte in die entsprechenden Felder ein. Die Methode "ext" verwende ich wegen dem SSH-Zugriff. Das Feld Passwort und den Port konnte ich leer lassen. Im Feld "Tool:" steht "/usr/bin/cvs". "Use RSH instead of SSH" ist nicht aktiviert.

In dem Reiter "SSH" steht als Key der Pfad zu meinem privaten Schlüssel "~/.ssh/id_dsa". Im gleichen Reiter habe ich auch noch die "Passphrase" von heute Morgen eingegeben.

Sind alle Daten korrekt eingegeben, dann zeigt dies Xcode in dem Reiter "Repositories" mit dem grünen Punkt und dem Text "Authenticated" an. In der Xcode Menüleiste kann nun über "SCM | Repositories" auf das existierende CVS-Repository zugegriffen werden.

SSH und CVS im Terminal

bash
Für mein erstes Projekt "Automobile Manager" möchte ich natürlich gleich auf mein bereits, vorhandenes Versionskontrollsystem "CVS" zugreifen. Dies läuft auf dem gleichen Linux-Rechner wie diese Webseite und steht von überall zur Verfügung. Da "meine" Administratoren den direkten Zugriff nicht erlauben, muss ich den Weg über SSH gehen. Wie nicht anders zu erwarten war, läuft der SSH-Daemon natürlich nicht auf dem Standard-Port 22. Hier sind nun ein paar Schritte die das Leben erleichtern.

Bsp. Linux Benutzer : hansi
Bsp. Linux IP : 213.55.44.33
Bsp. Linux SSH-Port : 12345

Ohne Passwort-Eingabe auf den Linux-Rechner zugreifen
Wenn ich mich bisher auf meinem Linux-Rechner anmelden wollte, musste ich "slogin -p 12345 hansi@213.55.44.33" eingeben und mit dem Benutzer-Passwort bestätigen. Die folgenden Schritte ermöglichen schon einmal das Anmelden ohne Passwort:
  • Auf dem Mac das Terminal öffnen
  • Nun muss der private sowie der öffentliche Schlüssel generiert werden. Dies geschieht durch Eingabe von "ssh-keygen -t dsa". Den Speicherort für die beiden Dateien einfach per Eingabetaste bestätigen. Die "Passphrase" muss dabei nicht eingegeben werden, ist aber sinnvoll! Im Anschluss sollten in dem Verzeichnis "~/.ssh" die beiden Dateien "id_dsa" und "id_dsa.pub" vorliegen
  • Der öffentliche Schlüssel "id_dsa.pub" muss nun unter dem neuen Namen "authorized_keys2" in das "~/.ssh"-Verzeichnis des Linux-Benutzers kopiert werden. Dies geht über den Befehl "scp -P 12345 ~/.ssh/id_dsa.pub 213.55.44.33:.ssh/authorized_keys2". Die Port-Angabe "-P 12345" brauche ich nur, weil der SSH-Daemon nicht auf dem Standard-Port 22 läuft.
Jetzt kann ich schon einmal ohne Eingabe eines Passwortes auf dem Linux-Rechner anmelden.

Ohne Eingabe des SSH-Ports zugreifen
Damit nicht immer der SSH-Port eingeben werden muss, nutzen die SSH-Tools die Konfigurationsdatei "~/.ssh/config". Sie muss allerdings erst noch mit einem Editor angelegt und gefüllt werden. Die Konfigurationsdatei bekommt folgenden Inhalt:

Host 213.55.44.33
    Compression no
    Port 12345

Nun kann ich mich mit "slogin hansi@213.55.44.33" ohne Eingabe des Ports oder eines Passwortes auf dem Linux-Rechner anmelden. So sollte das sein!

CVS Zugriff
Ich greife nur auf das CVS-Repository meines Linux-Rechners zu und möchte das auch so komfortabel wie möglich haben. Dazu gibt es zwei Möglichkeiten.
Man trägt die CVS-Umgebungsvariablen (CVSROOT und CVS_RSH) in die Datei "~/.profile" ein oder man erstellt die Datei ".MacOSX/environment.plist". Die ".profile"-Variante hat den Nachteil dass diese dann nur innerhalb einer Terminal-Sizung gesetzt sind. Bei der zweiten Variante können auch andere Anwendungen als das Terminal diese benutzen. Ich habe mich für die zweite entschieden. Dabei enthält diese plist-Datei folgenden Inhalt:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CVSROOT</key>
    <string>:ext:hansi@213.55.44.33:/cvs</string>
    <key>CVS_RSH</key>
    <string>/usr/bin/ssh</string>
</dict>
</plist>


Im Terminal kann nun nach einem erfolgreichen "cvs login" das CVS wie gewohnt benutzt werden. So langsam geht es voran!