Wohl eines der wichtigsten Bildarchive unserer Zeit. Hier.
Besonders beeindruckend finde ich die Übersichtsbilder über Hiroshima.
Wohl eines der wichtigsten Bildarchive unserer Zeit. Hier.
Besonders beeindruckend finde ich die Übersichtsbilder über Hiroshima.
Weil es so irrsinnig schwer zu debuggen ist.
Jeder Programmierer verwendet ein anderes Subset irgendwelcher obskuren features, die man eigentlich nicht bräuchte und fürs debuggen muss man sie dann alle kennen.
Gnah.
Zum Beispiel das hier: Aus Performance-Gründen wird der Speicher für Objekte beim initialisieren nicht auf einen neutralen Wert (0/NULL/whatever) gesetzt, sondern (!!!) uninitialisiert gelassen. (Nein, das ist kein Opt-In für die stellen wo man die Performance wirklich braucht, sondern tatsächlich der Standard)
Das geile daran: Vergisst man im Konstruktor dann eine Variable zu initialisieren, dann gibt es auch keine Warning...
Also habe ich jetzt Tageweise hinter her debugged, weil an einer Stelle halt eine Variable nicht in der Konstruktor-Initializer-Liste aufgeführt - und dieser Wert dann an das System weitergereicht wurde. Tja, schade eigentlich. Dadurch wurde dann der TCP-Sendspace eben auf einen zufälligen Wert (18 Millionen) konfiguriert und verständlicherweise reichten dafür die Buffer nicht mehr aus...
Und das alles weil C++ so hardcore Performance-Orientiert ist. Wo doch heute jedes Kind lernt, das man etwas erst zum funktionieren und dann schnell kriegen muss.
Gnah.
Rofl.
So, gegründet ist sie also die CocoaHeads Chapter Berlin. Und Lustig wars auch - immerhin doch 15 Cocoa-Programmierer, die meisten davon überraschenderweise fürs iPhone. Und auch eine Menge Leute die mann schon kennt.
Der Entwickler von Aurora, AppFresh und Fahrinfo Berlin war da (der überraschenderweise in Potsdam immer noch studiert!), der Entwickler von GarageSale, einige Leute aus der iPhone-Abteilung von Neofonie und natürlich der Gründer und noch einige Freelancer und andere Gesellen bei denen ich mich nicht mehr an die Applikationen erinnern kann.
Also ein ganz hervorragender Start für ein Kakaokopftreffen. :)
Vor ein paar Tagen hat mir ein Bekannter ganz begeistert davon erzählt, wie sehr Obama gewonnen hätte, weil er das Internet endlich richtig benutzt.
Erstaunlicherweise habe ich davon sehr wenig mitbekommen - daher war ich etwas skeptisch. Jetzt habe ich einen ganz hervorragenden Bericht von meinem Bekannten Wolfgang Goede gelesen - der in Amerika als Wahlhelfer gearbeitet hat, um die Wahl und ihre Ergebnisse besser zu verstehen.
Ich bin persönlich ja der Meinung dass seine Fähigkeiten als Community-Organizer weit mehr mit dem Wahlsieg zu tun haben als mein Bekannter dachte - aber er hat tatsächlich viele dinge Online gemacht.
Das finde ich großartig.
War ja ganz nett auf den Apple iPhone TechTalks - alles zusammen allerdings etwas langweilig weil wenig in die Tiefe. :-(
Lustiges Detail am Rande: Zwar war die Veranstaltung mit Anmeldung und schon lange vorher ausgebucht - aber trotzdem kam man vor Ort noch gut rein - das nächste mal kann man es also auch ohne Anmeldung einfach mal versuchen.
Interessant auch, dass das ganze Event unter NDA stand, das heißt, obwohl ich dort war und nur Informationen verbreitet wurden die alle ohne NDA aus der API erhältlich waren, darf ich nicht darüber erzählen was es dort zu hören gab. Das fand ich so strange dass ich doch gleich einen der Vortragenden Apple-Mitarbeiter gefragt habe wie das zu verstehen ist: Dieser hat sich dann entschuldigt und bestätigt, dass natürlich alle Informationen die aus den APIs kommen frei bloggbar sind, aber eben nicht worüber auf dem Event darüber gesprochen wurde.
Schade eigentlich.
Hier einige Notizen zu der iPhone API die ich spannend finde:
Eine Applikation zu erstellen kann man grob in 4 Phasen einteilen
Zusammengefasst:
Tips:
Noch zwar unter einer obskuren URL aber das ändert sich auch bald hat sich geändert.
Yay, wir haben einen Blog eingerichtet.
:)
Faszinierend finde ich ja schöne verfahren um die Ergebnisse der Wahl vorherzusagen.
Toll finde ich in diesem Fall Crowdsourcing also die Idee, das lokale Wissen von ganz vielen Menschen über ihre Umgebung auf eine Art und Weise zusammen zu führen die daraus weit mehr macht als die Summe der einzelnen ist.
Eine Sache sind z.B. [Decision Markets] also eine Börse wo die leute Geld auf verschiedene Ergebnisse setzen können. Wie z.B. bei Intrade. Die haben zum Beispiel einen Markt für die Wahl heute Abend: Intrade - Realtime Election Tracking. Spannend vor allem die Übersicht über die letzten drei Monate.
Ein CCC'ler sagte dazu nur: "Decision Markets sind so genau, dass man damit sogar Wahlcomputer-Manipulationen nachweisen kann." Und dann: "Ich habe 100$ auf McCain gesetzt. Wenn er gewinnt krieg ich 950$." Die Antwort: "Auch ein Trostplfaster."
Spannend nicht?
Well, it doesn't really. But if way overused it becomes a pain in the a**.
This is not so much a problem in on itself, but the code sprouts dependencies that nobody is able to follow from just reading a class but which become crucial to the operation of the application.
Well, out of frustration I started thinking about the saying that Design-Patterns are just for languages that are not powerful enough to implement something in the language.
So lets see, what can we do to make this simpler:
if ([someObject respondsToSelector:@selector(someDelegateMethod:)]) { [someObject someDelegateMethod:self]; }
The key here is to only call the messagte -someDelegateMethod:
if it is actually supported on the target. A perfect application [wiki:2008/10/26/20.59 of my invocation] [wiki:2008/10/25/01.21 catching code].
[[NMDelegateCaller callerForDelegate:object] someDelegateMethod:self];
In real life of course you would hide the delegator by just wrapping your delegate in the -setDelegate:
method.
Interestingly implementing this proved rather more tricky than I anticipated. This is because of the way the objc-runtime creates NSInvocations out of c-method calls. The trick is, that really at runtime nothing is known about how arguments have to be scraped out of the stack because in C you have no clue what arguments actually are on the stack.
So objc takes a detour and stores this information alongside each method in the object that the method belongs to. This however has the unfortunate side effect that it should make just the delegator I wanted to build impossible to build. That is, because the runtime cannot build an NSInvocation out of a method call that the destination does not support - simply because it doesn't know what arguments are on the stack and what to return.
This is where my little evil hack comes in: I defined a method on NSObject that represents an identity for this situation - that is, it returns nothing and takes no argument - therefore the runtime won't crash anything by using it's description to build an NSInvocation. This is my marker.
And with this the problem becomes solvable - in -methodSignatureForSelector:
I ask the target for a signature if it has one, and return my marker signature and let the runtime build an NSInvocation out of whatever method call was made (what exactly it was doesn't interest me, only that it's not implemented on the delegate). Then in -forwardInvocation:
I can test if the signature is that marker and just discard the method if it is.
Voilá.
So it is proven - objc is powerful enough to implement this design pattern in itself - no need for all those if statements - and I learned a lot about the internals of NSInvocations.
Still I'm not sure if I really want to use that code. Yes it's shorter, but it's also a lot more complicated and it makes something very convenient which in essence I don't really want to be so convenient, because if overused it becomes a maintenance nightmare.
Also it lacks the simple elegance of just stating exactly what you want to achieve and returning good default values (my solution can just return NULL/NO/0 if the method is not implemented).
Damn. Alles für die Katz.
Still very interseting though. Maybe I'l find a different application that suits me more.