MySQL in Cocoa mit Objective-C nutzen

Da Objective-C auf C basiert, kann man die C-API für den Zugriff auf eine MySQL-Datenbank nutzen.
Damit dies funktioniert, müssen jedoch die entsprechenden Header im Cocoa-Projekt mit verlinkt werden. Ausserdem muss die libz.dylib eingebunden werden.

Damit unsere Applikation die entsprechenden Header-Dateien und Bibliotheken finden kann, müssen sie in den Build-Settings eingestellt werden.
Dazu das aktive Target auswählen und oben im Reiter auf Build klicken.
Folgende Werte müssen geändert werden

  • Header Search Paths: Der Pfad zum include-Verzeichnis der MySQL-Installation (in der Regel »/usr/local/mysql/include«)

  • Library SearchPaths: Der Pfad zum lib-Verzeichnis der MySQL-Installation (in der Regel »/usr/local/mysql/lib«). Ausserdem sollte der Pfad zur libz.dylib («/usr/lib/libz.dylib«») angegeben werden.

  • Other Linker Flags: -lmysqlclient

Die Build-Settings des Target

Da leider das Einbinden der libz.dylib über nicht immer reicht, sollte man die aktuelle Version zum Projekt hinzfügen. Um die aktuelle Version heraus zu finden im Terminal mit cd /usr/lib in das Verzeichnis wechseln und dort dann ein ls -la durchführen, um sehen zu können, auf welche Datei der Symlink libz.dylib zeigt.

Nun im Finder mittels Gehe Zu > Gehe zum Ordner… in das Verzeichnis /usr/lib wechseln und die Datei in unser Cocoa-Projekt wechseln.
Copy items into destination group’s folder (if needed) wählen und bestätigen.

Nun muss nur noch in den Klassen, in denen auf die Datenbank zugegriffen werden soll, die Header-Datei »mysql.h« importiert werden.

Anmerkung: der Build-Style Development verursacht oft Probleme, oder Fehlermeldungen. Diese treten jedoch im Deployment nicht auf. Daher wechsle ich meist direkt zu Deployment, da ich nur dort sehen kann, ob »richtige« Fehler vorhanden sind.

Bugfix in All My Documents 1.2

Deutsch

Aus aktuellem Anlass mal wieder ein mehrsprachiger Artikel ;)
Ich war dieses Mal ein wenig zu schnell, was das Veröffentlichen des neuen Releases angeht. Das Problem lag darin, dass es bei diesem Release einfacher war, (fast) komplett von vorne anzufangen, statt den alten Code zu verwenden, da das Projekt nun mit Bindings realisiert wurde.
Leider habe ich eine kleine, aber wichtige Funktion übersehen und somit erst jetzt eingebaut: das Verhalten des Fensters, wenn es erneut geöffnet wird.
Ich habe heute Nachmittag ein Update der Version auf Sourceforge gemacht.
Wer sich also die neue Version schon vorher geladen hat, sollte bitte ein Update machen und sich die 1.2 noch einmal laden.

English


Today I updated the version at sourceforge because of a little bug with the window’s reappereance after closing.
If you downloaded the 1.2 before, just reload it and install it over the existing one.

Neue Projektseite | New project-site for All My Documents

Deutsch

Da man mit Textpattern leider nicht gut multilingual arbeiten kann, ist dieser Beitrag halt in zwei Sprachen aufgebaut. Der Grund ist der, dass immer mehr Benutzer nach einer englischsprachigen Produktseite fragen.
Diese ist nun unter der Sourceforge-Projektseite erreichbar.

English

Because of the great request for an english documentation/project-site I created a Sourceforge project-site (incl. usage instructions).
For more information about All My Documents please follow the link above.

Umlautproblem gelöst

All My Documents 1.2 spricht nun auch wieder richtig Deutsch – wie genau der Fehler zustande kam, konnte ich bisher noch nicht nachvollziehen.
Die Lösung war einfach: ich habe den Inhalt der strings-Dateien einmal in Subethaedit geladen und das Encoding dort eingestellt. In XCode habe ich die Datei dann auf UTF-8 gestellt (komisch, dass damit Umlaute richtig kodiert werden) und nun geht es.
Ausserdem wurde noch der Bug im Drag‘N Drop-Verhalten behoben, so dass es nun auch wieder ohne Probleme funktioniert, ebenso wie das Löschen von Dateien, wenn eine Sortierung vorliegt.
Die neue Version liegt nun auch schon bei Sourceforge zum Download bereit.

All My Documents geht in die nächste Runde


Leider ist die deutsche Lokalisierung aufgrund eines Bugs?! in der neuen XCode-Version etwas verstümmelt — ich werde aber binnen der nächsten Tage ein Downgrade machen und dies somit beheben.

Neue Features

  • eine »Bibliothek« in der alle Dokumente angezeigt und durchsucht werden können

  • Dokumente durch Drag’n Drop hinzufügen

  • Mehrere Dokumente gleichzeitig verschieben, löschen oder öffnen

Für das nächste Release sind schon AppleScript-Support und (vielleicht) eine Vorschau-Version geplant.

Download über Sourceforge

XCode 2.2 kann keine Umlaute?!

Vor kurzer Zeit habe ich ein Update auf XCode 2.2 gemacht – eigentlich läft auch alles ganz prima. Als ich jetzt allerdings den letzten Schliff (Lokalisierung für die deutsche Sprache) hinzufügen wollte, kam das böse Erwachen: egal, welches Encoding ich gewählt habe, die Umlaute wurden einfach nicht dargestellt.
Im Netz habe ich dazu leider nichts entsprechendes gefunden. Ich bin für jeden Tipp sehr dankbar.
Ansonsten heisst es demnächst halt „Dokument oeffnen“, statt „Dokument öffnen“. – Sorry!

Cocoa: Intelligente Ordner mit NSPredicate

In der Regel hat man eine Liste von Objekten, deren Inhalt man darstellen möchte, in einem NSArray oder NSMutableArray gespeichert und greift über die Indizes auf die Inhalte zu, um sie in einer Tabelle oder ähnlichem Darzustellen.

[more]

Beispiel:

Man hat eine Klasse Adresse, in der Name, Vorname und Telefonnummer gespeichert werden (ich gebe zu, ich bin sehr kreativ, was Beispiele angeht ;) ).
In dieser Klasse werden nun nur die entsprechenden Member-Variablen angelegt und die dazugehörigen Getter- und Setter-Methoden.

@interface Adresse : NSObject {
NSString *_name;
NSString *_vorname;
NSString *_telefon; //Wir nehmen einen String, da auch Sonderzeichen enthalten sein können
}

	

- (NSString *)name; - (void)setName:(NSString *)newName;

- (NSString *)vorname; - (void)setVorname:(NSString *)newVorname;

- (NSString *)telefon; - (void)setTelefon:(NSString *)newTelefon;

@end

Die Implementierung beinhaltet nur die entsprechenden Getter- und Setter-Methoden, daher werde ich sie hier nicht einfügen.

Um die Adressen zu verwalten, legen wir einen Controller an, der über die üblichen Accessoren für ein Array verfügt:

@interface AdressController : NSObject {
NSMutableArray *_adressen;
}

	

- (NSMutableArray *)adressen; - (void)setAdressen:(NSMutableArray *)newAdressen;

- (unsigned int)countOfAdressen; - (id)objectInAdressenAtIndex:(unsigned int)index; - (void)insertObject:(id)anObject inAdressenAtIndex:(unsigned int)index; - (void)removeObjectFromAdressenAtIndex:(unsigned int)index; - (void)replaceObjectInAdressenAtIndex:(unsigned int)index withObject:(id)anObject;

@end

Die Implementierung bleibt wieder einmal bei euch ;)

Um nun Intelligente Ordner für die Adressen anlegen zu können (z. B. alle Adressen, deren Name mit „Be“ beginnt, benötigen wir erst einmal eine Klasse für die Ordner:

@interface smartFolder : NSObject {
NSPredicate *_predicate; //Unser Predicate zur Filterung des Arrays
}

	

- (NSPredicate *)predicate; - (void)setPredicate:(NSPredicate *)newPredicate;

- (NSArray *)adressen; //Hier werden die gefilterten Adressen ausgegeben @end

Um auf die Adressen zugreifen zu können, benötigen wir die jeweils aktuellen Adressen des AdressController. Also fügen wir in diesem eine statische Variable sharedAdressController hinzu, sowie eine Methode _+ (AdressController *)sharedAdressController_

//nach @implementation fügen wir eine statische Variable ein und weisen ihr den Wert nil zu
static sharedAdressController *sharedController = nil;

//in der Init-Methode weisen wir sharedAdressController uns selbst zu - (id)init {

if (self = [super init]) { //hier erfolgen Zuweisungen } sharedAressController = self; return self; }

//Implementierung der Methode für unser Singleton + (AdressController *)sharedAdressController { @synchronized(self) { if (sharedAdressController == nil) { sharedAdressController = [[self alloc] init]; } } return sharedAdressController; }

Nun können wir nach einem Import der Klasse in unserem „SmartFolder“ auf die Instanz zugreifen und so die aktuellen Adressen bekommen.

-(NSArray *)adressen
{
NSArray *gefiltert = [[[AdressController sharedAdressController] adressen] filteredArrayUsingPredicate:[self predicate]];
return gefiltert;
}

Durch die Methode filteredArrayUsingPredicate: kann man ein Array mittels eines Ausdrucks (ähnlich SQL) filtern und so ein Array mit den entsprechenden Werten erhalten.
Wollen wir einen Intelligenten Ordner erstellen, der alle Adressen enthält, deren Name mit „Be“ beginnt, so könnten wir den Ausdruck SELF.name beginswith[c] 'be' verwenden.
Es können aber auch genauso Reguläre Ausdrücke oder die Operatoren < > || && usw verwendet werden.

Mehr Informationen über NSPredicates erfahrt ihr im Predicates Programming Guide bei Apple Developer

Windows goes OS X

Bei der Planung und Gestaltung des neuen Windows Vista, Nachfolger von XP, hat man sich anscheinend ein wenig von Mac OS X inspirieren lassen.
Nicht nur, dass die Oberfläche nun in einem hübschen neuen „Aqua-Look“ erscheint, selbst das Icon des Links The Experience auf der Produktseite sieht verdächtig nach einem iMac aus.
Natürlich musste man sich auch ein paar andere „neue“ Features einfallen lassen – z. B. eine Desktop-Suche mit Quick Search Box, oder Widgets, die einem das aktuelle Wetter anzeigen. Neu war mir in dieser Hinsicht, dass Mac OS X keine Widgets – dieser Begriff steht nämlich laut diesem Artikel für „Windows Gadgets“, sondern Gadgets hat (und davon ja angeblich auch nur 14).
Vista heisst es wahrscheinlich nur, weil „IBM“ (Inspired By Mac) schon vergeben war ;)

Ankündigung von All My Documents 1.2

Euer Feedback und aucch einige Feature-Request haben mich motiviert, AMD weiter zu entwickeln.
Ich denke, dass es Version 1.2 in den nächsten Tagen zu einem stabilen Release schafft.
Neue Funktionen sind unter anderem:

  • eine Bibliothek, in der alle Dateien angezeigt/durchsucht werden können

  • Dateien können aus dem Finder heraus direkt auf die »Dokument« – Tabelle gezogen werden — funktioniert auch mit mehreren Dateien

  • Dokument(e) hinzufügen öffnet einen Datei-Browser, mit dem sich eine oder mehrere Dateinen auswählen lassen

  • Warnung, wenn eine Datei bereits hinzugefügt wurde

  • mehrere Dateien gleichzeitig öffnen (bei Mehrfachauswahl)

  • Doppelklick auf die entsprechende Zeile öffnet die Datei — egal, welche Tabellenspalte man wählt

  • In den Einstellungen kann man wählen, welche Informationen (Pfad, Dateigröße, etc) man direkt in der »Dokumententabelle« angezeigt bekommen möchte

  • individuelle Icons für Kategorien

Bis jetzt wird die neue Version noch getestet und läft schon recht stabil. Sobald sie ausreichend getestet wurde wird sie hier natürlich zum Download bereitgestellt ;)

Für die nächsten Releases werden wahrscheinlich

  • eine Vorschaufunktion für Bilder, Textdateien (auch RTF) und PDF

  • individuelle Hintergrundfarben für Dokumente

  • Sortieren der Dokumente nach Tabellenspalten
    anfallen. Neuigkeiten zu den aktuellen Releases kriegt ihr hier, oder auf der All My Documents bei Sourceforge

Schnelle Bildbearbeitung mit Upload

Ein Bild für das Web bereit zu stellen bedeutet in der Regel, es erst einmal in Photoshop, Gimp oder ähnlichem zu öffnen, es dort zu verkleinern oder zu beschneiden und nach dem Speichern ein FTP-Programm zu öffnen um das bearbeitete Bild hochzuladen.
Mac-Besitzer schaffen das durch Image Well deutlich schneller — in den Einstellungen einen oder mehrere FTP-Zugänge speichern, Bild auf das Icon im Dock ziehen, bearbeiten, aus der Liste den FTP-Account wählen und auf »senden« klicken.
Die Bilder können dabei nicht nur aus dem Finder, sondern auch aus anderen Programmen (z. B. Safari) durch Ziehen auf das Icon in Image Well geöffnet werden.

Update vom 30.11.2009: Imagewell ist mittlerweile keine Freeware mehr. Eine hübsche Alternative ist Skitch