Wunderschöne APIs

written by Martin Häcker on

Dokumentation.

Den vergleich zwischen Dokumentation und dem Austausch von Körperflüssigkeiten spare ich mir jetzt. Wahr ist er aber trotzdem.

Vergleicht man die Python und die Cocoa Dokumentation dann fällt bei Cocoa recht schnell auf das es keine klare Trennung gibt in High level Dokumentation und Klassenspezifische Dokumentation während das bei Python gemischt ist.

Dazu kommt das bei Python oft die high level Beispiele fehlen und es von der Referenz-Dokumentation keinen Link auf die komplette Listung der Methoden eines Objekts gibt.

Zwar kann man dann in Python oft auf den interpreter zurückgreifen und sich von dort aus noch mehr informationen über ein Objekt holen - das ist aber ganz schön aufwendig.

High Level Dokumentation: Cocoa++, Python--

Wenn es um die Klassenbasierte Doku geht hat Cocoa auch eindeutig die Nase vorne. Alle Methoden sind immer nach Topics geordnet. NSArray zum Beispiel startet mit einer Liste der Fakten über die Klasse (in welchem file definiert, ab welcher Version des Frameworks verfügbar, welche High-Level Guides gehören dazu) und fährt dann erst einmal mit einem Überblick über den Zweck der Klasse fort der auch gleichzeitig die wichtigsten Methoden der Klasse erklärt.

Danach kommt immer der Guide was man beachten muss wenn man eine Subklasse davon anlegen will. (Was erfordern kann dass man ein bestimmtes set von Methoden immer gleichzeitig ĂĽberschreiben muss, da in Cococa gerne Class Clusters eingesetzt werden - ein Konzept das ich in Python leider noch gar nicht gefunden habe.

Dann kommt der für die tägliche Arbeit für mich wichtigste Teil der Dokumentation: Tasks. Hier sind alle Methoden des Objekts nach den Aufgaben sortiert die man mit ihnen erledigt.

Creating an Array, Initializing an Array, Querying an Array, Comparing, Sorting, ...

So findet man schnellstens heraus was das Objekt anbietet für das was man tun möchte.

Ergo: Dokumentation in Python ist ganz schön mies - in Trac fehlt sie sogar ganz :/

Kunst und Programmierung: Was macht APIs schön?

written by Martin Häcker on

Und wieder mal heiĂźt es: Python/Trac oder Cocoa? Wer wird gewinnen?

Erkundbarkeit der Frameworks ist mein nächstes Thema: Die Klassen die bestimmte Aufgaben haben sollen leicht zu finden sein.

Das funktioniert bei Trac in der Regel sehr gut, da man in Python sehr schön über Packages hierarchische Namensräume definieren kann - ähnlich wie bei Java eben auch.

Nur dass es dort etwas Taktvoller eingesetzt wurde.

Das heiĂźt es gibt trac.wiki trac.tickets trac.timeline etc. Wenn man den Code zu einem Feature sucht, kann man ihn auch schnell finden.

Ganz im Gegensatz zur Standard Library von Python - da ist alles Kraut und Rüben - wenn man mal eben versucht alle Klassen die was mit String-Verarbeitung oder mit ein und Ausgabe zu tun haben, dann kann man ganz schön suchen - es gibt nicht einen Namensraum der überschaubar wäre und alles enthält.

Cocoa ist da auch nicht vorbildlich - da gibt es gar keine Namensräume. Nur eine grobe unterteilung in Foundation für alles was keine GUI braucht und AppKit für alles was mit einer GUI zusammenhängt.

Na immerhin etwas. Dazu kommt dass Apple fast alle neuen größeren Features als Framework verpackt die einen Aufgabenbereich verkapseln. CoreAudio für alles was mit Audio zu tun hat. CoreImage für ... Bilder, CoreVideo.... etc. Immerhin. Aber. Da alle Klassen zur Laufzeit dann doch in einem einzelnen Namensraum liegen, heißt dass das dann doch wieder jede Klasse einen Präfix bekommt, damit sie nicht mit Klassen von irgend jemand anderem zusammenstößt. Bäh. Man hat also NSArray statt Array und NSApplication statt Application und NMDeviceDatabaseEntry (NM für NovaMedia). Also: Namensräume rocken - und Cocoa kann da deutlich weniger als Python.

Hierarchische Namensräume sind gut, weil sie Übersicht schaffen - wenn man sie nicht nur zum Spaß einsetzt sondern tatsächlich verschiedene Bereiche getrennt bekommt.

Git the Basics

written by Martin Häcker on

Da hab ich doch endlich eine schöne fundierte Einführung wie mann am besten mit Distributed Revision-Controll-Systemen arbeitet.

Ok, sie ist komplett auf GIT zugeschnitten, aber trotzdem sehr ordentlich. Vor allem erklärt er auch anschaulich wofür man die advanced features wie rebasing sinnvollerweise verwenden kann.

Also alles in allem eine Empfehlung. :)

TimeMachine auf beliebigem NAS

written by Martin Häcker on

Tja, nach anfänglichem [wiki:2008/07/12/22.30 Erfolg mit meinem NAS] muss ich leider doch geschlagen geben.

Auch wenn alles zum Funktionieren zu bringen war, bricht jeder Backup auf den NAS so nach etwa 1-6 Gigabyte ab und ist nach dem zweiten Restart gar nicht mehr zum starten zu ĂĽberreden (angeblich weil die Backup-Festplatte SchreibgeschĂĽtzt ist.

:-(

Ich probier es jetzt mal mit einem anderen Hersteller.

Xcode Tips: Tipp deine [ ] doch selber!

written by Martin Häcker on

Dachte ich mir zum letzten mal.

Denn das kann XCode ja schlieĂźlich auch automatisieren, wenn man ein wenig in die Makros von Xcode reingreift.

Schritt eins, /Developer/Applications/Xcode.app/Contents/PlugIns/TextMacros.xctxtmacro/Contents/Resources/ObjectiveC.xctxtmacro im Texteditor der Wahl öffnen und das Macro finden das Apple als Hilfe für solche Fälle vorgesehen hat. (Bei mir ist das auf Zeile 68)

{
            Identifier = objc.bracket;
            BasedOn = objc;
            IsMenuItem = YES;
            Name = "Bracket Expression";
            TextString = "[<#!expression!#> ]";
        },

Das habe ich mir dann durch zwei Macro-Definitionen ersetzt die fĂĽr mich wesentlich nĂĽtzlicher sind:

{
            Identifier = objc.bracket;
            BasedOn = objc;
            IsMenuItem = YES;
            Name = "Bracket Expression";
            TextString = "[<#!expression!#>]";
        },

        {
            Identifier = objc.bracket.withSemicolon;
            BasedOn = objc;
            IsMenuItem = YES;
            Name = "Bracket Expression with Semicolon";
            TextString = "[<#!expression!#>];";
        },

Das war Schritt eins, um dass jetzt noch richtig NĂĽtzlich zu machen, habe ich mir diese Befehle (die jetzt beide im MenĂĽ auftauchen) noch mit einem Shortcut belegt - also MenĂĽ->Xcode->Preferences->Key Bindings, dort eine eigene Konfiguration anlegen und bei den "Menu Key Bindings" die MenĂĽ-Eintrag unter Edit->Insert Text Macro->Objective C finden.

Ich hab mir den ersten (ohne Semicolon) auf Command-1 und den zweiten (mit Semicolon) auf Command-2 gelegt.

Nie wieder Semicolons Tippen. Einfach Text-Auswählen und Command-1, dann hab ich eckige Klammern drumherum.

Ahhh....

Lediglich eines hätte ich noch gerne, dass der Cursor danach vor der schließenden eckigen Klammer ist.. aber das finde ich auch noch raus.

TimeMachine auf einem beliebigen NAS

written by Martin Häcker on

Backups ĂĽbers WLAN auf ein NAS zu machen ist schick - aber TimeMachine arbeitet ausschlieĂźlich mit Apple TimeCapsule

Jetzt kriegt man aber auch schicke NAS mit anderthalb Terrabyte - nur das Ding zur Zusammenarbeit mit TimeMachine zu überreden ist schon etwas schwieriger - aber möglich.

Zuerst habe ich TimeMachine so konfiguriert, dass es ĂĽberhaupt alle Festplatten anzeigt:

defaults write com.apple.systempreferences TMShowUnsupportedNetworkVolumes 1

Danach das Disc-Image. TimeMachine kriegt es nicht gebacken - aber während es sein Glück versucht, kann man sehen wie der name sein sollte (mit ls -al)

TimeMachine bricht dann zwar ab, aber man kann das Disk-Image problemlos selber mit hdiutil herstellen und dann rĂĽberkopieren. Wichtig: -volname muss passen (das .tmp image rechtzeitig mounten). Der Trick liegt in dem Namen des sparsebundles, der besteht aus a) dem Namen des Rechners ($NAME), dann einem Underscore ("_") und der MAC-Adresse des Rechners ($MAC_ADRESS).

hdiutil create -library SPUD -size 1t -fs HFS+J -type SPARSEBUNDLE \
    -volname "Backup of $NAME" $NAME_$MAC_ADRESS.sparsebundle

Ach ja, die Größe kann man natürlich einstellen und später mit resize ändern. Ich hab mich mal für einen Terrabyte entschieden.

Matjessalat mit Roter Beete und Apfel

written by Martin Häcker on

Mjam....

etwa so.

Die Universität, der Ort an an dem..

written by Martin Häcker on

... der aktuelle Wissensstand auf die Studenten trifft, wie der D-Zug auf den auf dem Gleis liegenden.

Oder?

Jedenfalls in einer Hinsicht bemerkenswerterweise ĂĽberhaupt nicht. Die Lehre.

Die ist nämlich erstaunlich leer von dem was die Forschung über den Menschen und seine Lernfähigkeit gelernt hat.

:-(

Das Buch Brain Rules von John Medina hat dazu jedenfalls eine Menge zu sagen.

Davon habe ich an der Uni aber allerhöchstens zufällige Bruchstücke gefunden. Erstaunlich dass wir uns diese Institutionalisierte Rückständigkeit erlauben.

FĂĽr jeden der Lehrt -> Buch Lesen und umsetzen. Zum Beispiel den Lehrplan den er selbst auch verwendet.

Ach ja, bloggen tut er auch. Yeah. :)

Urlaub

written by Martin Häcker on

Ist schön!

BarfuĂź laufen den ganzen Tag, jeden tag zweimal im Meer Schwimmen gehen, in der Sonne liegen und lesen...

Hiddensee machts möglich.

Besonders schön an Neundorf, es ist eigentlich vor allem nur eine große Wiese, auf die ein paar Häuser gebaut sind. Daher kann man eben auch alles Barfuß erlaufen. :)

Ach ja, Autos gibts auf der Insel natürlich auch keine (ok, die Müllabfuhr und der Elektriker und noch zwei) was die Insel ganz dem Fahrad gehören lässt.

Vitte und Kloster sind etwas größer, da hat man dann weniger Ruhe, in Kloster gibts natürlich noch den berühmten Leuchtturm - aber wer will schon da hin wo die Massen hinstreben...

NatĂĽrlich alles ohne Computer, daher auch wenig Posts hier.

Wird sich aber jetzt wieder ändern. :)

Trac, die Webentwicklungsplattform

written by Martin Häcker on

Es gibt ja verschiedenste Frameworks die total toll sind um darauf aufbauend Webseiten-Entwicklung zu machen. TurboGears, Django, Ruby On Rails, etc.

Und was muss ich feststellen? Ich treibe Webentwicklung in einem Framework, der es selber gar nicht sein will. Trac.

Irgendwie ist das eine Liebe und Hass-Beziehung. Einerseits finde ich das Prinzip gut und mir gefällt wie es umgesetzt ist. Andererseits kotzt mich der Code in Trac zum Teil gewaltig an.

Sowas von Kompliziert. Bäh.

Also wieso mache ich mir den Stress?

Weil ich später auf der Benutzer-Seite nicht so viele verschiedene Tools einsetzen will. Ich will meinen Blog schreiben, im Wiki Arbeiten und meine Software verwalten - alles ohne extra Aufwand zu treiben, damit es sich integriert.

Dabei ist es logisch betrachtet viel mehr Aufwand das alles in einem Tool zusammenzukriegen, als einfach ein paar gut geeignete Tools zusammenzuwerfen.

Na mal schaun. FĂĽr's erste mach ich mal weiter mit dem Blog - immerhin kann man damit jetzt schon posten und kriegt sogar eine Fehlermeldung wenn man vergisst einen Titel zu vergeben. :-) Dauert also nicht mehr lange bis ich das hier fĂĽrs Bloggen einsetzen kann / werde.