Posts by author dwt

Lockless Algorithms

Schon lange habe ich keine so passende Visualisierung mehr für etwas gesehen:

Lockless Algorithms / Schlosslose Algorithmen:

http://i.imgur.com/0MfvQb3.gif

 via devopsreactions

Melderecht Datenweitergabe jetzt ohne Zustimmung

Das ist doch ein Juwel: Melderechter sollen in Zukunft meine Daten an jedes Industrieunternehmen weitergeben dürfen - wenn die Firma die Daten für ein "update" schon vorhandener Daten anfragt.

Was pikanterweise die Voraussetzung fast jeder Anfrage ist.

Dem kann man dann gar nicht mehr widersprechen - de fakto hat man also keine Möglichkeit mehr dieser Geschäftspraktik der Meldeämter wenigstens für sich persönlich Einhalt zu gebieten.

Compact hält dagegen und hofft auf 200.000 unterstützer in möglichst kurzer Zeit:

 http://www.campact.de/melderecht/sn1/signer

Dafür!

SSL Certificate Trouble

If you should ever stumble upon this bug, consider yourself very lucky that I have found the solution to this already, because it took me _AGES_ to figure this out. No shit.

So here's the problem: We used a self signed certificate on on of our servers and curl and all tools relying on curl just couldn't connect to this server at all (with certificate validation). Despite the fact that the root certificate that signed the server certificate was happily in my keychain and marked as trusted.

The solution first: Turns out that the Keychain will eat certificates in many formats, specifically it supports DER and PEM. curl however can't use the DER certificate in the keychain and just reports it as missing. Exporting the certificate, converting it to PEM and then reimporting it (making sure to remove the DER version beforehand) fixed it.

I converted the file with this command

openssl x509 -inform DER -in some.ser.ver.der -out some.serv.ver.pem

Here's some of the error messages I got:

% curl -I https://some.serv.ver -v
* About to connect() to some.serv.ver port 443 (#0)
*   Trying some.ip... connected
* Connected to some.ser.ver (some.ip) port 443 (#0)
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS alert, Server hello (2):
* SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
* Closing connection #0
curl: (60) SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
More details here: http://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.

If you hit this brick wall - hope this helps you too.

Mappei Stützen und Rechnungsstellung

Gerade habe ich endlich für mein GTD-System ein super-Zubehör gefunden,  Mappenstützen von Classei. Der große Vorteil davon: Die Mappen stehen in den Boxen auch stabil wenn diese nicht voll sind - damit kann man seine GTD-Ablage viel entspannter aufbauen. :)

Und noch ein witziges Detail: Classei gewährt 2% Skonto wenn man zügig bezahlt. Das bedeutet natürlich das sie eigentlich 2% mehr verlangen, wenn man nicht zügig bezahlt. Ich wette aber, dass das viele Leute dazu veranlasst schnell zu bezahlen. Und das finde ich einen schönen Trick. :-)

Musik ist doch was feines

Iranische Männer weinen nicht...

... hat Ihm seine Mutter beigebracht als er ein Fahrad wollte dass sie sich nicht leisten konnte. Und dann weinte er so stark dass er sein Auto nicht mehr weiter fahren konnte und am Straßenrand anhalten musste.

 http://www.thegreenwave-film.com/

Dieser Film hat mich tief traurig gemacht, weil es Länder wie den Iran gibt, in denen so viele Menschen nicht ihre Freiheit genießen und so sorgenfrei aufwachsen und leben können wie ich das hier konnte und kann.

Sehr sehenswert.

Ägypten

 http://twitpic.com/3u6gvc

Dabei läufts mir jedesmal wenn ich das anschaue kalt über den rücken.

Umfragen und Ergebnisse - so gehts!

Viel zu selten kriegt man mal bescheid wenn man an einer Umfrage / Untersuchung teilgenommen hat und dann endlich die Ergebnisse vorlegen.

Um so schöner wenn das mal funktioniert!

 Die Uni Augsburg hat das mal richtig gemacht!

Und dann auch gleich  zur nächsten Runde eingeladen. Jawohl!

Die meisten wissenschaftlichen Ergebnisse sind falsch

Geiler Titel eh? Trotzdem das Ergebnis gut replizierbarer wissenschaftlicher Forschung. Hach die Ironie.

 Hier gibt es dazu einen sehr schönen Artikel. (via fefe)

Liquid Feedback

 Darauf bin ich heute gestoßen.

Interessant.

Was mir durch den Kopf geht: Schade, What goes around comes around, wie geht es mit Liquid bei den Piraten weiter? Wie geht es bei dem Projekt weiter wenn die haupt-Triebfeder nicht mehr treibt?

Mal nachdenken.

Angst vor Badewannen?

Diese ganze Terror-Panik-Mache geht mir sowas von auf den Geist - das ich in Diskussionen dazu schon immer ganz ungemütlich werde.

Und immer fallen mir dann die entscheidenden Argumente dazu nicht ein - zum Beispiel zu so einem Security-Theater wie gerade am hier am Bahnhof, wo irgend ein Arsch eine Tüte hat stehen lassen und für Stunden der ganze U-Bahnhof gesperrt war und alle U-Bahnen weiträumig umgeleitet / gesperrt wurden.

Grah!

Da kann ich mich doch nur einem  Blogpost von Bruce Schneier anschließen:

I am not afraid of terrorism, and I want you to stop being afraid on my behalf. Please start scaling back the official government war on terror. Please replace it with a smaller, more focused anti-terrorist police effort in keeping with the rule of law. Please stop overreacting. I understand that it will not be possible to stop all terrorist acts. I accept that. I am not afraid.

Jawoll!

Bitte anschließen - und  das Video dazu kucken.

Nukleare Abschreckung

Bei den Gorleben Protesten kriegt man ja inzwischen doch eine ganze menge gute Informationen - sogar manchmal über die großen Medien. Und man interessiert sich auch mal ein wenig zu dem Thema.

Sehr gut gefallen hat mir dabei  diese Quarks & Co Sendung die ich hier auch wärmstens weiterempfehlen möchte.

Vor allem war mir überhaupt nicht klar WIE groß die Katastrophe in der Asse derzeit eigentlich ist.

Anschaubefehl.

Ein paar Gedankenanstöße:

  • Wenn es eine Stelle gibt an der so gegen sämtliche Regeln des Verstandes und der Sicherheit verstoßen wurde
  • Dann gibt es in der Nähe von dieser Stelle noch mehr ähnliche Probleme
  • Eines davon  zum Beispiel das AKW Biblis. Die Techniker dort wollen es nicht mehr Reparieren da sie dann "... mit einem Bein im Gefängnis ständen...".
  • Jetzt bitte genau nachdenken wie viele dieser Problemfälle immer noch vor uns Geheim gehalten werden.

*grusel*

Update: Wer noch nicht genug gegruselt ist, dem empfehle ich  diesen Podcast mit Sebastian Pflugbeil der sich als Atomphysiker mal den Reaktor in Tschernobyl sehr genau angeschaut hat (er ist dort gewesen!).

  • Posted: 2010-11-19 18:53 (Updated: 2011-02-12 17:12)
  • Author: dwt
  • Categories: politik
  • Comments (0)

Interessante Details zur Castor Lieferung

  1. Die Castoren sind (durch die Strahlung?) 120 grad heiß wenn sie geliefert werden, Eier die man darauf wirft verkohlen sofort. :-)
  2. Die Castoren müssen erst mal 30 Jahre auskühlen bevor sie überhaupt in einer Salzmine endgelagert werden können
  3. Diese 30 Jahre stehen sie in einer Blechhalle nicht weit von Gorleben und strahlen da (hoffentlich nicht) vor sich hin
  4. Bevor sie in Gorleben eingelagert werden können müssen sie noch in kleinere Behälter 'Pollux' genannt umgefüllt werden
  5. Die Technologie dafür gibt es noch gar nicht
  6. Gorleben als Endlager ist noch gar nicht genehmigt

Krass.  via

Unsere Obsession mit der Shell

Grade dachte ich mir ich mache mal wieder zum Spaß etwas an einem Open Source Projekt, checke es aus und will es mal bauen um etwas im Code herum zu lesen - und das erste was mir passiert ist das der Build-Prozess einfach irgendwann verstirbt.

Nach einiger Debugging Zeit stellt sich dann heraus das das selbstgestrickte build-system (eine Sammlung von Shell-Scripten) halt nicht mit spaces im Pfad zu den Sourcen klarkommt.

Gnarf! Wieso macht man sowas in Shell? Muss das sein?

Ok, aber es gibt ja workarounds, und die kenne ich ja auch und die lassen sich ja auch relativ einfach einbauen. ABER: Nicht mal die Abhängigkeiten ([ pkg-config] in diesem Fall) baut mit spaces im Pfad.

ARGH!

Und natürlich haben die ein [ Autohell] buildsystem an das ich nun wirklich nicht ranfassen will. :-(

Wie sollen wir als Softwareentwickler eigentlich irgendwann zu dem Punkt kommen wo unsere Software auch nur so etwas einfaches wie Pfade korrekt verarbeitet - also mit Leezreichen, Umlauten und Sonderzeichen (jep '/' ist auch gemeint) - wenn nicht mal unsere Eigenen Build-Tools und Shell-Sprachen damit verlässlich klar kommen? Also die Basis auf die einfach immer wieder zurückgegriffen wird?

Unglaublich.

Objective-C Metaprogrammierung: Blöcke zu Methoden

Die Ruby Welt verwendet Blöcke (Closures) liebend gerne für alles mögliche. Zum Beispiel als Builder-Methapher um Baumstrukturen (XML, GUI's, HTML, Tests) in der Sprache hinzuschreiben und dann nur noch in die Target-Sprache zu rendern.

Das sieht in Tests zum Beispiel so aus:

describe "something" do

  it "should do fnord" do
    someObject.should be_fnordy
  end

end

Der Trick dabei ist das alles von do bis end jeweils ein Block ist der von der Methode describe oder it dann in eine UnitTest Klassenstruktur eingehängt wird um dann später als 'ganz normale' unit tests ausgeführt zu werden.

Jetzt wo Objective-C auch Blöcke unterstützt (ok, die können natürlich weniger als das Ruby Equivalent) müsste das eigenltich auch gehen - und siehe da mit  Cedar gibt es auch schon einen ersten Versuch  RSpec in Objective-C nachzubauen.

Well und daher habe ich mir mal angeschaut wie weit man denn kommt wenn man in Objective-C einen Block in eine Instanz-Methode umwandeln will.

Gleich vorneweg - das Typ-System von Objective-C macht mir hier einen kleinen Strich durch die Rechnung - ich habe es nicht geschafft einen Block nicht direkt als Funktions-pointer verwenden.

Aber mit etwas Umweg geht es doch.

Der Trick ist das Blöcke auch id's sein können, d.h. man kann sie bequem in ein NSMutableDictionary packen.

Also brauche ich auf meiner Klasse nur ein Dictionary, speichere die Blöcke darin mit dem Namen der Methode ab und baue mir einen generischen Dispatcher-IMP der den Selector (zweites unsichtbares Argument jeder Objective-C Methode) verwendet um den Block aus aus dem Dictionary zu ziehen und führe ihn dann einfach aus.

So sieht dass dann aus

Die schönsten Testsuiten

Sowas wünsche ich mir auch mal für andere Programmiersprachen. Eine ständig aktuelle Hitliste der schönsten Testsuiten von Open Source software.

 Sowas hier - aber systematisch und crowdsourced immer aktuell.

Hach, man kann träumen. :-)

Klarträumen

 Klarträumen ist etwas das ich gerne lernen möchte und das mich derzeit beschäftigt. Erste Resultate habe ich schon - denn nach Jahren in denen ich mich vielleicht an einen Traum pro halbes Jahr erinnern konnte, erinnere ich mich jetzt an ein bis drei Träume pro nacht.

Stattlich. :-)

Sehr gut funktioniert für mich dass ich vor dem Schlafengehen via iPhone noch ein zwei YouTube Videos zu Klarträumen sehe um mich a) fortzubilden und b) mein Gehirn mit Klarträumen zu beschäftigen um die Warscheinlichkeit zu erhöhen dass ich mich an Träume erinnere (und später dass ich in einem Traum merke dass ich träume).

Eine super Einführung finde ich nach wie vor  Reece Jones  2,  3, aber auch andere Videos von ihm sind interessant (gleiten allerdings recht schnell in viel zu esoterische Gefilde ab für meinen Geschmack).

Abends (und morgens bevor ich noch einmal zum Träumen einschlafe) verwende ich momentan zur Beschäftigung mit meinem Träumen die Videos von  Lucidipedia die zwar etwa länglich, dafür aber gut verständlich und sehr Detailreich gute Tips zum Träumen geben. Besonders gefallen mir daran die vielen Beispiele die er gibt und die Art wie er sie erklärt.

Noch ein paar Webseiten:

Aber auch eine einfache  YouTube Suche bringt erstaunlich viele Ergebnisse.

jQuery editInPlace

Well, I just finished some major reworking of that jQuery plugin, so now it has a real testsuite and conforms to the  jQuery Plugin Guidelines and doesn't pollute the core prototypes (of String) anymore.

There are a few new features, most prominent the ability to define a class to apply for the hover effect (so you can style the hover in css instead of having to hand in the colors directly and more control over the way errors are presented so it is easier to embed into bigger applications.

So enjoy  the demo and  the download while they are hot, and keep a bookmark to  the project homepage. :)

Stuff I'd like to note:

  •  JSpec rocks, writing tests with it is a breeze. The DOM Testrunner they have could use some work though to become even more usefull
  • Writing the tests with no dom insertion is a _great_ technique to get a fast testsuite where you can almost guarantee that it has no test-ordering issues.
  • jQuery allows you to almost completely drive the interaction with the editor as a user would, making it almost like an acceptance test (and with very little dependency on the internal working of the editor.
  • Refactoring JavaScript Code is hard if you don't have a testsuite. My Advice: Break it down into smaller bits. I found it incredibly hard to refactor larger pieces of the code, as not having a testsuite means there's no way you know what still works. :/

Wo findet Innovation beim Lehren statt?

Früher mal dachte ich, dass das ja in den Universitäten sein muss. Schließlich ist da alles auf einem fleck. Forscher und Lehrer und Schüler.

Optimale Bedingungen eigentlich - nur dass dort an der Lehre überhaupt nicht geforscht wurde. Schließlich war das ja nur ein Anhängsel das Zeit kostet. Kein Forschungsgebiet.

In der Schule natürlich sowieso nicht und danach?

Im Beruf?

Ich bin natürlich mein eigenes Forschungssubjekt, weil ich weiter lerne und das beobachte. Und für mich selber ist es natürlich so dass ich ständig mit Innovationen habe, durch meine Möglichkeit das Netz zu verwenden.

Aber ab und an trifft man auf etwas großartiges. In einem  Interview von John Udell bin ich auf die  Khan Academy gestoßen.

Das ist ein Mensch der seine Erfüllung darin findet dass er kurze Videos (~10 Minuten lang) aufnimmt in denen er eine Sache - ein Konzept aus Mathematik, Physik, Chemie, Finanzen und vielen weiteren Themen.

Und die sind gut!

Ausserdem hat er  eine Software online gestellt die ein sehr spannendes Konzept verfolgt: Wissen ist dort als Graph aufgestellt - von einfachster Addition bis zu relativ komplexen Themen. (Aber viel weniger als als Video verfügbar ist).

Der Clou: Man fängt bei einfacher Addition an und kriegt die nächst-Schwierigeren Aufgaben erst wenn man 10 Aufgaben aus einem Wissensgebiet erfolgreich direkt hintereinander gelöst hat.

Dazu gibt es jeweils den ganzen Lösungsweg plus einen Link auf das dazugehörige Video wenn man es noch mal im Detail braucht.

Das führt dazu dass Kinder gerade bei Mathe ihre Lücken auffüllen können die sie irgendwo im Verständnis haben. Und das finde ich Großartig - denn das ist eines der größten Probleme von Großgruppen-Lernen. Wenn ein Thema vorbei ist, dann ist es vorbei - egal ob man es verstanden hat oder nicht.

Verdammt schade dass es noch soo lange dauern wird bis solche Konzepte auch in der "Offiziellen" Lehre angekommen sind.

Gletscher Rückzug

Klima-Veränderung ist ein schwer zugängliches Thema.

Aber auch Sau-Wichtig. Und daher finde ich es grandios was James Balog für eine Arbeit gemacht hat um den Gletscher-Rückzug zu dokumentieren. Mit knapp 30 Zeitraffer-Kammeras macht er über Jahre Hinweg jede Stunde ein Bild von vielen Gletschern und daraus dann einen Film.

Wow.

100 mal Floss Weekly

:) Einer meiner Lieblingspodcasts hat es jetzt auf die 100. Ausgabe gebracht.

Und da muss ich doch mal gratulieren. Vor allem weil ich bei der Quiz-Show über Programmiersprachen und deren Verbreitung absolut herzhaft gelacht habe. :-)

Hörenswert! Immer wieder großartige Interviews mit Machern von Open Source Projekten.

[Hier gehts zur 100-sten Show  http://twit.tv/floss100]

Softwareentwicklung als Kooperatives Spiel

Das ist ein steinalter  Vortrag von Alistair Cockburn (gesprochen Co-Burn) in dem er darlegt wieso er findet das das eine sehr gute Sichtweise auf Softwareprojekte ist.

Der Vortrag ist schon 10 Jahre alt - und trotzdem finde ich ihn sehr Aktuell.

Lesenswert!

Python Saug Punkte contd.: x += y ist nicht x = x + y

a = b = list()
a = a + ['foo']
print b # => []

a = b = list()
a += ['foo']
print b # => ['foo']

Doh. Wie kann das sein? Kommt man von C ist das erst mal sehr verblüffend - und auch die meisten anderen Programmiersprachen die ich kenne verwenden a += b als equivalent für a = a + b.

Well, nicht so Python. Weil  da gab es offenbar mal Programmierer die fanden dass man Code der mit Matrizen rechnet lieber mit Operatoren schreiben möchte weil sich das besser ließt. Natürlich nicht mit den normalen operatoren wie */+-, weil, da kann man ja den empfänger nicht in place modifizieren, und wie jeder weiß sind Matrizen ja so groß dass die dann nicht mehr in den Ram passen.

Also haben sie die <op>= operatoren in Python so spezifiziert, dass sie ihre left-hand-variable in place modifizieren wenn diese mutable sind.

:-(

Python Saugpunkte: Klassenobjekte

Klassenobjekte sind special - daher hat man im boddy einer klasse keinen Zugriff auf das klassenobjekt.

Weil, self ist ja auch nicht automatisch und man muss es in Methoden immer als explizites Argument hinschreiben, und so etwas gibt es ja bei Klassen nicht, denn das sind ja keine Methoden und daher kann man halt das Klassenobjekt nicht referenzieren im body.

Doh.

Und das nervt natürlich total bei der meta-programmierung.

Hier mal ein Beispiel von etwas SQL-Alchemy Code wo mir das wieder aufgefallen ist:

class Poll(Base):
    proposal = relation(proposal.Proposal, backref=backref('polls', cascade='all',
                           lazy=False, order_by=Poll.begin_time.desc()))

Das geht nicht, weil ich auf Poll nicht zugreifen kann und damit nicht auf andere attribute der Klasse. Der Workaround den SQLAlchemy dafür macht ist das man einen String hineinreicht und die den dann aufwendig parsen. Total gar nicht toll.

:-(

  • Posted: 2010-01-13 19:00 (Updated: 2010-01-13 19:01)
  • Author: dwt
  • Categories: fnord code
  • Comments (0)

Grand Unified Theory of Programming?

Das höchste Ziel in der Physik ist alle Kräfte durch eine Formel auszudrücken bzw. sie in Beziehung zueinander zu setzen. Maxwell zum Beispiel gelang das für elektrische und magnetische Felder - und dafür ist er noch heute berühmt.

In der Software-Entwicklung gibt es so etwas bisher nicht. Klar, es gibt Daumenregeln, so wie:

Aber, und das ist der wichtige Teil: diese Daumenregeln sind keine Unifikation die die verschiedenen Probleme beim Programmieren abwägen und in Beziehung setzen.

Daher finde ich  Jim Weirichs Vortrag  The Building Blocks of Modularity sehr spannend - denn da stellt er den Ansatz der  Connascence vor (ab Folie 35).

Das ist letztlich eine Klassifizierung welche Art von Abhängigkeit man sich durch welche Programmiertechnik einfängt - und damit kann man 'normales' Refactoring anwenden um von problematischeren Connascence's (?) zu weniger problematischen zu kommen.

Ach ja, ursprünglich kommt das aus dem Buch  What every Programmer should know about Object Oriented Design. Davon kann man aber Getrost nur noch den dritten Teil lesen (über Connascence) - der rest ist nach 15 Jahren einfach veraltet. :)

** Niemand sagt das so gut wie Kent Beck: "Lots of little pieces - Good code invariably has small methods and small objects. Only by factoring the system into many small pieces of state and function can you hope to satisfy the “once and only once” rule. I get lots of resistance to this idea, especially from experienced developers, but no one thing I do to systems provides as much help as breaking it into more pieces."

Python Saug Punkte contd.

Eine Sache die mich bei Python immer wieder ärgert ist die Tatsache dass Standardwerte für Methodenargumente zur Parsezeit festgelegt werden anstatt zur Aufrufzeit.

Das ist total doof, denn dadurch teilen sich alle aufrufe der Funktion den gleichen default-wert - was zwar schön schnell sein mag, aber trotzdem in fast allen Fällen nur bei nicht veränderbaren Objekten (so wie Integer und Strings) Sinn ergibt.

So führt das dazu dass man in Python eine ganze Menge Workarounds braucht um mit default-argumenten zu arbeiten.

Das wichtigste dabei ist der default typ None. Das ist der workaround für alle mutable-objekte, da man die in fast keinem Fall zwischen verschiedenen Methodenaufrufen teilen möchte. So sieht das aus:

def end_poll(self, end_time=None):
    if end_time is None:
        end_time = datetime.utcnow()
    # work with end_time...

Der Punkt hier ist dass man datetime.utcnow() nicht in das standard Argument hineinschreiben kann, da man sonst bei jedem Aufruf der Methode den gleichen Wert hätte: Die Parsezeit. Nicht sonderlich nützlich.

Das hat zur Folge dass man:

  • aus der Signatur nicht sehen was das Standardargument ist (utc/gmt oder vielleicht ewas ganz anderes?). Immerhin gibt es inzwischen immer mehr IDEs die diese Signatur beim aufrufen für autocompletion nutzen oder sie wenigstens anzeigen können.
  • Man beim verwenden von Standardargumenten immer überlegen muss ob man dieses Argument jetzt in die Methodendefinition oder in den Body aufnehmen muss.
  • für jedes Standardargument noch mal zwei extra Zeilen braucht. Das nervt vor allem deswegen weil man sich mit den standard Argumenten ja Zeilen sparen möchte. Das heißt die Kosten für Standard-Argumente steigen und man benutzt sie seltener.
  • die default argumente noch mal separat dokumentieren muss, da ein dokumentations-extraktions-Werkzeug ja den Code nicht sieht, der das tatsächliche Standardargument setzt. Und natürlich hat man dann noch mal DRY verletzt da die Information jetzt zwei mal da steht.
  • richtig fiese Bugs kriegt, weil viele Leute diese Probleme nicht kennen oder sie ab und an vergessen und mal ein list(), dict() oder set() als Standardwert nehmen was dan für viel Freude beim Debuggen sorgt.

Also, know your Python und vorsicht mit Standardargumenten!

Vielleicht kriegen wir ja irgendwann von unserem BDFL ein from __future__ import runtime_standard_argument_evaluation.

  • Posted: 2010-01-11 17:03 (Updated: 2010-01-11 17:07)
  • Author: dwt
  • Categories: fnord code
  • Comments (0)

SOLID object oriented design

Ein Vortrag von der  GORUCO - sehr zu empfehlen.

Besonders gefallen hat mir ihr Fazit dass man mehr als nur  DRY als Prinzip beim Refactoring anwenden soll um bei gutem Code anzukommen.

Sandy Metz empfiehlt das man sich an den 'Grünen' Stellen des Red/Green/Refactor Zyklus für jedes Objekt diese Fragen stellt:

  • Is it DRY?
  • Does it have one responsibility?
  • Does everything in it change at the same time?
  • Does it depend (only) on things that change less often than it does?

Und bringt das auch an einem ordentlichen Beispiel auf den Punkt.

Alles in allem: Ein Vortrag der zum Nachdenken über den eigenen Code-Stil einlädt. Empfehlenswert!

Here be electric dragons

Ich vertrete ja schon länger den Punkt dass ein Grundeinkommen eine Notwendigkeit sein wird in einer Gesellschaft in der Maschinen uns alle physischen Arbeiten abnehmen können.

Well, jetzt habe ich endlich jemanden gefunden der dieses Argument auch vertritt.

Auf dem 26C3 im Vortrag  Here be electric dragons

Sehr sehenswert!

Method argument naming confusion

Schon seit einigen Wochen bin ich am grübeln, nach welcher Regel ich in Python meine variablen für Methoden-Argumente benennen soll. Das ist erstaunlicherweise gar nicht so klar.

Hier mal das Problem: In Objective-C ist alles sehr klar und einfach (von Smalltalk kommend). Jede Methoden-Deklaration besteht abwechselnd aus einem Teil Methodennamen und dann einer Variablen. Hier mal ein Beispiel:

- (void) setValue:(id)aValue forKey:(id)aKey

Das hat den großen Vorteil dass man den Methodennamen benutzen kann um Stück für Stück die Argumente zu dokumentieren. Verwendet wird das so, dass das Stück Methodennamen das vor einem Argument kommt die Rolle beschreibt die das Argument spielen wird, während der Name der Variablen eher generisch ist und sich eher am Typ orientiert. Dazu kommt natürlich das man die Typen auch explizit auszeichnen kann, was die notwendigkeit für die Typ-Annotation im Namen der Variablen im vergleich zu Smalltalk oder Python noch mal vermindert und man kann ihn ganz der Rolle hingeben die die Variable in der Methode spielen wird - versehen mit dem a/an/some/etc. prefix der Argumente (als generische Instanzen von etwas) von den lokalen und instanz-variablen unterscheidet.

In Python geht das so nicht. Man kann versuchen das auf zwei wegen anzunähern:

def set_value_for_key(a_value, a_key): pass
# benutze als: some_dict.set_value_for_key('value', 'key')

Das hat den Vorteil das man die Argumente mehr oder weniger benennen kann wie man möchte, aber den Nachteil das die Dokumentation der argumente nicht mit diesen zusammen ist. Das hat schon mal den unangenehmen seiteneffekt das es sehr viel schlechter auf mehrere Argumente skaliert und damit sehr fix mehr extra-dokumentation nötig macht.

Der andere Weg wäre so:

def set(value, for_key): pass
#benutze als: some_dict.set(value='value', for_key='key')

Das hat den Vorteil dass der MethodenNamen von der Dokumentationshürde befreit ist - und damit Kurz wird. Auf der anderen Seite sind die Argument-Namen jetzt effektiv teil des Methoden-Namens und damit kann man sie nicht mehr so gut benutzen um den Typ der Argumente zu dokumentieren.

:-(

Das ist der Grund wieso ich die Objective-C / Smalltalk Syntax so gerne mag, weil es darin so einfach ist selbstdokumentierenden Code von hoher qualität zu schreiben.

Python Saug-Punkte

Viele standard-funktionen und module in python haben zu kurze namen.

Das ist deshalb ein Problem weil, man diese Namen nicht für lokale Variablen verwenden kann bzw. ungewollt eine Standardfunktion überschreibt.

id zum Beispiel. Oder dict, list.

Module sind dabei aber auch Problemkandidaten - vor allem wenn man sie häufig wie ein Objekt benutzt. Das json Modul macht mir immer wieder probleme, weil ich eine lokale Variable die json enthält nun mal gerne json nennen würde. json_serialization wäre vielleicht ein besserer Name für das Modul.

Die Standard-Bibliothek ist leider voll von solchen Beispielen und der Include-Mechanismus von Python der die Module quasi als Objekt im namespace des Empfängers verfügbar macht hilft da nicht wirklich weiter. Das ist zwar IMO eine bessere Idee als der C-Präprozessor #include (was Ruby ja zum Beispiel nachbaut) aber gerade bei so kurzen Namen kann das wirklich nerven.

Wenn man aus einem Modul ein Objekt importiert ist das interessanterweise kein Problem, da Objekte in Python (wenn sie sich an die Namenskonvention halten - leider auch oft nicht der Fall in der Standardbibliothek) immer mit einem Großbuchstaben anfangen und dadurch diese Namenskollision nicht auftritt.

Für mich ist da das Problem dass die Python Programmierer leider so eine Obsession damit haben alles möglichst kurz machen zu wollen - und dabei aber dem Programmierer der mit der (Standard-) Bibliothek arbeiten möchte gerade wieder Steine in den Weg legen dass kurz zu machen was für Ihn am meisten sinn macht - lokale Variablen.

Das ist leider Premature Optimisation in Reinstkultur - und es stört mich beim Entwickeln von meiner Software. :-(

How to crash IE 7 with javascript

Well, it's all too easy apparently. We stumbled upon the problem when suddenly our web application crashed left and right on us in IE 7.

I've since reduced the code involved and created a plugin to jQuery to make it easier to reproduce this.

Well, maybe perhaps sometimes somebody even discovers a use for the crashIE7 jQuery plugin. :)

In any event - it was fun creating this. :)

See the blog post page for the attached source and how to use this.

  • Posted: 2009-12-12 09:55 (Updated: 2009-12-12 09:56)
  • Author: dwt
  • Categories: fnord code
  • Comments (0)

Python distributions

Endlich mal hab ich einen überblick gefunden wo die Entwicklung momentan hingeht.

 http://mail.python.org/pipermail/python-dev/2009-October/092754.html

Kurz zusammengefasst:

  • easy_install, ez_setup und Konsorten wird sterben.  distribute ist die Zukunft
  • easy_install wird sterben ->  pip ist die Zukunft
  • Metadata wird aus dem setup.py script herauswandern und stattdessen in einem ini file zur Verfügung gestellt (Da ist mir noch nicht ganz klar wie das funktionieren soll - aber gut).
  • Deinstallieren wird auch mit den distutils gehen - man braucht also nicht mehr pip um das zu machen

Und noch mehr. Aber das find ich schon mal am wichtigsten. :)

Flagge zeigen

Zur Schweinegrippe

Meine Mutter hat diesen lesenswerten Text dazu geschrieben - und den möchte ich gerne (mit ihrer Erlaubnis) noch mehr Leuten zugänglich machen. Grund dafür ist diese Email die gerade mit diversen gut klingenden Arzt-Namen als Absender auch durch meine Inbox wandert


Für alle, die überlegen sich impfen zu lassen :

Die beiden Impfstoffe gegen die so genannte Schweinegrippe *Pandemrix® Und Focetria®,* enthalten als Adjuvans (Impfverstärker ) *Squalen*. Beim Menschen ist Squalen bei den US-Soldaten des ersten Golfkriegs als Impfverstärker eingesetzt worden.

23-27% (also jeder Vierte, auch solche, die zu Hause blieben) bekamen Die Golfkriegskrankheit, Mit chronischer Müdigkeit, Fibromyalgie (Muskelrheuma), neben Gedächtnis-und Konzentrationsproblemen, persistierenden Kopfschmerzen, Erschöpfung und ausgedehnten Schmerzen charakterisiert. Die Krankheit Kann auch chronische Verdauungsprobleme und Hautausschlag einschließen.

Die Erkrankung hat sich seit 1991 also seit 18 Jahren nicht gebessert. Bei 95 % der Geimpften mit Golfkriegssyndrom wurden Squalen-Antikörper Gefunden.

Erst nach mehr als 10 Jahren wurden die Schäden vom US-Verteidigungsministerium anerkannt.

Wenn die Bundesregierung ihren Willen durchsetzt und 35 Millionen Menschen geimpft werden, ist damit zu rechnen, dass 8-9 Millionen Bundesbürger für die nächsten Jahrzehnte unter chronischer Müdigkeit und Fibromyalgie etc. leiden werden.

Unterschrieben von: $GUT_KLINGENDER_ARZT_NAME


Dazu hat sie diese gute Antwort geschrieben:

Ja, es stimmt. Pandemrix + Focetria enthalten Squalen, das injiziert zum Imunogen wird. Das ist seine wirkstoffverstärkende Ebene. Es wird auch in unserer Leber produziert, aber liegt natürlicherweise in öliger Form vor. Im Impfstoff aber als Emulsion, was einen Unterschied für die Verstoffwechselung im Körper macht. Der Verdacht, dass es etwas mit dem Golfkriegsyndrom zu tun hat, ist nicht erhärtet. Neuere Studien mit größeren Teilnehmergruppen zeigen keinen Zusammenhang zwischen Squalen-Antikörpern und chron. Symptomen.- Dennoch wird unabhängig von diesem Aspekt der Debatte um diese Impfstoffe ihre Sicherheit als ungenügend geprüft eingeschätzt. Er wird schlechter vertragen als ein Spaltimpfstoff ohne Wirkverstärker. Das ist sicher. ER wurde noch nicht an Schwangeren und Kindern erprobt und die jetzt eingesetzte Wirkstoffverstärkerdosis ist viel höher als in bisher eingesetzten Impfungen. Nebenwirkungen wurden noch nicht systematisch erfaßt. Auch seine Wirksamkeit ist noch nicht hinreichend erforscht, da eine verringerte Dosierung gegenüber der Zulassungsphase jetzt vermarktet wird.

Da die Grippe gutartig abläuft und kein höheres Risiko darstellt, als die bisherigen Herbstgrippen, ist davon bei sonst gesunden Menschen abzuraten, ebenso bei Schwangeren und Kindern. Hier herum impfen nur wenige Ärzte und auch die Kinderärzte sind sehr zurückhaltend. Jürgen hat herausgefunden, dass 1974 dieser Virus schon mal "um die Welt lief", so dass alle, die damals schon sich anstecken konnten, wahrscheinlich immun sind.

Mein Rat an alle, die sich schützen wollen und dazu beitragen möchten, das sich die Viren nicht ausbreiten:

  1. Bei ersten Symptomen ca 25 mg Zink einnehmen (gibt es als Tabletten) an zwei aufeinanderfolgenden Tagen. Parallel dazu Vitamin C Stoß mit heißer Zitrone o.ä. 2x täglich.
  2. Cystus 052 Infektblocker Tabl. lutschen (pflanzlicher Virenblocker).
  3. Wenn Fieber kommt, dieses auf über 39°C steigen lassen und abwarten. Viren werden durch Temperaturen über 39°C abgetötet. Es ist der effektivste Abwehrmechanismus. Die Nebenwirkungen des Fieberanstiegs ertragen sich am besten im Bett mit viel trinken und schlafen. Sobald die Viren keine Bedrohung mehr darstellen, geht das Fieber wieder runter (bei normalem Verlauf).
  4. Auch ohne Fieber soll sich jeder im Stadium des Niesen und Hustens von seinen Mitmenschen fernhalten, da er wie eine lebende Viren-Schleuder wirkt. Am besten freiwillig daheim bleiben und viel Zeit auf Pflege der Gesundheit verwenden (Nasenspülung, Inhalieren, Tee trinken, ausruhen, an die frische Luft gehen wenn möglich, Basenbäder nehmen, bei Bedarf Brustwickel, Atemübungen, viel frisches Obst).

Ich hoffe dass das auch für viele anderen Leute einiges an Fragen beantwortet und die Pharmaindustrie hoffentlich deutlich einnahmen kostet.

Das Wikipedia Dilemma Lösen

Ich weiß ich bin etwas spät mich dazu auch zu äussern - aber jetzt wo die  Wikipedia wieder zu Spenden aufruft möchte ich was dazu sagen wieso ich nicht spende.

Das ist doch alles Kindergarten was in der Wikipedia gerade läuft.

Also gut, "embrace your enemy" oder wie es heißt, da können wir etwas tun.

Lasst uns einen Kindergarten eröffnen. Jeder neue Wikipedia-Artikel ist zuerst im Kindergarten und wenn er Groß und Stark geworden ist kann er irgendwann ins Erwachsenen-Artikel-Leben übertreten.

Das hätte folgenden Vorteil: Alle Exkludisten und die die nur die beste Qualität haben wollen legen einen Schalter um und sehen diese Einträge erst mal nicht.

Alle anderen verlieren nicht sofort die Lust an der Mitarbeit wenn einer Ihrer Artikel gelöscht wurde - weil er nicht gelöscht wurde.

Wenn jemand auf eine Seite kommt die unterhalb seines Qualitätslevels liegt, kann er ja einen Hinweis kriegen dass sie existiert, damit er sie mit einem Klick zu sehen bekommt bzw. er seine Einstellung ändern kann.

Alle sind Glücklich!

  • Jeder Artikel kann jederzeit in den Kindergarten geschickt werden bis er groß wird.
  • Jeder Artikel kann jederzeit aus dem Kindergarten "graduieren"
  • Wer nur Inhalte von größtmöglicher geprüfter Qualität sehen möchte kann diese ausschließen
  • Alle Anderen kriegen einen deutlichen Hinweis dass der Artikel noch im "Kindergarten" ist
  • Man könnte Kindergarten Artikel generell anders Rendern damit der Unterschied ganz klar ist

Ich persönlich würde es vorziehen wenn die Standardeinstellung "Alles anzeigen" ist - aber auch wenn der Standard wäre "nur die geprüften Artikel anzeigen" und man jederzeit sieht wenn man an einer Stelle ist die im Kindergarten noch mehr Inhalt enthällt und man die nach bedarf zeigen kann wäre ich zufrieden.

Platz ist in der Wikipedia ja kein Problem - nur von Admins und regelmäßigen Mitarbeitern gepflegter Platz ist knapp.

Was ich will, ist das die User entscheiden können was sie lieber wollen. Mehr Artikel, oder besser geflegte - und nicht die die die meiste Zeit in das Projekt stecken. Das halte ich für absolut wichtig.

Ach ja, und falls das innerhalb der Wikipedia nicht funktioniert, müsste man so etwas als eigene Applikation davor setzen wikinursery.de / kindergarten.wikipedia.de oder per greasemonkey oder als iPhone App oder eben als "vollständige Wikipedia" irgendwo anders.

Nur innerhalb der Wikipedia wäre natürlich am besten - wobei zweifelhaft ist ob die macher des Projekts dafür bereit sind.

Ja, die Idee wurde schon von ein paar anderen Leuten geäussert - ich wollte sie auch noch einmal aufschreiben weil ich sie so wichtig finde.

  • Posted: 2009-11-14 12:22 (Updated: 2009-11-14 12:24)
  • Author: dwt
  • Categories: fnord
  • Comments (0)

Hamam

Wie viel kostet die Finanzkriese?

Im vergleich zum Irak-Krieg? Oder alle Kinder dieser Welt für 5 Jahre zu ernähren?

 Hier wunderschön visualisiert.

So viel ist klar - man sieht was wichtig ist im Staat und was nicht. Leider.

 via

Wieso Blöcke keine echten Funktionen sein sollten

Zu  "Ergie" von Rainer von Vielen

In meiner Freizeit beschäftige ich mich gerade viel mit Ruby - sowohl  The Ruby Way, als auch  The Ruby Programming Language sind dafür gute Bücher.

Und ich muss sagen, das Ruby ist nicht unspannend. Zwar gibt es auch einiges dass ich ganz schön eklig finde (z.B. das Flip-Flop Statement, oder dass so viel mit globalen Variablen gearbeitet wird, oder dass viele Sachen so komplex sind.

Aber darum gehts hier gar nicht. Mir geht es hier um die Erkenntnis wieso und unter welchen umständen man Blöcke als etwas anderes sehen möchte als anonyme Funktionen.

Das dauert nämlich bis man das merkt.

Zuerst einmal die Konfusion: Ruby hat eine Syntax für Methoden

def method(positional_argument, *all_other_arguments)
  # some body
end

und eine für Blöcke

10.times do |positonal_argument, *all_other_arguments|
  # some body
end

Wieso der Unterschied? Wieso macht man Blöcke nicht einfach zu normalen Funktionen die man dann auch gleich mit () aufrufen kann anstatt immer ein a_block.call() verwenden zu müssen?

Echte Lambdas gibt es ja noch zusätzlich in Ruby.

Well, den Unterschied in der Syntax verstehe ich immer noch nicht. Aber dahinter steht der Grund dass Blöcke eine andere Aufgabe haben als Methoden - der Punkt ist nämlich dass man sie gerne als Teil der sie lexikalisch umgebenden Methode betrachten möchte damit man sie nutzen kann um mit ihnen Kontrollstrukturen zu implementieren. Hier mal ein Beispiel:

def find(needle, haystack)
  haystack.each.with_index do |index, element|
    if element == needle
      return index
    end
  end
  return nil
end

(Also als Python Programmierer muss ich ja sagen dass die end statements ganz schön auf die Nerven gehen. Doppelte Zeilenanzahl für null zusätzliche Information oder Nützlichkeit. But I digress.)

Das spannende daran ist die Zeile return index. Seht ihr was daran besonders ist? Ich Puzzle es mal auseinander als wäre der Block eine funktion, dann wird es klar.

find ruft einen iterator auf dem haystack auf, d.h. übergibt ihm eine Funktion die das richtige Element findet. Diese Funktion erhällt ein Element aus dem haystack und einen index und gibt diesen index zurück wenn das element das gesuchte ist.

Und da ist das Problem: Damit find funktioniert muss return index find verlassen und nicht nur die iterator-funktion.

Das ist der Grund wieso man Blöcke als etwas anderes als Funktionen/Methoden betrachten muss wenn man sie nutzen will um damit Kontrollstrukturen implementieren zu können und ihre volle Nützlichkeit für Abstraktionen verwenden zu können.

Worin liegt der Erfolg von "Ruby on Rails"

Liegt es vielleicht wie  auf Stackoverflow angekündigt an der Sprache?

Jedenfalls fand ich den ersten Kommentar hervorragend.

  "Python on Pails" just doesn't have the same feel to it... – ephemient
  @Ephemient: I believe it would be Python on Planes. – Jimmy
  @Jimmy: Who needs planes? import antigravity ;-) xkcd.com/353 – Vinay Sajip
  Is there a Java in Jails? – Nosredna

*lol* Eindeutig, die Sprache ist schuld.

  • Posted: 2009-10-24 10:42 (Updated: 2009-11-04 10:07)
  • Author: dwt
  • Categories: funny
  • Comments (0)

Playing with JavaScript variable lookup

I am always amazed at the very nice features of JavaScript on the one hand and the very, very bad features of it on the other side.

Here's something I learned the other week that I find quite interesting: eval vs. new Function. Here's what I wanted to achieve: I was looking for a way to do some meta-programming with JavaScrip, specifically prevent the problem that any variable you assign to but don't declare ends up as a member of the global object.

The problem is that name lookup in JavaScript is quite peculiar. First it consults the current function activation for local variables and then it goes straight back to the window object and just prepends all it's contents to the local namespace.

Doh. This has the very bad consequence that every variable you forget to declare via the var someVariableName syntax becomes part of the global object - and therefore itself global.

Now you can change this lookup by inserting some of your objects in this lookup chain by using the  somewhat controversial with statement like so:

var namespace = {foo:'bar'};
with (namespace) {
    // this scope now has a local variable foo with the value bar
}

This is considered a bad feature, as it means that if you assign to foo that will assign a new value to namespace but if you assign to something else or mistype, that will still end up on the global object. Not very nice - and therefore most JavaScript programmers don't use with ever.

Still with some working and eval it can be used to re-map free functions transparently, so that you can do something like this:

var namespace = {
    equals: function(actual, expected){
        if (actual !== expected)
            console.log('actual', actual, 'does not equal expected', expected);
    }
}

function test(aDescription, aTestFunction) {
    useNamespaceForFunction(namespace , aTestFunction)();
}

test("that I can call equals as a free function", function(){
    equals(1,1);
});

Which would allow you to not pollute the global namespace with all the testing equality functions but still call them in a convenient way (that is without needing to go through an object.

All in all, quite nice really - even though I haven't really found a use for this yet. :-)

Implementing the useNamespaceForFunction however isn't quite as straightforward as I had thought - here's my first go at it:

function useNamespaceForFunction(aNamespace, aFunction) {
    with (aNamespace) {
        return  eval('(' + aFunction + ')');
    }
}

I have since learned that actually using new Function to do the eval might be quite a good idea as the whole point of it is that it ignores the namespace around it, so here's my version two:

function useNamespaceForFunction(aNamespace, aFunction) {
    var namespacingCode = "with (aNamespace) { return (" + aFunction + "); }";
    // using new Function instead of eval to prevent the current namespace leaking into the eval<
    return new Function("aNamespace", namespacingCode)(aNamespace);
}

So, lets see what uses come up for this technique - I've seen some js code that does an Interpreter of sorts with this trick - but thats about it.

So - I didn't achieve my initial goal - but I did come nearer to it. So I'll call it a success here for now.

If you find any use for this technique, please let me know!

Get the source!

  • Posted: 2009-10-17 18:11 (Updated: 2009-10-24 16:02)
  • Author: dwt
  • Categories: code
  • Comments (0)

Simple super

Python is a wonderfull language - except when it's not.

For example calling a super-method is really, really hard. Here's an example:

class Super(object):
    def method(self):
        pass

class Sub(Super):
    def method(self):
        super(Sub, self).method()

This is bad because of several reasons:

If your class names become longer this becomes more and more unreadable, consider this Acceptance-Test

class CanEnterUsernameAndPasswordOnLoginForm(TestCase):
    def setUp(self):
        super(CanEnterUsernameAndPasswordOnLoginForm, self).setUp()
        # more

You need to repeat the class name in each method that calls super. This is especially bad if you rename your class as you need to repeat the name in so many places - also there might be situations where having the wrong name doesn't bomb but just calls the wrong code. Also if you move methods up and down the class-inheritance-chain this becomes more and more annoying.

Well, so I looked at what you can do with some meta-programming - and lo and behold there's a lot you can do.

Here's an example what I ended up with:

class Super(object):
    super = SuperProxy()
    def method(self):
        pass

class Sub(Super):
    def method(self):
        self.super()

Yeah! Now that's simpler. to call super you can use several syntaxes:

  • self.super() just calls the super method of the same name and hands it all arguments that the current method got
  • self.super('foo') this way you can hand specific methods to the super-class and prevent the automatic gathering of arguments. If you prefer explicit - this is it.
  • self.super.some_method() self.super is exactly the same as what the super-method returns (so it's the same as super(ThisClass, self)) so you can use it to call any method on the superclass and hand it any arguments you want.

Well, so I consider this a boon for any bigger python project as it considerably eases the pain of working with class-hierarchies, and best of all you can import it into your project one superclass at a time.

Oh, and please tell me if you use it and like it. :-)

So here's the code!

  • Posted: 2009-10-14 20:49 (Updated: 2009-10-14 20:50)
  • Author: dwt
  • Categories: code
  • Comments (0)

Demokratie ohne Parteien

Die Welt hat ein  Interview mit Juli Zeh geführt, in der sie darüber spricht, was sie gerade als staatstheoretisches Konzept ausarbeitet - und wie darin Parteien nicht vorkommen.

Das ist spannend - insbesondere weil ich mich im Rahmen  der Piratenpartei und  des Liquid Democracy e.V. und eben auch privat seit Jahren mit genau diesem Thema beschäftige.

Julis (und auch meine) Motivation ist dabei, dass die Parteien als "vorportioniertes Politikbündel", das man so fressen oder es lassen kann, inzwischen mehr zurückhaltende als vorwärts tragende Kraft sind.

Da ist zum einen der Zwang, dass ich mich für ein Politikbündel irgendeiner Partei entscheiden muss, wobei aber jedes Bündel für sich in mehr Punkten meiner Meinung widerspricht als ich es unterstützten kann.

Zum anderen die Tendenz, dass Parteien einen immer stärkeren Fokus auf Machterhalt, Personen und Einflussnahme von reichen Industriezweigen entwickeln.

Genau das aber will Juli - und ich - nicht. Demokratie als sachlicher Diskurs unter Einbeziehung allen verfügbaren Wissens und ohne Populismus - das ist eine Vision, die jetzt vielleicht endlich durch die neuen Möglichkeiten des Internets in erreichbare Nähe gerückt ist.

Worum es mir geht ist das Nachdenken über neue Formen der politischen Partizipation.

Wir sehen in der Struktur der Legislative das eigentliche Problem und wollen diese ändern.

Jeder Bürger soll die Möglichkeit erhalten, an so vielen politischen Fragen mitzudiskutieren und mitzuentscheiden, wie er möchte. Das nennen wir "Flüssige Demokratie", weil jeder jederzeit selbst entscheiden kann, wie tief er sich in ein Thema einbringen will und kann.

Wenn mich etwas nicht interessiert, kann ich weiterhin eine Partei wählen, damit sie mich vertritt. Wenn ich zu einem bestimmten Thema (z.B. Bundeswehreinsatz in Afghanistan) selbst abstimmen möchte kann ich das aber jederzeit tun. Und wenn es darum geht mein Fachwissen (z.B. als Informatiker) in die Umsetzung eines Konzepts einzubringen (z.B. zur Frage, wie man die Verwaltung besser transparent machen kann) dann steht es mir frei, in der Konzeptionsphase schon mit einzusteigen oder selbst ein Konzept zu entwickeln und an der ganzen Entstehung mitzuarbeiten.

Das ist eine Vision, die weit über alles hinausgeht, was mir als Konzept bisher begegnet ist. Vor allem aber ist es genau dieser flüssige Ansatz, der dieses Konzept in die Lage versetzt, nahezu unendlich zu skalieren. Mein Dorf, mein Landkreis, mein Land, mein Kontinent, meine Welt - überall kann ich mich dort beteiligen, wo ich es als am Wichtigsten erachte.

Nur als Nebensatz: Ich bin der Meinung dass ein bedingungsloses Grundeinkommen eine hervorragende Bezahlung für genau diese freiwillige demokratische Arbeit ist und wir es daher dringend brauchen.

Mehr Details zu dieser Idee gibt es auf:  http://liqd.de und auf allen anderen Links in diesem Artikel.

Ich bin Martin Häcker, ich bin Vorstand der Piratenpartei Landesverband Berlin. Wir haben bei der letzten Bundestagswahl 3,4 % der Stimmen der Berliner erhalten. Und wir wollen das trojanische Pferd sein, das diese Vision in die Parlamente trägt, indem wir es innerhalb der Partei einsetzen, um unser Programm gemeinsam - wirklich basisdemokratisch - zu erarbeiten.

  • Posted: 2009-10-03 22:21 (Updated: 2009-10-03 23:26)
  • Author: dwt
  • Categories: politik
  • Comments (0)

3,4 % in Berlin

Yeehaw!

Na wenn das nicht ein tolles erstes Bundestagswahlergebnis für die Piraten ist!

Bundesweit waren es 2,0 % - 'immerhin' 0,5 % besser als das erste Ergebnis der Grünen (mit denen wir ja so oft verglichen werden).

*katerausschlaf*

Eine ganz gute Übersicht über die Ergebnisse gibt es  bei ARD

Blocks in Objective C

I've long had a fascination with SmallTalk style blocks in Objective-C. So much so, that I learned a lot about how C and GCC work when I implemented them on the primitive of GCCs nested functions myself.

Heres the Source

Of course, just as I had it working, Apple deprecated GCCs nested functions, as they where implemented using a trampoline on the stack. And of course, a trampoline being executable code they where out when the non executable stack came in.

Ah well.

BUT, Apple just released with Snow-Leopard a new compiler feature [Blocks]!

Yay, closures in C!

So here's how it looks if you implement the Smalltalk collection iteration protocoll in ObjC. (Note: this of course are not propper ObjC-Names, but each Smalltalker will none the less get a tear in their eye when they see this)

#import <Foundation/Foundation.h>

@implementation NSArray (BlocksTest)

- (void) do:(void (^)(id))aBlock;
{
    // Take care, -enumerateObjectsUsingBlock: wraps an auto-release pool around the iteration
    [self enumerateObjectsUsingBlock:
        ^(id obj, NSUInteger idx, BOOL *stop) {
            aBlock(obj);
        }];
}

- (NSArray *) collect:(id (^)(id))aBlock;
{
    id collectedItems = [NSMutableArray arrayWithCapacity:[self count]];
    [self do:^(id each) {
        [collectedItems addObject:aBlock(each)];
    }];
    return [collectedItems copy]; // REFACT: consider to drop copy
}

- (id) detect:(BOOL (^)(id))aBlock;
{
    // Take care, -enumerateObjectsUsingBlock: wraps an auto-release pool around the iteration
    __block id resultObject = nil;
    [self enumerateObjectsUsingBlock:
        ^(id obj, NSUInteger idx, BOOL *stop) {
            if (aBlock(obj)) {
                resultObject = obj;
                *stop = YES;
            }
        }];
    return resultObject;
}

- (id) detect:(BOOL (^)(id))aBlock ifNone:(id (^)())errorBlock;
{
    id foundElement  = [self detect:aBlock];
    if (foundElement)
        return foundElement;
    else
        return errorBlock();
}

- (id) inject:(id)aValue into:(id (^)(id, id))aBlock;
{
    // Need to take care with retain here, because apple wraps an auto-release pool around the block iterator. :/
    __block id collected = [aValue retain];
    [self do:^(id each){
        collected = [aBlock([collected autorelease], each) retain];
    }];
    return [collected autorelease];
}

- (NSArray *) reject:(BOOL (^)(id))aBlock;
{
    id selectedObjects = [NSMutableArray arrayWithCapacity:[self count]];
    [self do:^(id each){
        if (aBlock(each))
            return;
        [selectedObjects addObject:each];
    }];
    return [selectedObjects copy]; // REFACT: consider to drop copy
}

- (NSArray *) select:(BOOL (^)(id))aBlock;
{
    return [self reject:^(id each){ return (BOOL) ! aBlock(each); }];
}
@end


#define log(objcObject) fprintf(stdout, "%s\n", [[objcObject description] UTF8String])

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    
    id array = [NSArray arrayWithObjects:@"first", @"second", @"third", nil];
    
    log(@"\ndo:");
    [array do:^(id each){
        log(each);
    }];
    
    log(@"\ncollect:");
    log([array collect:^id(id each){
        return [each uppercaseString];
    }]);
    
    log(@"\ndetect:");
    log([array detect:^(id each){
        return [each isEqual:@"second"];
    }]);
    
    log(@"\ndetect:ifNone:");
    log([array detect:^(id each){ return NO; } 
                        ifNone:(id)^{ return @"Yeehaw!"; }]);
    
    log(@"\ninject:into:");
    log([array inject:@"" into: ^ id (id concatenation, id element){
        return [concatenation stringByAppendingString:element];
    }]);
    
    log(@"\nreject:");
    log([array reject:^(id each){
        return [each hasSuffix:@"nd"];
    }]);

    log(@"\nselect:");
    log([array select:^(id each){
        return [each hasSuffix:@"d"];
    }]);
    
    [pool drain];
    return 0;
}

Ain't that pretty?

Here's the current version!

  • Posted: 2009-09-26 23:14 (Updated: 2009-09-27 09:43)
  • Author: dwt
  • Categories: code
  • Comments (0)

Zur Polizeigewalt auf der Freiheit statt Angst-Demo

Spannend - vor allem die diversen Analysen im Netz dazu.

 Peter Piksa hat die beste Zusammenfassung der Ereignisse die ich kenne.

Besonders Spannend finde ich da  die Nachlese von Markus Hansen der sehr schön die Fakten zu Körperlicher Gewalt auf den Tisch legt.

Sehr Lesenswert.

Der Kampf gegen den Überwachungsstaat…

ist auch meine Sache.

 Und die von Gerhart Baum. Der immerhin ein Innenminister war der tatsächlich Gesetze für Bürgerrechte gemacht hat.

Ahoi!

IE 8 oh IE 8, wärst Du doch kein IE 7...

Heute bin ich auf einen sehr interessanten Bug gestoßen - im IE natürlich. Genauer genommen im IE 8.

Folgendes ist passiert: Wir hatten ein Problem mit dem Rendering einer Webapplikation - dort fehlte mal wieder ein Teil das eigentlich hätte da sein sollen. Stellt sich heraus, dass auf manchen der Rechner der IE 8 die Seite im IE 7 Kompatibilitätsmodus gerendert hat - ok wir hatten also eigentlich einen Bug mit dem IE 7 der das CSS nicht vertragen hat. Soweit so gut.

Mysteriös war das ganze, denn es ließ sich auf verschiednen Rechnern nicht reproduzieren. Dabei verwendeten wir sogar die gleichen images ( VirtualBox ich liebe dich).

Ok, wir sind also irgendwie auf manchen Rechnern in den IE 7 Kompatibilitätsmodus gerutscht. Wirklich Lustig wurde dass als wir auf  dieser Seite auf die Erklärung gestoßen sind:

IE 8 kann nämlich den IE 7 emulieren. Aus 'Kompatibilitätsgründen'. Und weil das natürlich total kompatibel sein muss hat Microsoft das so eingestellt dass alle Intranetseiten automatisch im IE 7 Modus gerendert werden - natürlich ohne einen Knopf mit dem man das abstellen kann. (Andersrum gibt es schon einen…)

Das geile daran: IE erkennt Intranetseiten nicht an der IP, sondern an der Domain! Weil das nicht anders geht! [sic] Und da auf dem anderen Rechner die Webseite per IP aufgerufen wurde wurde das Problem da nicht sichtbar…

Überhaupt ist die Implementierung dieses Kompatibilitätsmodus eine einzige Katastrophe.

  1. Der Modus aktiviert sich automatisch für Intranet-Webseiten
  2. Er lässt sich für diese nicht deaktivieren
  3. IE merkt sich welche Webseiten der User irgendwann schon einmal (vielleicht aus versehen) in den Kompatibilitätsmodus geschaltet hat - aber löscht dieses Wissen wenn man die History löscht.
  4. Jede Webseite kann diese User-Einstellung überschreiben, indem sie einen meta-tag setzt
    1. und dann wird die User-Einstellung auch gleich komplett gelöscht! (*rotflol*)
    2. Man kann über den Meta-Tag nur einstellen dass man gerne eine IE 8 Emulation hätte - wenn der IE 9 dann herauskommt darf man also wieder ran und noch mehr Meta-Tags definieren… (*kotz*)

Also wirklich verkackt auf der ganzen Linie - eine  Lektüre des Original-Artikels ist wirklich empfohlen. :)

Ich bleibe dabei: Daß wir oft an Wahlkampfaussagen gemessen werden, ist nicht gerecht.

Neues vom Grundeinkommen

Dazu gibt es ja viel zu wenige empirische Experimente - nur mehr oder weniger begründete Vermutungen von allen Seiten.

Gerade deswegen finde ich es so ungemein wichtig dass diese Experimente jetzt beginnen, damit wir wissen was aus dieser Idee werden kann und wie man sie umsetzen kann dass es funktioniert.

Schließlich wollen wir nicht dass wir alle wie die Maori-Indianer in ihren Reservaten enden, die zwar ein Grundeinkommen garantiert haben (da fühlt sich die US-Regierung offenbar doch sehr schuldig) aber die ohne eine kulturelle Identität nur vor sich hin vegitieren können.

Was wir brauchen ist eine Lotterie an der sich alle Dörfer unter 10.000 Einwohner beteiligen können. Aus diesen Dörfern werden dann 3 Gewinner gezogen und denen 10 Jahre Lang ein Grundeinkommen bezahlt - in verschiedenen Höhen, in unterschiedlichen Ausprägungen. Natürlich mit wissenschaftlicher und psychologischer Betreuung.

Dann wissen wir mehr.

Und das coole ist, in Namibia hat  der Basic Income Grant (BIG) 2008 so ein Projekt gestartet - mit halbjährigen Evaluierungszyklen.

Und da kommen jetzt  die ersten  Ergebnisse herein.

 via

FreeNode dass ich nicht lache...

Heute bin ich mal wieder im CCC - und überraschenderweise fällt mir da diese Fehlermeldung auf:

20:05:26 wolfe.freenode.net: (notice) 
*** Banned:  You've been temporarily blocked 
due to filtering problems. Sorry for the 
inconvenience! Mail kline@freenode.net with questions. 

Well, da melde ich mich doch mal:

Your IP address is: 195.160.172.2
Your hostname is: fuckup.club.berlin.ccc.de
I am writing this because I got a message about a 
filtering problem that accidentally banned me.

So here I am.

To witch I got this answer:

Please connect from a host which has an IP that doesn't resolve to a
name that contains "fuck".

Thanks,
stew

Meine Hinweis dass:

You do realize that this is in reference to the "First Universal 
Cybernetic-Kinetic Ultra-Micro Programmer" from 
Hagbard Celine in the Illuminati Trilogy?

So I'd urge you to please take that out of the filter list.

wurde dann allerdings nur noch abgebügelt.

No, and I don't think you should expect people to know this reference.

> So I'd urge you to please take that out of the filter list.

I don't believe there are any plans to change this filter.

thanks,
stew

Tja. So viel zu selbsternannten Moralaposteln die mit Wortfilterlisten spielen. Mein Vorschlag: Erwachsen werden und  Illuminatus! lesen!

Update:  Florian hatte die gute Idee doch mal nach dem Servernamen von Freenode auf dem ich connected war zu googeln. Sieh an, was für eindeutige Angebote... Ich finde im Lichte dieser neuen Erkenntnis sollten die dort dringend ihren Servernamen ändern.

  • Posted: 2009-07-13 19:20 (Updated: 2009-07-14 11:51)
  • Author: dwt
  • Categories: fnord
  • Comments (0)

Programmierer-Fun

 Stackoverflow ist immer wieder ein Quell der Freude:

Dazu auch eine absolute Weisheit:

Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Rick Osborne

Git Handarbeit II: Submodules

Noch so eine Stelle an der GIT einem extra viel Handarbeit aufdrückt. Submodules.

Erst mal die Idee (die eigentlich ganz gut ist): Oft will man Teile der Software (Frameworks, Plugins, ...) eigentlich als eigenes Projekt in einem eigenen Repository entwickeln. Und das ist GUT (TM).

Daher bieten eigentlich alle etwas fortgeschritteneren Versionskontrollsysteme irgend eine Möglichkeit solche externen Repositories einzubinden, damit man es einfach hat an aktuelle Versionen dieses Codes heranzukommen.

Dazu gibt es jetzt in der Regel zwei Ansätze: Entweder man verlinkt einfach auf den HEAD des anderen Repos oder auf eine bestimmte Revision. Letzteres ist im allgemeinen Fall zwingend, denn sonst hat man nie die Chance einen alten Build auch tatsächlich exakt wieder herzustellen - im Speziellen Fall ist ersteres aber sehr Praktisch, wenn man z.B. aus einem globalen Repository einfach Teile an verschiedenen Stellen einblenden möchte, damit sie im Repo nur einmal, im Checkout aber mehrfach oder einfach an einer anderen Stelle erscheinen.

SVN macht das mit  svn:external attributen die sowohl auf HEAD als auch auf spezifische Revisionen verlinken können. HG macht das mit  forests ( noch eine extension), bzr weiß ich nicht und git macht das mit submodules.

Bei SVN hat man noch den Nachteil das es, weil es branches und tags nur als Verzeichnisse kennt natürlich auch Handarbeit erfordert, das hießt, dass man beim Taggen von HEAD z.B. nicht automatisch von dem link auf einen anderen HEAD auf einen Link auf eine spezifische Revision umschalten kann. Das gibt dann das Ergebnis, dass man oft im Tag auf den HEAD eines anderen Teils des Repos verweist. Gratulation! Und wiedererzeugbare Builds ade.

Besonders geärgert haben mich aber die GIT-Submodules. Zuerst: Die sind auch ein Plugin - und in bester GIT manier gibt es natürlich überhaupt keine integration in die anderen Kommandos.

Das bedeutet schon mal das man nicht ein Repository pullen kann um danach einen Build zu machen - NEIN, man muss erst merken dass man noch die Submodules benötigt und dann git submodule init && git submodule update eingeben.

Yeah. Give me useless extra steps!

Es wird aber noch besser, weil es keine Intgegration gibt, sieht man natürlich mit git status nicht das es in einem submodule Änderungen gab. Ok, das stimmt nicht ganz. Man sieht nicht dass es in einem submodule uncommittete Änderungen gab. Commitet man dann nämlich dort, dann sieht man im parent repository dass sich etwas verändert hat - und dass muss man dann nochmal committen.

Yeah. Give me useless extra steps!

Auch schön, wenn man z.B. von GitHub ein Projekt mit Submodules auscheckt, dann zeigt der Origin des Projekts auf GitHub - sinnvoll, weil dahin wird man seine eigenen changes ja schieben wollen, damit Upstream sie mergen kann. Nicht so bei submodules - dort zeigt der origin natürlich auf das ursprüngliche Projekt - auf das man natürlich regelmäßig nicht pushen kann/will. Man muss also einen eigenen branch des submodules auf GitHub anlegen und dann das bei sich von hand als Branch registrieren und dann immer daran denken das im submodule natürlich nicht origin sonder ein anderer name für den parent branch gilt.

Yeah. Give me useless extra steps!

Hach, und natürlich sind GIT submodules IMMER auf eine bestimmte Revision gebunden - tollerweise auch gleich ohne mitzubekommen auf welchem Branch diese jetzt liegt. Das heißt dass man sowieso dort drin per default nix committen kann. Man muss also in jedem fall einen eigenen Remote clone des origins anlegen, den als neuen Remote eintragen, dann einen lokalen tracking branch erstellen, auf den wechseln, dort dann commiten und jeweils nicht vergessen diese Commits im Parent Repo dann zu bestätigen (einzeln natürlich, sonst sieht man dort die history nicht). Das geile daran: macht man dann im Parent Repo einmal git submodule update ist man natürlich wieder auf einer disconnected revision.

Yeeehaw. Give me useless extra steps!

Umbenennen ist noch so eine Sache, DVCS sind ja so toll beim Mergen, nicht? Aber wehe man benennt ein Submodule um. Dann nämlich kriegt man das nach git pull && git submodule update NICHT. Nein, viel besser man muss lediglich .git/config von hand bearbeiten um den alten submodule Eintrag zu entfernen und dann ein git submodule init && git submodule update machen.

Yeah. Give me useless extra steps!

Mein Fazit: GIT, das Tool für Leute die gerne mehr Zeit in ihr DVCS als in ihre Software stecken wollen.

Mal auf den Punkt gebracht

Volker Pispers hat eine wunderschöne Sendung auf dem Deutschlandfunk gehabt. Und die ist  jetzt bei YouTube

Hier etwas zum Anfixen:

"Unter Hitler hatten wir auch den Fingerabdruck im Personalausweiß. Haben die Mütter und Väter des Grundgesetztes abgeschafft. Die haben wörtlich gesagt: Der deutsche ist kein Verbrecher. Das wissen Schilly und Schäuble natürlich besser.

Man kann Menschen nicht daran hindern von sich auf Andere zu schließen."

 Hier auf Youtube

Google Wave kurz erklärt

Hach...

$this->doSomethingWith($someNonExistingVariable)

PHP ist wirklich eine Drecksprache. Selbst JavaScript kann das besser.

Man mache irgend etwas mit einer Variablen bei deren Namen man sich verschrieben hat. Dann würde man erwarten dass einen der Interpreter in irgend einer Form darauf hinweist. Wenigstens ein bisschen, mit einer Log-Meldung vielleicht. Sowas ist ja nicht schwer zu machen.

Aber, nicht so bei PHP. Vermutlich wieder aus den ominösen Performance-Gründen.

Vielleicht gibt es sogar irgendwo eine Option mit der man solche warnings zuschalten kann.

Aber alleine die Tatsache das man Gehirnzellen darauf verbrennen muss...

*grumpf*

Ok, der workaround ist dass sich jeder Entwickler in seiner php.ini diese Zeilen aufnehmen muss:

display_errors = On
error_reporting = E_STRICT

Der Witz daran E_STRICT warnt natürlich bei noch mehr Sachen als E_ALL. Sogar der MediaWiki Source des aktuellen Releases wirft da noch mit Warnings um sich.

Unglaublich.

Ken Schwaber in Action

Ich muss sagen, er spricht wirklich gut - seine Erklärung von Scrum ist jedenfalls wirklich gut verständlich.

 Hier auf YouTube

Ein paar interessante Punkte zu seinem Vortrag:

  • Keine Folien - er hällt den Vortrag komplett frei
  • Kein Verkaufsgespräch - er nimmt klar in den Mund welche Probleme durch Scrum sichtbar werden (und natürlich ist das eine ganz hervorragende Verkaufstaktik)
  • Alle Graphen / Schaubilder malt er on demand an die Tafel - einfach und effektiv.

Scrum Master

Nach ausführlicher intensiver und langwieriger Schulung von zwei Tagen - bin ich jetzt zertifizierter Scrum Master.

Wow.

Da sollte man natürlich etwas darüber schreiben was Scrum ist und was ein Scrum-Master tut. Well... ich rede mich mal damit heraus dass das Training sooo anstrengend war dass ich jetzt einfach nicht mehr kann.

Aber gott sei Dank gibt es auf YouTube ein paar Berichte von anderen Leuten die Scrum machen. :-)

Neben all dem Spaß gibt es aber auch  etwas ernsthaftere  Erklärungsansätze zu Scrum.

Git - das Werkzeug für Leute die gerne viel von hand machen

Puh, ich muss mir mal den Frust von der Seele schreiben den dieses Werkzeug mir bereitet hat.

Zuerst das Setup: Ich will zu einem Open Source Projekt beitragen dass leider GIT und GITHUB verrwendet.

Zuerst mal was mich wirklich frustriert hat. ich habe an ein DVCS (und speziell eines dass so sehr hyped wird wie GIT) ein paar ganz spezifische Requirements:

  1. Ich will dass ich meine Patches sauber getrennt voneinander entwickeln kann, damit man jeweils den ganzen Patch einfach sehen kann.
  2. Ich will die History dieser Entwicklung erhalten, damit die Code-Reviews die stattgefunden haben und die Gründe für Änderungen sichtbar bleiben
  3. Ich will einen stabilen Link auf den Head nur dieser Patches, damit der Maintainer es einfach hat diese bei sich zu integrieren und ich den in BugReports angeben kann
  4. Ich will die Patches als Layer über mein repository legen, damit ich von den Bugfixes die ich bereitstelle schon etwas habe solange sie noch nicht in dem Projekt akzeptiert wurden. Dieses Overlay-Repo stelle ich möglicherweise auch anderen Leuten zur Verfügung - optimalerweise können sie da auch Commiten.
  5. Ich will wenig Arbeit damit haben, damit ich mich auf die eigentliche Entwicklung konzentrieren kann und nicht ständig mit dem DVCS kämpfen muss.

Das letzte Requirement ist für mich dabei das wichtigste. Ich will Software und Patches entwickeln - und das DVCS das mich dabei unterstützt MUSS in den Hintergrund treten - sonst ist es schlicht und ergreifend ein schlechtes Tool. Und das ist auch schon der Todesstoß für GIT. So viel kann ich schon mal verraten - eigentlich kann GIT diese Requirements (die ja wohl für ein DVCS selbstverständlich sind) nämlich gar nicht erfüllen.

Dazu kommt dann natürlich noch der Ärger den man mit dem Index hat?.

Aber mal zu den Details.

Getrennte Patch-Entwicklung: Prinzipiell gibt es wohl zwei (oder drei) möglichkeiten. Die erste und die die sowohl im Manual als auch im IRC-Channel empfohlen wird ist das man doch einfach für jeden Patch einen branch macht. Die zweite und dritte Möglichkeit ist ein tool wie  StGit oder  TopGit zu verwenden. Beides sind externe Tools, die sich überhaupt nicht in GIT integrieren - und das bereitet eine Menge Probleme. StGit hab ich intensiver getestet - und von TopGit dass sogar in GIT-Kreisen als "kompliziert" gilt werde ich daher tunlichst die Finger lassen. Das Problem ist, dass man die Verwendung der Tools nicht mischen darf. Dazu ein Beispiel: Wenn man mit Mercurial PatchQueues arbeitet (das war letztlich mein Workaround, der wenigstens funktioniert!) dann sind die patchqueue Kommandos einfach weiter Subkommandos von hg - das bedeutet auch dass sie den vollen Repository-Status kennen und ihn in die Fehlermeldungen einbeziehen können. In der Praxis bedeutet dass, das wenn ich ein hg patchqueue Kommando absende und das Repository gerade in einem status ist der dazu nicht passt - dann kriegt man eine Fehlermeldung die einem nicht nur sagt das ein Problem aufgetreten ist, sondern auch was man tun kann um es zu lösen. (Leider sind die nicht immer perfekt, aber das ist wenigstens ein Start). Häuffig passiert das wenn man nach einem update von upstream die patches wieder anwenden will aber vergessen hat vorher den aktuellen status in hg zu commiten. Oder wenn man einen Patch verändert hat und zum nächsten wechseln will ohne das vorher aufzuzeichnen etc. Bei StGit ist das anders. Wenn da der Repository-Status nicht zu dem passt was StGit denkt das er wäre, dann wird das Repository einfach zerstört.

Yeah!

Bis man das dann gecheckt hat ist das Repository in einem Zustand, dass es weniger Arbeit ist mit diff und patch die patches wieder herauszufummeln als sich durch die diversen history-rewriting operatoren zu fummeln um doch etwas hinzubekommen was hoffentlich vielleicht doch das ist was man eigentlich hätte gewollt haben sollen. Oder so ähnlich.

Dazu kommt dass StGit die Patches schlicht als normale GIT-Revisionen speichert und die history-rewriting Möglichkeiten nutzt um das PatchQueue feeling aufkommen zu lassen. Und das ist dann auch der Grund wieso man StGit und Git Kommandos NIE, NIE, NIE mischen darf.

Bleibt also nur der erste Ansatz: Für jeden Patch einen Branch anlegen. Das wirkt eigentlich auch ganz Vernünftig, denn man kriegt dadurch eine Menge: Die History wird erhalten, man hat stabile Links in jeden Patch (ist ja nur ein Branch) und natürlich getrennte Entwicklung. Leider hört es da aber auf. Man kriegt nämlich keine Hilfe dabei die Patches als Layer übereinander zu legen - und besonders wichtig - wenig Arbeit damit zu haben.

Wenn von z.B. von upstream den aktuellen stand haben möchte, muss man das einmal für jeden Branch machen - und dann dort die Konflikte lösen. Hat man Abhängigkeiten zwischen den Patches (Bugfixes die aufeinander beruhen z.B.) wird es noch abenteuerlicher. Richtig toll wird es dann wenn man die ganzen Patches als Layer über sein eigenes Repository gelegt betrachten möchte. Unter GIT wird dazu empfohlen sog. "Integration" Branches zu verwenden - also Branches die man periodisch neu anlegt (mit sog. squash-commits) die aus einem anderen Branch nur noch einen einzigen Commit auf dem "integration" Branch machen. Das ist übrigens auch der Weg wie man aus den branches schöne patches macht - im integration branch. Das geile daran: Man muss das immer wieder machen - denn jedes mal wenn man die Patches weiterentwickelt muss man auch den integration branch komplett neu anlegen.

Ach ja, oder man schreibt natürlich in der History herum - aber dass hat letztlich den gleichen effekt - man hat eine Menge Arbeit und die URLS zu diesen Commits bleiben erst nicht die gleichen.

Ach genau, und es gibt natürlich noch Leute die Sagen History Rewriting geht und ist cool also mach es doch die ganze Zeit, dann bleiben auch deine Patches sauber. (Also im Prinzip das was StGit tut nur von Hand). Damit bin ich aber wieder meine Stabilen URLs los - und dass ist für mich nicht akzeptabel, weil ich dann wieder nix habe was ich in Bugreports verlinken kann)

Große Klasse.

Jetzt nachdem ich den ganzen Ärger durch hatte bin ich dann dabei angekommen dass ich schlicht keine Möglichkeit habe dem Upstream möglichst viel Arbeit abzunehmen und gleichzeitig Commit-URLs zu haben die sich nicht verändern (ach ja, dazu kommt noch das Upstream keine Branches in GITHUB mag - ich vermute mal dass ihnen das auch zu viel Arbeit ist). Na gut, wenn sie schon GIT verwenden müssen, dann dürfen sie auch die Extra-Arbeit machen.

Darum verzichte ich jetzt darauf saubere Patches bereit zu stellen, sondern Commite einfach in mein Repository und schiebe den 'master' nach GITHUB. Damit ist der Onus eben bei Upstream das sie möglichst häufig Mergen um die Übersicht nicht zu verlieren. Super ist das natürlich nicht - und mit jedem Code-Review von einem Patch den ich bereitstelle wird das dann halt unübersichtlicher.

Was ich daran nicht verstehe: Es kann nicht sein dass ich der einzige bin der diese Probleme hat. Jeder der Open Source Entwicklung mit GIT macht muss früher oder später darauf stoßen. Also was ist los?

Rein logisch betrachtet ergeben sich daraus eigentlich nur zwei mögliche Schlüsse:

  • Entweder GIT-User sind einfach so geil auf ihr Tool, dass sie gar nicht merken wie viel Extra-Arbeit das Tool ihnen aufzwingt und sie sehen diese Komplexität einfach als notwendig statt als zufällig an.
  • Oder aber sie haben, wie ich, einfach aufgegeben saubere History, einfaches merging für Upstream und getrennte Entwicklung von getrennten Patches zu betreiben.

Ich persönlich vermute letzteres - schon alleine um nicht alle Open Source Entwickler für blöde erklären zu müssen. Damit verstehe ich dann aber die Popularität von GIT gerade in OpenSource Projekten überhaupt nicht. Hier sind doch eigentlich gerade die Leute denen eine saubere und transparente Entwicklung wichtig ist?

Hier noch ein paar Pointer für diejenigen die aus der Git-Hölle entkommen wollen:

  •  Mercurial bietet mit den  PatchQueues ein mächtiges Werkzeug an um diese Patch-Entwicklung und verfeinerung sauber gretrennt vom Repository vorzunehmen. Das schicke daran: diese Patchqueues sind Versioniert - aber vom Repository getrennt gespeichert. Dadurch lässt sich das auch ganz hervorragend über ein GIT/HG/SVN Repository drüberlegen - und man kann den ganzen Ärger mit GIT vermeiden. Dazu lassen sich diese Queues auch relativ einfach über  BitBucket teilen, so dass man auch zu mehreren direkt an patches arbeiten kann.
  •  Bazaar hat  Looms die in etwa wie hg patchqueues zu benutzen sind, aber dafür den Vorteil haben dass sie ganz regulär mit einem push an ein remote andere Repository übergeben werden können - damit ist Zusammenarbeit auch um ein Vielfaches einfacher. Und natürlich wird auch dort die Historie der Patches erhalten. (Für die Geschwindigkeits-Proleten noch ein Hinweis: Bazaar ist heute so schnell wie Git war als es erschien - wenn Git also damals für Kernel-Size-Trees geeignet war...)

Kent Becks keynote auf der Railsconf 08

Und er erzählt dabei ein paar Geschichten. Ohne einen Punkt.

Das ist ein ganz interessanter Rückblick auf seine Vergangenheit, seine Meinung und Art wie er spricht.

Das Beste ist aber die Fragerunde am Schluss - in der wird es nämlich auf einmal richtig Politisch:

How is it, that the thing that I could do could contribute the most possible. I'ts gonna take getting involved with the people whose lives are affected by the programs that I write. Whether they're dockworkers, or policemen or whoever. They have to gain power in that process.

One of the Principloes that I've used always, always, is the principle of mutual benefit

I try to finde a way where everybody can do better out of the activities that I'm involved in. I fall short of that at times, but I'm always looking for that.

And I think software as an industry falls short of that. There are winners and losers in software development. And I think thats really too bad, because I think it's mostly a choice.

And I'd love to find a way to get past that.

Schaut euch den Kontext um dieses Statement an - es lohnt sich!

 Hier gibt's den Vortrag

"What Killed Smalltalk Could Kill Ruby, Too"

Mit dieser These ist Robert Martin auf der RailsConf 09 aufgetreten - und hat ganz ohne Powerpoint in einer hoch spannenden Stunde diese These erklärt und hervorragend vertreten.

Ganz nebenbei liefert er dabei noch die beste Motivation für  Test Driven Development die ich bisher gesehen habe.

 unbedingt anschauen!

IDE-Killer Features: Das Outline View

Ich hab schon eine Weile nach einem Ersatz für  Textmate gesucht, da ich unbedingt beim Coden ein Outline view sehen möchte, in dem ich die Struktur einer Code-Datei wiederspiegelt. (Nicht nur ein Function Popup - das kann ja jeder, aber das ist eben nicht das gleiche.)

Well und heute hab ich einfach noch mal im TextMate Channel gefragt weil ich gerade auf der Suche war ob vielleicht in der nächsten Version von TextMate dieses Feature enthalten ist.

Und sie da: Command-Shift-T und man kriegt das Feature!

YES!

Haben Sie einen Vogel?

Neulich über Umwege bei  Fefe gesehen:

Der  Nistkasten Wolfgang S..

Ein Absolutes muss für den freiheitsliebenden Bürger. :)

Aus der Beschreibung: Gefühlte Sicherheit und Privatsphäre für unsere Singvögel!

Wer könnte da wiederstehen?

PHP

Bäh! = Ich hab mir heute mal mit einigen bekannten die doch etwas besser PHP können angeschaut wie man in die Wikipedia ein plugin einbaut.

Und boah, das ist echt superecklig.

Das geht schon damit los dass man an einen Array nicht vernünftig etwas anhängen kann. Denn, das muss man sich mal auf der Zunge zergehen lassen, arrays sind natürlich keine Objekte - dafür aber auch noch gleich dictionaries.

Und etwas anhängen an einen Array ist daher eine total schwierig. Es gibt zwar eine (globale!) Funktion - so in der art von array_push_value() oder so, aber das will niemand schrieben, desshalb gibt es dafür eine extra Syntax (!!!):

$someArray[] = "fnord";

Geil oder?

Und natürlich ist Wikipedia auch ein total gewachsenes Projekt, daher gibt es tausende von globalen Variablen die man manchmal überschreiben, manchmal anhängen und manchmal irgendwas machen muss.

Auf meine Frage wieso man so etwas so macht, fiel auch meinen Bekannten auch nur ein "das ist halt vermutlich so schneller" ein. Denn, der ganze Code muss ja für jeden Seitenabruf neu geparst werden.

Wie krass!

Und es ist nicht so das es dann für das Plugin registrieren eine Funktion gibt, in der man vielleicht noch ein Verzeichnis übergibt, wo dann nach einem standard-layout die ganzen Files drin sind. Nein! man muss x verschiedene globale variablen von hand anfassen.

*kotz*

 Wers nicht glaubt, schaut selber nach!

Internetsperrungen

Der Petitionsserver des deutschen Bundestags hat mal wieder  eine vernünftige Petition - gegen die Internetsperren.

Hier ein Excerpt:

Wir fordern, daß der Deutsche Bundestag die Änderung des Telemediengesetzes nach dem Gesetzentwurf des Bundeskabinetts vom 22.4.09 ablehnt. Wir halten das geplante Vorgehen, Internetseiten vom BKA indizieren & von den Providern sperren zu lassen, für undurchsichtig & unkontrollierbar, da die "Sperrlisten" weder einsehbar sind noch genau festgelegt ist, nach welchen Kriterien Webseiten auf die Liste gesetzt werden. Wir sehen darin eine Gefährdung des Grundrechtes auf Informationsfreiheit.

Ist doch ein Start.  Also zeichnen. :)

Agil ist so eine Sache

jeder will es sein, und fast niemand ist es wirklich. Zumindest ist das meine Beobachtung.

Um so besser dass es einige Firmen gibt die versuchen ihre Prozesse transparent zu machen und herzeigen wie sie Arbeiten.

 Hashrocket hat z.B.  einen Vimeo Channel auf dem sie immer wieder Videos veröffentlichen.

 Besonders spannend finde ich das Video über ihren Daily Standup. Details wie der "Speakers-Ball" find ich einfach klasse. Sehenswert!

Cappuccino und jQuery im Vergleich

Ich beschäftige mich ja seit einiger Zeit intensiver mit Web-Entwicklung - und da im besondern mit  Cappuccino um damit GUIs in WebBrowsern zu bauen.

Cappuccino ist zwei Sachen - eine dünne Schicht JavaScript die einen Translator implementiert der aus  Objective-J (Quasi  Objective-C für JavaScript) normales JavaScript macht und eine Bibliothek an Objekten die der [Cocoa Bibliothek] von Apple aus dem Gesicht geschnitten ist.

Und Cocoa ist immer noch die schönste und knackigste Bibliothek die ich kenne - allerdings kenne ich auch noch nicht so viele.

Um so spannender fand ich es daher  eines der Beispiele des Cappucino Projektes noch einmal  in jQuery implementiert zu sehen ( Blog dazu)

 jQuery ist nämlich eine Bibliothek die die Möglichkeiten von JavaScript (Closures!) mal wirklich vollständig ausreizt und soweit ich das beurteilen kann ein Musterbeispiel von richtig gutem JavaScript Code ist.

Auf der anderen Seite ist Cappuccino - eine Sprache die von C portiert wurde, und die daher eben keine Closures einsetzt - weder in der Sprache, noch in der Bibliothek.

Und das rennen fängt gut für jQuery an - jQuery braucht für das gleiche Beispiel nur 45 Zeilen Code, während Cappuccino mit 400 Zeilen dabei ist - und enthält an manchen Stellen sogar noch mehr Bling! (Die Bilder faden schön ein statt einfach nur zu erscheinen)

Schaut man sich die Beispiele genauer an, stellt man fest, dass bei jQuery zu den 45 Zeilen Javascript noch mal 200 Zeilen CSS kommen und dass der JavaScript Code völlig ohne Leerzeilen auskommt, während bei Cappuccino besonders auf übersichtlichkeit geachtet wurde.

Korrigiert man das und vergleicht erneut, dann sieht das Ergebnis etwas anders aus: jQuery + CSS ~= 200 Zeilen vs. Cappuccino ~= 200 Zeilen.

Whoa.

Also muss der Vergleich inhaltlich stattfinden: Cappuccino isoliert den Applikationsentwickler komplett vom DOM und seinen Schwierigkeiten, während jQuery natürlich komplett damit Arbeitet - und man sich auch selber um die Komplikationen kümmern muss die man mit der Browserkompatibilität hat.

Dafür ist der Code von jQuery inhaltlich wirklich sehr schön kurz - ich finde man sieht ganz hervorragend was man erreichen kann wenn man benannte Parameter (hier durch JavaScript Objekt-Literale Vertreten) und konsequenten Einsatz von Closures kombiniert.

Das hier zum Beispiel:

$.each(data.items, function(i,item){
   img = new Image();
   img.src = item.media.m;
   img.onload = function() {
        $(this).animate({opacity: 1}, "normal");
   }
   $(img).css({opacity: 0}).appendTo("#content").wrap("<div></div>");
   if ( i == 20 ) return false;
   });

ist einfach sehr ausdrukstark. Ich freue mich schon darauf wenn Apple Snow-Leopard herausbringt und damit Closures auch in Objective-C einzug halten - weil dann wird auch Cappuccino diese Möglichkeiten endlich nutzen ohne die Kompatibilität mit Cocoa zu verlieren.

Auf der anderen Seite finde ich den Objective-J Code wie bei Cocoa auch sehr ausdrucksstark - und vielleicht etwas verbose. Dafür dokumentiert sich der Code aber auch ganz excellent.

Und da er nicht länger ist als der andere, sehe ich da überhaupt kein Problem.

Alles in allem also ein guter Grund jQuery zu lernen um die Möglichkeiten von JavaScript wirklich mal zu verstehen.

  • Posted: 2009-04-30 07:24 (Updated: 2009-04-30 07:30)
  • Author: dwt
  • Categories: software
  • Comments (0)

Interview mit De:Bug

Spannend wars, gestern das Interview mit  De:bug natürlich gings um die ganzen Piraten-Sachen - wie wir vermitteln dass wir es ernst meinen, warum man uns wählen sollte, etc.

Für mich spannender war danach das Gegeninterview wo wir den Chefredakteur mal ein bisschen zu dem Magazin fragen konnten. Erst mal das Übliche, sie beziehen ca. 80% ihrer Einnahmen aus Anzeigen und nur ca. 20% aus Magazinverkäufen. Auch spannend, das Magazin lebt letztlich seit seiner Gründung von einem Monat auf den nächsten - etwas das ich inzwischen bei vielen Magazinen vermute - auch wenn man das auf den ersten Blick gar nicht sieht.

Aber: Seit die "Wirtschaftskriese" losgebrochen ist hat das Anzeigenvollumen nicht wirklich zurückgegangen (!) - allerdings hat sich das Verhalten der Kunden verändert. Jetzt wird nicht mehr ein Jahr im Voraus geplant und gebucht, sondern nur noch von Monat zu Monat. Und das macht natürlich schlechte Planungsmöglichkeiten.

Auch fand ich sehr spannend aus meiner Sicht als Agiler Softwareentwickler auf die Zeitungsproduktion zu schauen - Jeden Monat ein Produkt von hoher Qualität auf den Punkt produzieren. Und das ganze mit gigantischem Kommunikationsoverhead - schließlich geht es ja beim Magazinproduzieren um nichts anderes.

Spannend. :)

Ein Film über Softwareentwicklung

 Der erste überhaupt!

Insbesondere ist einer der betreuenden Professoren mein Onkel - daher hab ich den Link auch. :)

Das Konzept dass das Projekt rollend von einer Generation von Studenten an die nächsten weitergegeben wird find ich klasse. Code, Dokumentation, Bugs - alles kriegt man von den Vorgängern. Und da kommt noch mehr gutes: Kurze Iterationen 3 Wochen pro Iteration, klare review und status Meetings am ende jeder Iteration.

Soweit so gut. Einiges hat mir aber auch nicht so gut gefallen. Z.B.:

  • Ein Semester nur Planung und Einarbeitung - in dieser Zeit wird für die simulierte Firma kein Wert erzeugt den sie Verkaufen können. Das haben die Studenten auch selber gemerkt. "Die erste Phase war recht lang und damit auch sehr kostenintensiv." No shit sherlock.
  • Und natürlich lauter Spezialisten - keine Polivalente Teams
  • Die ganze Suite der Rational Tools wird eingesetzt
  •  RUP als Prozess- mit all seiner "Schönheit"

Das Projekt wird als klassischer Wasserfall umgesetzt - und das Feedback der simulierten Kunden war dann auch klar: "Es gab da einige Momente im Projekt, da hätte man schon lange gesagt: 'Ich kündige den Vertrag und wechsle die Firma'".

Man könnte also sagen die Studenten sind optimal auf das Wirtschaftsleben vorbereitet.

Aber alle Kritik zur Seite: Das ist trotzdem noch lange das beste Software-Projekt das ich bisher gesehen habe.

Jaunty Jackalope on VirtualBox 2.2.0

Well, das neue Ubuntu sieht gut aus. Viele Details gefallen mir besser als beim vorherigen.

Insbesondere kann es jetzt korrekt die MacBook Pro Tastatur erkennen und die Konfiguration der Alt-Taste als Third-Level Chooser funktioniert jetzt auch etwas logischer (wenn auch immer noch recht versteckt).

Das einzige was absolut nicht gehen wollte war die Maus-Zeiger Integration. Aber Gott sei dank habe ich nach einigem hin und  doch im Netz den entscheidenden Hinweis gefunden.

Man muss die xorg.conf mal wieder von hand anpassen...

Hrm.

Dafür geht es jetzt. 3D Integration krieg ich aber nach wie vor nicht zum laufen - während das mit Intrepid Ibex noch prima funktionierte.

Well, man kann halt nicht alles haben. :)

Javascript - the good parts

Beim Schimpfen über Javascript vergisst man immer gerne dass da doch relativ viel von Scheme drin ist.

Zum Glück gibt es Douglas Crockford - und der hat  bei Google darüber gesprochen was die guten und schlechten sachen sind.

Sehenswert wenn man mit Javascript arbeitet / arbeiten muss.

p.s. Er hat auch  JSLint geschrieben.

Ruby Videos

Während meinem Urlaub habe ich mir eine Menge Videos angesehen - so viel Zeit hat man ja sonst nicht. Allerdings nicht irgendwas. (OK, etwas  Daily Show war auch dabei :)

Diese Videos haben mir besonders gut gefallen:

  •  Jive Talkin: DSL Design and Construction From a creator of many DSLs a short overview over the specific techniques and how he goes about doing them. (Test driven of course)
  •  Improving the usuability of your Ruby on Rails application A nice talk about website usability and very specific things that you can do to enhance it (with a great example)
  •  Tourbus A really nice talk about how to optimize ruby on rails applications (but really it's more general and can be used for anything). He especially talks about how you can easily get one to two orders of magnitude speed improvements on the first optimization pass of an app.
  •  BDD with Cucumber A talk about how Behaviour Driven Development works in practice and how it can be used to drive development - from a guy at Thoughtworks who gives very practical examples.
  •  La Dolce Vita Rubyista A talk about how agile development should be - shown in a series of short movies which are quite funny.
  •  Testing as Communication How Programmer Testing can be used to achieve better communication with your customers.
  •  Aristotle and the art of software development A talk about three major currents of philossophy - and how they may relate to software development and which programming language to choose.
  •  Using Metrics to take a look at your code Talk about possible code metrics and how to use them to discover and keep an eye on bad parts of your code.
  •  Effective and creative coding Talk of a psychologist about directed attention and how to recharge it to be a more effective and creative coder
  •  The Grand Unified Theory... ... of Programming. In this talk, Jim Weirich talks about Connescance as a guide to how to determine what is good and what isn't good programming.

Und auf diese Tools bin ich dabei noch mal gestoßen - dabei sind wirklich ein paar sachen die extra cool sind:

Wie definiert man Mash Up?

 So.

Definitiv. Jedes der Videos aus dem das zusammengeschnitten wurde findet man auf Youtube.

Soo cool.

Core War

Ich hab mich schon länger mit dem Gedanken herumgetragen dass es eigentlich mal einen schönen aktuellen  CoreWar clienten für den Mac geben müsste.

Und, irgendwie kam es bisher nicht dazu - aus irgend einem Grund hat niemand einen geschrieben.

Well, jetzt hab ich mal einen minimalen Anfang gemacht um herauszufinden wie man so etwas überhaupt programmieren müsste.

Hier ist das vorläufige Ergebnis.

WARNING: Work In Progress!

Das ist natürlich völlig unfertig - Es läuft genau nur ein Krieger ( IMP) - und der auch nur weil er alleine ist. :-)

Aber, ich habe eine Abstraktion für die VM, ein View was das Ergebnis anzeigt, und ein paar Tests die auf der VM herumrödeln und schauen dass sie prinzipiell das richtige tut.

Kleinigkeiten die noch fehlen wären zum Beispiel ein Parser für Redcode, Einstellungen um die Applikation an die verschiedenen Regelwerke anpassen zu können und natürlich eine Implementierung aller Redcode Instruktionen...

Also ein Anfang. Und man sieht schon etwas. :)

Ach ja, hier noch was für  echte Core War fans...

Großgruppen Moderationstraining III

So, heute war der  Open Space ( mehr) als Hauptschwerpunkt - sonst gab es nicht so viel.

Der war eigentlich kurz eingeführt - am Anfang die Erklärung was die Regeln und Gesetze sind - und dann ging es auch schon los. Etwas untypisch war dass wir nur zwei Arbeitsphasen hatten und auch am Schluss kaum eine Auswertung stattfand.

Aber auch so war es schon sehr spannend.

Am Schluss noch eine Abschlusstechnik die ich schön Fand: Ein  Talking Stick wurde in die Mitte des Kreises gelegt und wer wollte konnte ihn sich nehmen und etwas zu den Veranstaltern und Teilnehmern sagen.

Das hat ein wenig dazu geführt dass derjenige der den Stock hatte sich gerne etwas verquatscht hat - und das ist für diese Technik wohl auch verhältnismäßig typisch. Gleichzeitig gab es aber auch besinnliche Pausen zwischen den Beitragenden, so dass der Abschluss schön ruhig wurde.

So, und jetzt ruh ich mich aus.

Großgruppen Moderationstraining II

Puppenspieler Phew... anstrengend und interessant wars wieder. Thema heute war grob die tiefere Beschäftigung mit dem Thema "Welches Mindset hat der Großgruppen-Begleiter".

Der Triftige Unterschied ist nämlich, dass man beim Begleiten von Großgruppen ein völlig anderes Mindset benötigt als wenn man kleine Gruppen Begleitet. Und zwar deshalb, weil viele Techniken und Möglichkeiten die man vielleicht für kleine Gruppen noch benötigt für große Gruppen einfach nicht mehr funktionieren.

Zum Beispiel: Gestern Abend gab es vor dem Ende noch ein Stück Vortrag - die Moderatoren auf der Bühne und die Teilnehmer davor in Vortrags-Manier - in fünf Reihen.

Und das klappte nicht sehr gut. Die Moderatoren waren ohne Mikrofon kaum verständlich, die Schrift auf den Schaubildern nicht mehr Lesbar, wenn aus dem Publikum jemand etwas sagte hat man es nicht verstanden...

Heute Morgen dagegen war das Setting anders: Die Teilnehmer saßen in einem dreireihigen Kreis mit vielen Durchgängen, die Moderatoren hatten ein Stück des Kreises offen gelassen und dort ihre Pinwände aufgebaut.

Und der Unterschied war phänomenal - alle Probleme vom Vortrag waren damit Ausgeräumt. Mikrofone waren nicht mehr Notwendig, alle so nah dass die (etwas größer geschriebenen) Karten lesen konnten, Publikumsmeldungen konnten von allen verstanden werden, man hat auch gut gesehen wer etwas sagte... In kurz, eine Eindrucksvolle Demonstration was ein Unterschied eine etwas andere Technik macht - bzw. was passiert wenn man nicht geeignete Techniken einsetzt.

Heute der Tag startete nach einer Pause (sehr schönes Stilmittel!) und einer kurzen Einführung mit  Murmelgruppen zu der Frage was wir für Probleme in der Großgruppen-Moderation schon hatten. Das Ziel dafür war solche Probleme zusammenzutragen um im nächsten Schritt in einem  Fish Bowl nächer darauf einzugehen.

Do's Murmelgruppen sind eine Methode die man sehr schön in fast beliebigen anderen Settings einsetzen kann um diese Aufzulockern. Die Idee ist dass die Teilnehmer in kleinen Gruppen, 2-3 Personen, zu einer bestimmten Frage diskutieren. Damit erreicht man neben einer Aktivierung jedes Teilnehmers zu einer Frage eine wesentlich größere Aktivierung bzw. deutlich gesunkene Hemmschwellen der Teilnehmer Fragen zu stellen. Ausserdem haben noch einmal alle Teilnehmer die Chance neue Personen kennenzulernen.

Der Fish-Bowl danach funktionierte so, dass sechs Freiwillige sich in einen kleinen Kreis in der Mitte setzten um dort stellvertretend für die große Gruppe eine Diskussion zu führen. Der Clou dabei: Ein siebter Stuhl bleibt frei und darf jederzeit von einem der Zuschauer "genommen" werden um ein Statement oder eine Frage oder Hinweis einzubringen (Das Fische-Füttern). Die Idee ist, dass die Technik einer wesentlich größeren Gruppe eine Fruchtbare Diskussion erlaubt als wenn einfach jeder versuchte Mitzudiskutieren. Die Technik hat natürlich auch ihre Begrenzungen - und eine davon haben wir heute direkt erlebt. Wenn das Thema nämlich nicht klar ist, oder die "Abgesandten" nicht direkt jemanden haben den sie vertreten, dann sind die Zuschauer aussen herum schnell unzufrieden mit dem Ergebnis - allerdings ist das Ergebnis immer noch viel besser als wenn einfach jeder drauflos diskutieren würde.

Don'ts Wichtig für einen funktionierenden Fish-Bowl ist dabei eine klare Themen-Definition, bzw. ein klarer Auftrag an die "Abgeordneten" was sie Diskutieren sollen. Sehr gut funktioniert der Fish-Bowl auch zur Streit-Schlichtung, bzw. Diskussion zwischen zwei oder drei Gruppen - insbesondere bei emotionalen Themen. Vorteile hier sind dass die Stellvertreter die einzigen sind die Diskutieren, daher können die Personen aussen sich ganz auf die Argumente konzentrieren. Manche Teilnehmer kannten auch noch Variationen - eine Anmoderation um die Diskutanten besser zu fokussieren, eine Arbeitsgruppe pro Diskutant die sich auch während der Diskussion mit diesen Beraten darf, die freiwillige Aufgabe des Diskussionsplatzes wenn ein Diskutant das Gefühl hat dass er nichts mehr Beiträgt, und auch Varianten wo der siebte Stuhl belegt werden kann und dann freiwillig ein anderer Aufstehen muss bevor die Diskussion weitergehen darf.

Total klasse fand ich dabei auch eine Telnehmerin die sich auf den siebten Stuhl setzte und die Frage stellte, wie man denn damit umgehen könnte wenn sich Teilnehmer nicht an die Regeln halten sondern diese Einfach brechen. Das geniale daran: Danach blieb sie einfach sitzen und diskutierte im Fish-Bowl mit.

:-)

Eine Wundervolle Meta-Ebene - und es hat ganz schön lange gedauert bis die meisten Zuschauer dass überhaupt gemerkt haben was da los war. Großartig.

Philosophische Begründung des Moderatorbegriffs Nach dem Mittagessen war dann noch etwas Vortrag über das Mindset eines Großgruppen-Begleiters und danach eine Übung in der dass gehörte Umgesetzt werden sollte.

Das war dann wieder in Kleingruppen á 5 Teilnehmer in denen einer der Moderator / Begleiter war. Und es war spannend. Das Zurücknehmen als Moderator um die Gruppe Arbeiten zu lassen ist fast in keiner der Gruppen geglückt - ja es gab sogar richtiggehend Verärgertheit über die unklare Definition der Aufgabe, oder die zu klare Definition der Aufgabe und die Kritik dass die Moderator-Rolle mit so viel Kontrolle aufgefüllt wurde.

Sehr Spannend.

Zum Abschluss dann noch eine sehr schön energetisierende Technik. Die Teilnehmer standen sich in zwei Kreisen gegenüber und jedes Paar hatte je eine Minute Zeit um dem Gegenüber zu einer gegebenen Frage ("Was hast Du heute mitgenommen", "Was hat dich Schmunzeln lassen", ...) etwas zu erzählen. Nach Ablauf der Zeit ging jeder einen Schritt nach Rechts und man hatte den nächsten Partner für die nächste Frage.

Phew - das muss reichen.

Großgruppen-Moderationstraining I

Whew.... Das war jetzt schon etwas anstrengend - aber gleichzeitig auch spannend.

Kurz zum Kontext - heute war der erste Tag des  Großgruppen-Moderationstrainings.

Und es hat Spaß gemacht.

Tische-Übersicht

Programm heute war recht Kurz und Bündig - Erst ein sehr Kurzer Einführungsvortrag (~10 Minuten) mit den wichtigsten Regeln, dann ein  World-Café ( auch hier), anschließend eine tiefergehende Einführung in die nächsten zwei Tage und am Schluss eine Stern-Abfrage für den Abschluss.

Das Welt-Café war in diesem Zusammenhang eine schöne Methode um für eine große Gruppe von Menschen (60 Leute) recht schnell einen gewissen Überblick zu erhalten wie die anderen Leute Ticken und was sie so können. Ich habe zum Beispiel herausgefunden dass ich beileibe nicht der einzige war der an Politik und Moderation interessiert war - und dass jede Menge professionelle Moderatoren zu ihrer eigenen Fortbildung anwesend waren. (Das find ich natürlich ein gutes Zeichen!). Kurz zum Café - es waren kleine Café-Tische aufgestellt - so viele dass pro Tisch etwa vier Leute Platz hatten. Von den drei Runden waren die ersten Beiden für den Hintergrund und was einen zu dem Training bringt reserviert, während es in der dritten um die Wünsche an das Training ging. Das Nette bei dieser Methode: Dadurch dass man jederzeit auf die Tischdecke schreiben und Malen konnte und sollte waren am Schluss alle Tischdecken ein Stück Dokumentation was besprochen wurde. Sehr schön. Etwas anstrengend war es die ganze Zeit zu stehen - aber hey, das war es wert. Nach dem Vortrag der Veranstalter gab es dann noch eine konventionelle Kartenabfrage und eine Themensammlung (aus der dritten Runde des World-Cafés) - die aber größtenteils von den Moderatoren vorgegeben wurde.

Schön fand ich dabei dass die grenzen von ungenügenden Moderations-methoden hier sehr schön und interaktiv gezeigt wurden (ich bin mir immer noch nicht ganz sicher ob das Absicht war). So war die Schrift auf den Moderationskarten und diese selbst zu klein, die Fragen aus dem Publikum konnte nicht jeder Hören, die Mikrofonverstärkten Stimmen so laut dass es keinen Spaß machte, aber ohne Mikro wiederum so leise dass es auch keinen Spaß machte...

Ein Tisch im Detail Am Schluss war noch eine schöne Technik, deren Name ich aber leider nicht verstanden hatte (naja, soll ja noch eine ausführliche Dokumentation geben). Stern- oder Mandala-Abfrage hatte ich verstanden - dazu spuckt Google aber nichts aus. Ah well. Funktionieren tut es so dass sich alle im Kreis aufstellen und jeder der etwas Sagen will (nacheinander!) in die Mitte geht und es sagt. Dann kann jeder, der will, so weit auf den Menschen in der Mitte zugehen wie er ihm Zustimmt. Dass erfordert Mut - macht aber auch Spaß und sorgt angeblich dafür dass nur wichtige Sachen angesprochen werden. Jeder der Möchte kommt zu Wort, niemand muss sagen "find ich auch" oder "ist schon alles gesagt worden". Ach ja, und sobald die Gruppe genug hat, sagt sie dass auch sehr deutlich - eine schöne und schnelle Art Schluss zu machen und das wichtigste Feedback aufzugreifen.

 Großgruppenmoderation (Wikipedia)

Bankenkriese

 Der Spiegel hat ein schönes Interview mit James Galbraith das die wesentlichen Punkte auf den Tisch bringt:

  1. Wenn eine Bank an die Wand gefahren wurde (und nur durch Steuergelder gestützte Institute sind praktisch Pleite) dann hat das Management dort keine Anreize mehr vernünftig zu Arbeiten. Stattdessen ist jetzt jedes Riesiko recht. Denn entweder wird die Bank eh zugemacht (dann wars auch egal) oder vom Staat gerettet (dann wars auch egal).
  2. Aktionäre müssen nicht gerettet werden. Die die noch da sind, sind die die auf die Rettung vom Staat spekulieren - und müssen daher nicht gerettet werden.

Amen.

 via

Endlich erklärt mal jemand Twitter

 Auf Youtube natürlich. Oh die Ironie...

Aber gut und lustig. :)

Brooot

*mjam*

Brot Brot innen

  • Posted: 2009-03-22 12:55 (Updated: 2009-10-24 15:45)
  • Author: dwt
  • Categories: cucina
  • Comments (0)

No need to knead - Brotbacken leicht gemacht

Vor einiger Zeit bin ich beim Kochblog-Surfen auf eine besonders einfache Variante des Brotbackens gestoßen.  No need to knead.

Großartig. Das Brot gelingt immer, ist supereinfach in der Herstellung und ist total lecker.

Was könnte besser sein?

Angefanen hat das wohl mit einem Artikel in der  New York Times - The Secret of Great Bread.

Kochenswert!

Wie kommt der Krieg in die schreibende Zunft?

 Wie kommt der Krieg in die Köpfe- und in die Herzen unserer Kinder - was so eine Überschrift trägt kann ja nix taugen. Erwartungsgemäß haben sich  andere  dann  auch  schon darüber aufgeregt - es gibt also eigentlich kaum noch etwas zu schreiben.

Aber mein Vater hat mich um einen Kommentar gebeten - und den wollte ich dann nicht in meiner e-mail inbox vergammeln lassen.

-- snip --

Ich möchte gerne den Begriff "Killerspiele" streichen, er ist genauso-wenig wie "Raubkopie" dazu geeignet das Thema zu erörtern.

Erst mal Prinzipiell: Der Jugendschutz ist in Deutschland härter als in jedem anderen Land der Welt. Spiele wie Counterstrike, Doom 3, Call of Duty und wie sie alle heißen sind schon gar nicht für Kinder unter 16 Jahren zugänglich und viele sogar erst ab 18.

Wenn Eltern ihren Kinder diese Spiele trotzdem zugänglich machen haben sie auch die Verantwortung dafür. Und wenn Eltern keine Teilhabe daran haben was ihre Kinder am Computer machen, dann ist das auch ein Problem - aber nicht durch irgendwelche Verbote zu lösen.

Und das ist eigentlich der Kern der Debatte: Alle diese Spiele sind für Kinder per Gesetz schon heute nicht zugänglich. Weitergehende Verbote können nur noch bedeuten dass auch Erwachsenen der Konsum verboten wird.

Das hilft aber überhaupt nix gegen das Argument: "Ja dann laden sie es sich halt runter".

Dagegen hilft aber natürlich kein Gesetz.

Ergo sehe ich nicht dass da etwas zu tun ist - die ganze Alarmschlägerei ist dann nur noch Aufmerksamkeitshaschen.

Hier noch ein paar Kommentare:

Killerspiele sind Landminen für die Seele

Und Tanzen führt zu Unkäuschheit, Sex und Teufelsanbetung.

Die Soldaten werden desensibilisiert und fürs Töten konditioniert, die Tötungshemmung wird abgebaut.

Soldatentraining ist heute auch ohne Computerspiele so effektiv dass jeder Soldat abdrückt - im Gegensatz zu noch im zweiten Weltkrieg wo immer noch viele Soldaten einfach in die Luft geschossen haben.

Überhaupt fände ich es weit sinnvoller diese ganze Argumentation so zu ändern dass sie sich auf Soldaten bezieht - das könnte ich wenigstens noch unterstützen.

Wenn man etwas machen möchte, dann meiner Meinung nach noch am ehesten dass man die Anzahl der Waffen in Deutschland noch weiter vermindert. Das ist dann zwar schade für die Leute die das toll finden, aber eben aus vielen Gründen wünschenswert.

die Rendite ist riesig, denn Computerspiele sind teuer bei geringen Investitionen.

Falsch. Die großen Produktionen sind extrem-teuer, das durchschnittliche Budget von Hollywood-Filmen ist längst erreicht. Teuer ist dabei vor allem das extrem detaillierte gestalten von Spiel-Umgebungen.

Spielentwicklung und Forschungen über militärische Simulationen ergänzen einander.

Die US-Arme hat ein Budget von mehreren Milliarden Dollars für Simulationsgeräte. Klar dass es Firmen gibt die das bedienen. Das sind aber meiner Meinung nach erstaunlich wenige.

Mit Nebelbegriffen [..] wird pseudo-wissenschaftlich suggeriert, dass Kinder und Jugendliche mit Killerspielen sinnvoll „umgehen“ könnten, ohne seelischen und körperlichen Schaden zu nehmen. Die Spiele sind aber gerade so angelegt, dass dies nicht möglich ist.

Und mit Fernsehen, Rockmusik und Büchern ist das natürlich ganz anders.

Was ich positiv finde: Im typischen vierschritt aus Ignorieren, Verlachen, Bekämpfen, Gewinnen (was auch immer das heißt) sind die Computerspiele wohl kurz vor dem letzten Stadium.

-- fin --

Rollen im Software-Bauen

Der Podcast "Software Engineering Radio" hatte zwei sehr gute Folgen  Roles in Software Engineering ( fortsetzung). Der Anfang ist zwar etwas langsam, aber dann wird es sehr schnell hochinteressant wenn die Rollen und deren Mindset gegeneinander Abgrenzt werden.

Vor allem das Mindset als definierender Punkt hatte ich so klar bisher noch nirgends gelesen. Schade nur dass es genau diese Sammlung an Mindsets nicht dort als Text gibt.

Mal schauen - das war so gut, dass ich es mir eigentlich mal aufschreiben möchte.

Wer ist Erfolgreich und warum?

Diese Frage  versucht Malcolm Gladwell zu beantworten - und ich finde er hat wie immer einen erleuchtenden Ansatz.

Der Kern-Punkt: Wir haben in unserer Gesellschaft ganz systematisch komplett dämliche Regeln die jede Menge Leute davon abhalten dass zu erreichen was sie erreichen können.

Und das ist Fürchterlich! Denn im Gegnsatz zu Armut, die wir nur sehr schwer lösen können, sind die meisten dieser Regeln komplett zufällig und absolut leicht zu ändern!

Ein Beispiel: Schule. In Amerika sind Reiche Kinder immer besser als arme Kinder. Wieso? Wenn man zu Beginn des Schuljahres misst, und am Ende erreichen Arme Kinder sogar einen größeren Fortschritt als Reiche - aber in den Sommerferien tut sich eine Kluft auf. Die Reichen kinder machen genau so große Fortschritte wie in der Schulzeit und die Armen quasi gar nicht.

Und die Sommerferien sind in Amerika 3 Monate lang.

Richtig Absurd wird das ganze wenn man sich anschaut wieso diese Ferien eingeführt wurden: Die Schulreformer im 19. Jahrhundert haben die Sommerferien nämlich eingeführt weil sie Überzeugt waren dass zu viel Schule bei Kindern zu Wahnsinn führt.

Doh.

Und dass passiert wenn man Politik macht ohne sich die Gründe anzuschauen wieso Entscheidungen gefällt werden und wurden. :-(

 Ganz hervorragender Podcast - unbedingt anhören.

Scatman John

Gerade bin ich im Retro-Groove und höre alte Musik die ich früher mal cool fand. Au backe ist das manchmal Peinlich.

Aber, manche Sachen sind absolut immer noch gut.

 Scatman John - I'm a scatman zum Beispiel. Den fand ich früher großartig - dabei habe ich noch nicht einmal verstanden was er da eigentlich singt.

Jetzt versteh ich es und find es noch einmal extra cool.

Leider ist er seit 1999 schon tot. RIP!

  • Posted: 2009-03-14 21:24 (Updated: 2009-03-14 21:30)
  • Author: dwt
  • Categories: links
  • Comments (0)

Der sechste Sinn

Wäre es nicht cool wenn man beliebige Metadaten zu irgend etwas an beliebigen Stellen abrufen könnte?

Am MIT Media Lab haben sie dazu einen Demonstrator gebaut - eine Webcam, plus einen kleinen Rechner plus einen batteriegetriebenen Mini-Beamer - und das alles zum umhängen.

Damit kann man dann zum Beispiel beim Einkaufen zu einem Produkt abrufen ob es ökologisch hergestellt wurde, wie das Produkt bei Amazon bewertet wird, wie sich eine Geschichte weiter entwickelt hat die man gerade in der Zeitung ließt, ob und wie viel sich ein Flug verspätet hat für den man gerade sein Ticket anschaut... Die Möglichkeiten sind unbegrenzt.

Das coole daran ist dass der Apparat letztlich auf Gesten reagiert und auf jede Oberfläche projizieren kann. Also zum Beispiel eine Tastatur auf die eigene Hand - für einen Taschenrechner, oder eine Telefontastatur, oder es kann erkennen wenn man eine "Photo-Geste" macht und kann ein Photo machen von dem was man gerade sieht.

Pretty neat he?

 Hier gibts ein Demo-Video auf der TED-Conference

(Danke an Joachim für den Hinweis)

Und noch ein Schüler der Amok-Läuft

 Dieses mal in Winnenden - was doch immerhin sehr nah an der Gegend ist, in der ich aufgewachsen bin.

Und das trifft natürlich. Jetzt sehe ich natürlich die schon wieder die Schlagzeilen dass die Computerspiele schuld sind und die Toastbrote die er gegessen hat und so weiter.

Na toll.

Da kriegt man doch die Krätze. Weil wenn man mal so richtig Zynisch auf das Problem schaut, dann ist der Amokläufer dort (wieso auch immer er das getan hat) wahrscheinlich der der mehr für die Schulen erreicht als die ganzen Politiker die ständig nur versuchen dort Kosten einzusparen.

 via

Wie funktioniert ein Bailout

Cappucino != Cocoa

Tja, also nach längerer Neugierde habe ich mich mal mit  Cappucino auseinander gesetzt und ein wenig damit Programmiert.

Und das hat für mich als Cocoa Programmierer eine Menge Spaß gemacht.

Erst mal ein paar Kleinigkeiten:

  • Der Java-Script Parser von Safari saugt. Er sagt einem nie wo der Fehler jetzt genau aufgetreten ist. :-( Unbedingt mit Firefox und Firebug entwickeln!
  • Wenn man sich den git tip of the tree auscheckt kriegt man weit mehr Klassen als in der offiziellen Dokumentation erwähnt sind. Insbesondere funktioniert das nib2cib tool auch ein wenig besser - und das spart unmengen von Zeit.
    • Allerdings funktioniert nib2cib auch nicht soo gut. Viele Klassen die es können könnte gehen damit nicht. NSScrollView zum Beispiel.
  • Wenn man sein eigenes Objective-J kompilieren will darf man keine spaces im Pfad haben. (arrrrghhh!!!!!)
  • Man kann (noch) nicht den Code so ohne weiteres in Unterverzeichnisse auslagern. Das macht die Projekte unübersichtlich - aber angeblich soll das bald gefixt sein.
  • nib2cib darf man nie mit mehr als einem Filenamen aufrufen. Sonst schreibt es nämlich einfach in das zweite Argument den output hinein.
    • Wo ich gerade darüber nachdenke: das geht eigentlich mit kaum einem objective-j tool ojtest zum beispiel... Dabei ist der Startup von Rhino immer das langsamste daran. :-(
  • Und man muss einiges an Umgebungsvariablen setzen. Am besten macht man sich ein ein shell script was diese dinger setzt und dann wieder eine shell exec'd. Damit hat man dann gleich eine Arbeitsumgebung für Cappucino ohne alles irgendwohin in standard-Betriebsystem-Locations installieren zu müssen.
#!/bin/sh

PROJECT_DIR="/path/to/the/cappucino/sources/but/without/spaces/cappuccino"

# you can move this elsewhere to keep things separate
export STEAM_BUILD="${PROJECT_DIR}/build"
TOOLS_DIR="${STEAM_BUILD}/Cappuccino/Tools/objj"
NIBTOOLS_DIR="${PROJECT_DIR}/Tools/objj"

export OBJJ_HOME="${TOOLS_DIR}"
export PATH="${PATH}:${TOOLS_DIR}/bin:${NIBTOOLS_DIR}/bin"
"${SHELL}"

Damit kann man immerhin die ganzen objj tools (ojtest, nib2cib, etc) direkt benutzen.

Cappucino selber benutzt sich tatsächlich ziemlich wie eine recht alte Version von Cocoa. Erstmal keine Bindings und entsprechende Controller und !CPBundle ist reichlich underpowered - Lokalisierter Resourcen-Lookup ist damit erst mal noch nicht drin.

Die Tools sind natürlich nicht so toll. Insebesondere fehlt ein vernünftiger Ersatz für Interface Builder.

Aber ansonsten rockt  Cappuccino schon gewaltig. Jedem Cocoa-Programmierer sei also eine Beschäftigung damit schwer ans Herz gelegt.

Gehackt

Ich bin ja ganz erstaunt wie viel spaß es macht Web-Software zu hacken. Bisher habe ich das ja immer vor mir hergeschoben, dass ich es später machen werde...

Nun ja, jetzt ist später, ich habe mich das erste mal erfolgreich per SQL-Injection durch ein Login-Formular gehackt. Und es fühlt sich großartig an.

Muss ich definitiv öfters machen - ich denke dass sich das auch ganz ausgezeichnet als patch an Open Source Projekte schicken lässt.

(Ich will ja gar nicht wissen welche Sicherheitslücken dieses uralte Trac hier noch alles aufweißt. Hm, wird dringend Zeit für ein Update.)

Naja, später... ;)

Guter Service von Apple

Nach nicht einmal 48 Stunden war der neue Akku da.

Puh.

So Arbeitet es sich schon wesentlich entspannter.

:-)

Batterie Nasis

Seit einem Monat habe ich mich gewundert dass meine Maustaste anfängt zu prellen.

Vor einer Woche habe ich mich gewundert, weil mein Notebook einfach ausgegangen ist, obwohl eigentlich noch eine Stunde Batterie-Laufzeit hätte sein soll.

Vorgestern habe ich mich gewundert weil meine Maustaste nur noch geprellt hat.

Und das meine Batterie inzwischen so dick geworden ist, dass sie die Bodenplatte abgedrückt hat und kurz davor stand zu explodieren.

:-(

Geschwollener Akku

Pluspunkt: Apple wird per Garantie (das Gerät ist 2,9 Jahre alt, die Garantieverlängerung läuft bald aus...) eine Neue Batterie liefern. Angeblich bis Mittwoch oder Donnerstag.

Mal schaun. Bis dahin bin ich froh dass man mit Hibernate auch ohne Batterie einen Ruhezustand simulieren kann. Dauert halt nur 30 statt 3 Sekunden.

Da fällt mir ein: Bei den neuen 17" Modellen kann man den Akku ja nicht mehr herausnehmen. Was passiert dann dort eigentlich wenn der Akku schwillt? Merkt man das daran dass das Gehäuse auseinander bricht? Ein Kumpel von mir beim CCC hier meinte das die Batteriehersteller das Problem inzwischen gelöst hätten - immerhin wollen sie die Batterien ja auch für Autos einsetzen.

Well... Vielleicht doch noch etwas warten mit dem neuen 17" Modell?

  • Posted: 2009-02-23 19:44 (Updated: 2009-10-24 16:15)
  • Author: dwt
  • Categories: fnord
  • Comments (0)

Netzmusik

Vor einiger Zeit bin ich in der  c't auf einen Webseitenhinweis gestolpert -  das Phlow Magazin. Ein c't Schreiberling der über und mit Musik schreiben wollte.

 Und es macht immer wieder spaß dort mal reinzuhören.

Xcode mit svn 1.5

Eigentlich dachte ich ja ich hätte das schon gebloggt - aber ich habs nicht wiedergefunden. (Vielleicht sollte ich nochmal mit google suchen?)

Ah well.

Dieses Script bringt Xcode mit svn 1.5 via  Fink installiert zum laufen.

#!/bin/sh

svn_libs=/sw/lib/svn15

cd /Developer/Library/Xcode/Plug-ins/XcodeSubversionPlugin.xcplugin/Contents/MacOS || exit 1
ditto XcodeSubversionPlugin XcodeSubversionPlugin.new

libs=`otool -L XcodeSubversionPlugin.new | grep libsvn | awk '{ print $1 }'`
 
for lib in $libs ; do
  new_lib=`echo $lib | sed "s,/usr/lib,$svn_libs,g"`
  echo "install_name_tool -change $lib $new_lib XcodeSubversionPlugin.new"
  install_name_tool -change $lib $new_lib XcodeSubversionPlugin.new
done

install_name_tool -change /usr/lib/libapr-1.0.dylib /sw/lib/libapr.0.dylib XcodeSubversionPlugin.new
install_name_tool -change /usr/lib/libaprutil-1.0.dylib /sw/lib/libaprutil.0.dylib XcodeSubversionPlugin.new

echo otool -L XcodeSubversionPlugin.new
otool -L XcodeSubversionPlugin.new

echo
otool -L XcodeSubversionPlugin.new | grep svn | awk '{ print $1 }' | xargs -n 1 ls -la

exit 0

Ach ja, am Schluss muss man noch von Hand in /Developer/Library/Xcode/Plug-ins/XcodeSubversionPlugin.xcplugin/Contents/MacOS das original zur Seite bewegen und bei dem neuen das ".new" streichen.

Was ist open source?

 Nat Torkington (der Organisator der  Oscon meint dass man das am besten anhand einer Therapiesitzung erklären kann.

Einer Therapiesitzung, die von "Mon and Pop Business" besucht wird, die einfach nicht mehr verstehen was ihre Kinder (Open Source) tun und was sie bewegt.

Großartig. :)

 Hier gibts das Video

Windows Vista Usability Improvements

  • Posted: 2009-02-15 22:45 (Updated: 2009-10-24 16:16)
  • Author: dwt
  • Categories: funny
  • Comments (0)

Cafébau zu Babel

Gestern habe ich das erste mal als Podiant (wie sagt man das?) an  einer Podiumsdiskussion teilgenommen.

Und es war gar nicht so schlecht! Das Publikum hat gut reagiert, es wurde auch mal gelacht und ich habe alle Punkte der Piratenpartei untergebracht die ich unterbringen wollte.

Soweit also ein Erfolg.

Natürich bin ich auch mit ein paar Dingen unzufrieden. Zu dem Telekom-Paket haben die beiden anderen Podiumsteilnehmer mehr gesagt als ich - die hatten dafür aber alle Punkte die ich sagen wollte schon.

Naja, insgesamt war wenig Gegenwehr auf Dem Podium da wir bis auf ganz wenige Punkte eigentlich alle einer Meinung waren.

War mir für das erste mal aber auch ganz recht. :)

Ach ja, inhaltlich schreibe ich auf auf dem  blog der Berliner Piraten dann noch mehr.

Warum setzt Sun auf Open Source?

Neulich habe ich einen  spannenden Pocast mit einem Interview von Simon Phipps gehört. Das Thema: Warum setzt Sun so auf Open Source wie sie es tun?

Das ganze Interview war spannend - vor allem weil Simon neben dem Marketting-Speak von Sun auch tatsächlich etwas interessantes zu seinen Ansichten über die Gesellschaft gesagt hat. Und das finde ich "spot on".

Hier ein paar ausschnitte.


Why should a company like Sun be at all concerned about open source?

The key thought is anchored in looking at thrends in society. If you look at whats happening in societies around the world, ever since the internet became indemic, there has been a topological shift in the structure of society. Society used to be structured on a hub and spoke basis. With people controlling communications and rare resources at the hub and citizens and employees and consumers at the spokes.

What the pervasive nature of the internet made happen, was that the topology of society gradually changed from hub and spoke to mesh. As that's happened, the way that the business interests are being conducted has gradually migrated from a world of secrecy giving confidence and security to a world with transparency with privacy giving confidence and security.

We have looked at that trend - and we are absolutely convinced that if we are going to be a leading technology company in the 21st century, we have to adapt the company to live in that meshed society and to fit in with the emerging norm of transparency with privacy.

Do other companies see the world as you do?

I think that it is pretty slow spreading. One of the problems that you have as a business is that you get trapped in what I call the success trap. There's a book from Richard Dawkins called "Climbing Mountain Probable" where he talks about the success trap - how organisms can only evolve to a pinacle of quality. And they can never evolve to a higher pinacle if the route to that higher pinacle if the route to that higher pinacle involves degrading the organism. They can never go down to a valley to reach a higher peak. And it's the same with businesses. A business that is successfull and profitable, cannot afford to become unsuccessfull and unprofitable in order to become better.

Companies have to exploit their fallow periods. IBM did this very successfully by using it's failure to reinvent itself. I believe that that is what Sun has been doing at the beginning of this decade as well. It was using a period of failure and unprofitability to transform itself. Other companies which did not have this blessing of failure (which is a funny word - but still true), will indeed find themselves in a really tough place as we move into the society that is based on a mesh culture and that values transparency with privacy.

You could look at the dilemma that the music industry has got. Still making lots of money, a lot of that money is based on a paranoia around keeping secrets and keeping control. The're going to have a hell of a time transforming into an industry for the networked society. Guess what: We're beginning to see the symptoms of that as they attacked their customers and as they try and protect outdated business models.

...

This is what absolutely fascinates me. I think that what we're seing here is a meta-effect in action. I think that by introducing the web browser and providing a really good reason why the world wanted to get wired, Tim Berners Lee has triggered an epochal change in the structure of society. And that's going to work itself out in all sorts of ways.

...

I was having a conversation with a customer a little bit earlier on, talking to them about the stages that businesses go through as they become open source businesses. I definitely see an evolutionary cycle in becoming an open source business.

So the first step is to make it free as in beer. No charge.

I think there's a stage before there. The Instinct to keep secrets is so strong in most software companies that the first stage that they go through is the willingness to collaborate with their friends and partners. That's Microsoft shared source for example. Every business that has depended on secret software and secret source goes through that first stage of wanting to open up but retain control and boundaries.

They then go on to a stage where they realize that they can be completely open but under the terms of a license. That's the stage where companies are busy nitpicking over every line in every license and are trying to work out the perfect licenses. It's that stage of maturity that lead to license proliferation at OSI and it was inevitable in my view.

The stage beyond there is where they begin to realize that code is king. And that the license doesn't matter so much as long as the code gets written and gets written fast and well.

And then there's a stage beyond that, where people begin to realize that community is king and that actually you don't have to write all the code and you don't have to control all the code. It's actually the community where all the benefits that make you successful are gonna come from.

I see businesses gradually moving along that maturity timescale. Going through each of the phases and believing that it's the endpoint. It may be that there's a point on after communities that I haven't seen yet.

Endlich @ und € in Ubuntu

Schon länger betreibe ich ein  Ubuntu in  VirtualBox - einfach weil es geht und man es dann doch irgendwann braucht wenn man keine Zeit hat es einzurichten.

Und das ist geil.

Die Geschwindigkeit ist ok (man muss nur die Guest-Aditions installieren) und im Nahtlosen Modus kann man die Ubuntu Fenster einfach eingebettet in den normalen Desktop benutzen

Nice. Wenn da nicht der ärger mit @ und € wäre - ausgerechnet die gehen nämlich per default nicht.

Fear no more, ich hab es hingekriegt. (Ubuntu Gnome Default Desktop 8.11)

  • Menü System -> Einstellungen -> Tastatur
  • Zweiter Reiter ("Belegungen")
  • Tastatur: Apple, Apple (oben wie unten, das korrekte "MacBook/MacBook Pro (intl)" ließ sich nicht auswählen)
  • Belegung "Germany Macintosh" war schon ausgewählt
  • Weiter gehts bei "Other Options" darunter
  • In dem Fenster was dann aufgeht dann "Third level choosers" aufklappen und
  • "Press any of Alt keys to choose 3rd level" auswählen

Yay!

Jetzt muss ich nur noch herausfinden wie man Controll und Command austauscht, damit die Tastatur Shortcuts vernünftig funktionieren...

 via

Scrum Story estimation

ist schwer. Um so wichtiger finde ich gute Tips wie man das machen kann.

 Jay Fields hat dazu gute Sachen zu sagen.

Lesenswert.

Change you can download

Jede Menge Congressional Reports - also Ergebnisse die der wissenschaftliche Dienst des Amerikanischen Kongresses erarbeitet hat  zum download.

Fuck yeah. Wikileaks rockt mächtig!

 via

Andere kochen auch nur mit Wasser

Apple in dem Fall mit Apple Mail.

Die Backtrace library will ich auch haben. :)

  • Posted: 2009-02-07 21:49 (Updated: 2009-10-24 15:55)
  • Author: dwt
  • Categories: code
  • Comments (0)

Holperdinger auf dem Marsflug

Tja, was soll ich sagen.  Squeak mit  Mars ist spannend.

Der Smalltalk Source Code für die Menü-Definitionen gefällt mir zum Beispiel wirklich gut.

menuFile
	^ (MarsMenuItem label: 'File')
		add: (MarsMenuItem label: 'File Out...' keyStroke: $o command: #fileOut);
		addSeparator;
		add: (MarsMenuItem label: 'Save' keyStroke: $S command: #saveImage);
		add: (MarsMenuItem label: 'Save As...' command: #saveImageAs);
		addSeparator;
		add: (MarsMenuItem label: 'Quit (Development)' keyStroke: $Q command: #developmentQuit);
		add: (MarsMenuItem label: 'Quit' keyStroke:$q command: #quit);
		yourself

Das ist knackig.

Auf der anderen Seite... Das  Versionskontrollsystem hat mal eben so vergessen das Changeset mit auf den Server zu schieben auf dem das was ich hochgeladen / comitted habe beruhte.

Äh, wiebidde? Das ließ sich dann zwar durch vereinte Anstrengungen von 3 Squeakern irgendwann fixen. Aber...

Und überhaupt, die GUI von Squeak ist... gewöhnungsbedürftig. Der größte Teil der Funktionalität liegt in Kontextmenüs versteckt - die man einfach nicht findet wenn man nicht weiß dass es sie gibt. Oder die nur kommen wenn man etwas bestimmtes nicht ausgewählt hat.

*Grusel*

Naja, mixed feelings.

OD Completion Dictionary works with Xcode 3

Hrm, das ist mir doch ganz entgangen bisher.

Aber:  here it is!

Was es tut: Beliebige Textbausteine in Xcode schnell einsetzen. Das geht zwar auch ohne ODCompletionDictionary, aber, mit kann man es auch in Xcode live bearbeiten. Und das macht das Feature eigentlich erst richtig nützlich.

Writing Code that doesn't suck

 Und noch mal von den Confreaks.

Ausgezeichneter Vortrag von Yehuda Katz darüber was er für gute Tests hält und was nicht. Sein Argument: Am Ende will man Regression-Tests haben, da nur die wirklich nützlich sind beim Refactorieren. Nur die sind nützlich, weil dass die Tests sind die man behalten kann während man den Code neu faktoriert.

Damit das geht muss der Code aber schon eine gute Faktorierung haben die man (ausschließlich?) über öffentliche Interfaces testen kann.

Wohlgemerkt in dem Talk geht es nicht darum ob TDD gut oder schlecht ist - der Zweck ist einfach ein anderer. Ihm geht es um API-Stabilität und die Frage wie man Interfaces (nicht Implementierungen) über eine lange Entwicklung stabil hält.

Spannend. Mir ist dabei eingefallen dass ich damals im ersten Buch über Test Driven Development einen Absatz gelesen habe in dem Stand dass man zuerst seine Tests schreiben soll um dann an diesen seinen Code zu schreiben und zu refaktorisieren. Und dass man danach den Code als Tests für die Tests verwenden kann um wiederum diese zu refaktorisieren.

Gaudio. Ob das schon das ist was Yehuda meint? Ich vermute noch nicht ganz - aber es hört sich für mich nach etwas an was ich direkt tun kann - ich kann meine Tests betrachten und mir anschauen ob sie tatsächlich das testen was mich interessiert (das interface) und wenn dem nicht so ist, dann kann ich mir das Interface betrachten und die Tests tatsächlich refaktorieren.

Yay, mehr Arbeit. :)

Code Review mal praktisch erklärt

Und zwar mit grandiosen schauspielerischen Leistungen. :)

Auf der Ruby-Conference 2008.

 The Ruby Code Review. A Play in Three Acts

Überhaupt finde ich Confreaks sehr cool. :)

Landing on Mars (with Squeak)

I just started playing around with  Mars which is a bridge from Squeak to Cocoa, which allows Squeak Programms to have a Cocoa GUI.

Pretty nice - however not quite as easy to get installed if you are a SmallTalk newbie like me.

 There are installation instructions on the Mars homepage however I couldn't quite follow them, so I enhanced them a little and give you the rundown here:

Instructions

  • I downloaded the basic Image from  http://ftp.squeak.org/3.10/Squeak3.10.2-7179-basic.zip
  • Got the Virtual Machine from  ftp://ftp.smalltalkconsulting.com/experimental//Squeak%203.8.21beta1U.app.zip
  • Installed basic developer tools by executing <HTTPSocket httpFileIn: 'installer.pbwiki.com/f/LPF.st'.> in a workspace window (select it and hit command-d)
  • Then I ran
    Installer universe 
    	addPackage: 'OmniBrowser';
    	addPackage: 'OmniBrowser-Morphic';
    	addPackage: 'OmniBrowser-Standard';
        	addPackage: 'OmniBrowser-Refactory';
    	install.
    
    to get the basics and
  • installed Mars by executing
    Installer wiresong project: 'ob'; install: 'OB-Monticello'.
    Installer lukas project: 'omnibrowser'; install: 'OB-Tools'.
    
    Installer ss project: 'Mars';
    	install: 'Mars';
    	install: 'OB-Mars'.
    

After that OBMarsWorld execute. replaces the menubar of Squeak with the Cocoa stuff.

:) Have fun!

Oh, and by the way, I just tried this with the dev image available from Damien Cassou at  http://damiencassou.seasidehosting.st/Smalltalk/squeak-dev

This image already has most stuff preloaded, so you can just run

Installer wiresong project: 'ob'; install: 'OB-Monticello'.
Installer lukas project: 'omnibrowser'; install: 'OB-Tools'.

Installer ss project: 'Mars';
	install: 'Mars';
	install: 'OB-Mars'.

to get Mars installed and then start it by running: OBMarsWorld execute.

Scriptdir

Ich habe immer wieder das Problem, dass ich in Shell-Scripten den absoluten Pfad zum eigenen Script, oder zumindest den Ordner in dem das Script liegt benötige.

Dieses Problem hat viele Lösungen - die allermeisten kommen aber entweder nicht mit Leerzeichen in diesem Pfad klar, oder versagen wenn man das Script über verschiedene Kombinationen von absoluten und relativen Pfaden aufruft.

Meine gegenwärtige Lösung ist das hier:

SCRIPTDIR="$(cd "$(dirname "$0")" && pwd)"
echo $SCRIPTDIR

Damit bin ich zwar auch überhaupt nicht glücklich, aber immerhin scheint es zu funktionieren. :/

Insbesondere ist das Quoting extra funky. Unter MacOS X scheint es aber zu gehen (d.h. die Bash frisst das korrekt)

Hat da vielleicht jemand eine bessere Idee?

Update: Florian hatte die großartige Idee doch einfach mal in gut benutzte Shell-Programme wie den Wrapper für OpenOffice zu schauen. Und siehe da:

# cat /usr/lib64/openoffice/program/swriter
#!/bin/sh

cmd=`dirname "$0"`/soffice
exec "$cmd" -writer "$@"

funktioniert großartig. Man kriegt zwar nur den relativen Pfad - aber das reicht ja in aller Regel.

  • Posted: 2009-01-29 14:07 (Updated: 2009-02-02 22:16)
  • Author: dwt
  • Categories: code
  • Comments (0)

SVN Revision Number in der About Box verfügbar machen

Das wollte ich tun, aber  die bestehenden Lösungen fand ich alle nicht so toll.

Well, also noch mal.

Immerhin bietet Python ja eine menge mit seinen Batteries Included. Das heißt ich muss nicht aufwendig mit RegExen die plist dateien auseinander nehmen. Schließlich gibt es die  plistlib.

Hier das Resultat:

#!/usr/bin/env python

# Usage:
# Either copy into a shell script build phase 
# (don't forget to change the interpreter to "/usr/bin/env python")
# Or just put it into a shell script and call it form there.
#
# Discussion:
# There are really two info plist keys that could be used for the source revision:
# The CFBundleShortVersionString and CFBundleVersion
# Apple recommends to use CFBundleVersion, because it is not shown in the finders info dialog,
# but is shown in the standard about dialog of a cocoa application where the CFBundleVersion
# is shown in parantheses behind the CFBundleShortVersionString.
#
# Inspired by Daniel Jalkut at http://www.red-sweater.com/blog/23/automatic-build-sub-versioning-in-xcode
# License: Creative-Commons Public Domain http://creativecommons.org/licenses/publicdomain/

import os, re, plistlib

# Test if run from xcode
is_run_from_xcode = os.environ.has_key("BUILT_PRODUCTS_DIR")
if not is_run_from_xcode:
    exit("Needs to be run from a Xcode shell scribt build phase")

# We take the one from the built products dir to keep revision numbers out of the repository
info_plist_path = os.path.join(os.environ["BUILT_PRODUCTS_DIR"], \
                               os.environ["INFOPLIST_PATH"])

# get latest svn revision
def output_of_command(*command_and_arguments):
    import subprocess
    return subprocess.Popen(command_and_arguments, stdout=subprocess.PIPE).communicate()[0]

os.chdir(os.environ["PROJECT_DIR"])
version_range = output_of_command("svnversion", "-nc")
latest_commited_version = re.search(r"\d*\w*$", version_range).group(0)

# enter into Info.plist
info = plistlib.readPlist(info_plist_path)
info["CFBundleVersion"] = latest_commited_version
plistlib.writePlist(info, info_plist_path)

Pretty neat. :)

Die aktuelle Version des Scripts liegt wie immer im Repository.

  • Posted: 2009-01-24 20:12 (Updated: 2009-01-24 20:28)
  • Author: dwt
  • Categories: code
  • Comments (0)

Wenn Apple mail auf einmal keine Passwörter mehr speichert...

... im Schlüsselbund, dann möglicherweise deswegen weil man gerade  Services Scrubber verwendet hat um sein Services-Menü aufzäumen.

Und das funktioniert indem es die Info.plist eines Programms manipuliert.

Doh. Wenn das nämlich eine signierte Applikation ist (wie alle Apple-Programme) dann stimmt danach natürlich die Signatur nicht mehr. Und das bedeutet dass sie nicht mehr auf den Schlüsselbund zugreifen können.

Natürlich ohne sich irgendwo in logfiles zu beschweren.

:-/

Der neue Trend: Unfactoring

Unfactoring is nicht einfach. Man muss es immer wieder üben.

 Hier ein Schulungsvideo von der RubyConf08.

Highly advised! ;)

Die Ursachen der Finanzkrise erklärt

hg, bzr und git als svn superclient

Ein langer Traum ist in Erfüllung gegangen - alle Versionskontrollsysteme ( hg,  bzr,  git und natürlich  svn) unterstützen endlich das Reden mit einem Subversion-Server.

Das bedeutet, man kann jetzt SVN als Lingua Franca mit allen verteilten Versionskontrollsystemen einsetzen um einen gemeinsamen Server zu haben von dem alle pullen und pushen können. Oder kurz gesagt: Wenn man SVN als Server hat, kann jeder benutzen was ihm persönlich am meisten liegt.

Das funktioniert natürlich noch alles nicht perfekt - aber es fängt an.

Und daher hab ich mal aus Spaß ein Projekt mit jedem der VCS ausgecheckt und bin etwas überrascht von den Ergebnissen:

  • bzr git und svn haben den root des Projekts einfach als große Ordner-Hierarchie ausgecheckt, so wie das in svn eben abgebildet ist.
  • hg hat als einziges ohne Zusatz-Optionen erkannt das es trunk, branches und tags gibt und das auf die entsprechenden nativen Konzepte (branches) abgebildet. (Das müsste mit mehr Aufwand aber mit bzr und git auch gehen).
  • Der Import hat schon mal recht unterschiedlich lange gedauert:
    • bzr: 20 min
    • git: 14 min
    • svn: 7 min
    • hg: 7 min (sogar drei Sekunden schneller als svn! :)
  • Logischerweise sind damit die Repositories auch völlig unterschiedlich groß:
    • bzr: 83 MB
    • git: 93 MB
    • svn: 162 MB (Zweimal die Größe des ganze Source-Codes aller tags und branches, also wie erwartet)
    • hg: 5.2 MB (überraschend - angeblich steckt da die ganze History drin - so richtig glauben kann ich das aber noch nicht. Vom Platz her ist das etwa das doppelte den alleine der trunk als checkout braucht)

Hier die Kommandos die ich abgeschickt habe (mit den Laufzeit Ergebnissen)

bzr clone  http://python-nose.googlecode.com/svn nose-bzr
177,62s user 27,00s system 16% cpu 20:17,34 total
git svn clone  http://python-nose.googlecode.com/svn nose-git
57,63s user 130,80s system 22% cpu 14:02,33 total
svn co  http://python-nose.googlecode.com/svn nose
9,13s user 19,77s system 6% cpu 6:58,31 total
hg svnclone  http://python-nose.googlecode.com/svn nose-hg
27,15s user 12,25s system 9% cpu 6:57,76 total

So viel kann man daraus natürlich nicht schließen - aber mir gefällt dass man jetzt mit allen VCS an Subversion herankommt und der Weg auf dem hgsubversion ist scheint mir schon mal sehr gut zu sein. :)

Blinde und Linux

Heute war ich Brunchen mit Bekannten - insbesondere war da auch ein Blinder dabei, der Linux benutzt und versucht von Windows wegzukommen.

Das war spannend. Zuerst einmal, dass Computerbenutzung für Blinde ein riesen Problem ist. Die bekommen von irgendwelchen Firmen für irrsinnig viel Geld Windows-Computer verkauft, die dann vielleicht auch funktionieren - für die sie aber 5000 € jährlich bezahlen müssen. (Ob die Zahl jetzt stimmt sei mal dahingestellt - Fakt ist, es ist teuer).

Und die Krankenkassen sind da nicht so geberfreundlich - denn wer braucht denn schon das Internet? Selbst braille-Zeilen sind wohl ein echter Kampf bis man sie kriegt. (UNGLAUBLICH wenn man sich das überlegt!)

Dabei geht es ja auch anders: Linux hat die Kommandozeile, die für Blinde schon mal ein großer Vorteil ist - und sie können freie Software selber Hacken bis Sie tut was sie brauchen.

Was wohl z.B. bei dem  Gnome Screenreader Orca auch einige tun. (Yay! More power to you!)

Prinzipiell haben Blinde mit freier Software überhaupt eine Chance, denn der Markt gibt viele Hilfen die sie bräuchten einfach nicht her. Spezielle Routenführer für Blinde? Gibt es, aber dort stehen für Berlin nicht mal die U-Bahnen mit drinn. Geschweige denn wo genau der Eingang dazu ist und ob sie aus dem Zug jetzt vorne oder hinten aussteigen sollen, damit sie gleich noch eine Unterführung unter der Straße nutzen können.

Das fand ich überhaupt das Spannendste, wo denn die Probleme liegen. Also zum Beispiel:

  • Open Office funktioniert wohl ganz gut - aber sobald man eine Präsentation im Full-Screen Modus anschaut, rendert OpenOffice offenbar die Folien als Bild - tada, die Screenreader Information fehlt und alles ist still.
  • Scannen ist ein riesen Problem. Es gibt einfach keine Software mit vernünftiger Layout- und Tabellen-Erkennung die eine genügend hohe Erkennungsrate hat. Bis vor kurzem war noch nicht mal drinn dass die Orientierung des Textes erkannt wurde...
  • PDFs lesen geht nicht. Acrobt Reader soll es wohl können - aber die freie Software noch nicht.
  • Browsen mit Firefox funktioniert gut - aber wenn man eine lange Seite schnell ein paar mal scrollt (space oder pagedown) dann dauert es manchmal bis zu einer Minute bis der Screenreader auch so weit gekommen ist.

Spannend. Das sind nicht ganz die Probleme mit denen ich gerechnet hätte. Vor allem dass GUI-Anwendungen so wichtig sind. An Firefox und OpenOffice kommt kein Blinder vorbei.

Noch ein eher abschreckendes Beispiel: Er hat an der exzellenten Freien Universität Informatik Studiert. Dabei ist er aber gescheitert, weil z.B. die Aufgabenblätter zwar als PDF kamen - aber darin nur gescannte Aufgabenblätter waren...

Peinlich.

  • Posted: 2009-01-18 14:34 (Updated: 2009-01-18 15:36)
  • Author: dwt
  • Categories: fnord
  • Comments (0)

Model View Controller - endlich mal erklärt

 Per Video.

Groooßartig. :-D

The Git Index considered harmful

Endlich hab ich mal eine  ordentliche Quelle gefunden wofür  der Index bei  GIT gut ist.

Kurz erklärt: Der Index ist eine Vorstufe für jeden Commit. Man comittet zuerst in den index mit git add some_file und comitted dann den index ins repository mit git commit. Es sei denn man sagt git commit some_file in dem fall wird es direkt comitted, oder man wählt eines der anderen kommandos die irgend etwas merkwürdiges mit dem index anstellen, dann weiß man in der Regel gar nicht mehr was Sache ist.

Das hab ich nie verstanden - denn wieso noch mal eine Stufe mehr, wenn man doch sowieso lokal arbeitet und alles was man verbockt hat wieder verändern kann bevor man es pusht?

Ah well. Es gibt offenbar drei Hauptgründe:

  1. Der Index hilft besser mit einer dirty workspace zu leben
  2. Der Index hilft noch mehr über einen commit nachzudenken und ihn zu verfeinern bevor man ihn macht
  3. Linux Torvalds hat den Index erfunden und will ihn behalten

Zu 1. Eine Dirty Workspace ist manchmal praktisch

Die Idee ist dass es Änderungen gibt die jeder in seinem lokalen Checkout hat aber niemand einchecken will. Z.B. die debug-flags, oder der andere Pfad in einem makefile. Es ist viel komfortabler jedes mal zu sagen was man committen will, als jedes mal daran zu denken was man nicht committen will. Ganz davon abgesehen dass man irgendwan nicht daran denkt das man etwas nicht machen wollte. Been there, done that.

Dieses Problem hab ich auch ab und an. Zum Beispiel dieses komische File dass einen Build-Counter für den Build-Bot enthält. Eigentlich sollte das gar nicht in das repository. Aber dann war es doch drinnen. Und es nervte eigentlich nur, weil jeder lokale compile es erhöht hat. Und wenn es dann doch mal jemand comitted hat, gab es für jeden anderen natürlich einen konflikt. Sehr nervig. Oder der Debug-Flag, den man irgendwo tief in einem Framework einschalten musste. Den will ich natürlich auch nicht in einem Release haben.

Ich finde allerdings dass der Index überhaupt keine gute Lösung für derartige Probleme ist. Wenn ich lokale changes habe die ich nicht committen will, dann würde ich die viel lieber als "ignore" markieren, als jedes mal alles andere zu committen.

Ein bekannter formulierte das mal so, dass er oft code hat der den Code Testet den er comittet - und dass er den nicht im Repository haben will. Diese Variante des Arguments finde ich allerdings noch schrecklicher, weil ich in jedem Fall den Testcode auch im Repository haben will. Gerade. Damit ich später regressionstests durchführen kann. Automatisiert natürlich. Alleine der Gedanke dass der Testcode gleich wieder weggeworfen wird... *schauder*

Zu 2. Erst noch mal drüber nachdenken ist eine gute Idee

Das finde ich ein wesentlich besseres Argument: Man soll sich über einen Commit Gedanken machen bevor man ihn tut. Und damit man das tut soll man genau auswählen was in ihn hinein kommt.

Commendable.

Allerdings nur wenn man nicht richtig darüber nachdenkt. Denn git ist ja ein distributed VCS. Das heißt, alle commits sind erst einmal lokal. Und kommandos die den letzten commit einfach rückgängig machen oder noch mal neu gibt es jede menge. Sogar um mehrere History-Schritte zurück zu kommen. (Und die braucht es sowieso, denn selbst mit Index macht man immer wieder Fehler.)

Oops.

Also bleibt übrig: der Index ist ein zusätzlicher Abstraktionsschritt der keinen Wert hinzufügt, sondern nur kompliziertere Bedienung erzeugt.

Hm. Das heißt natürlich frei nach Occam, dass man den Index als überflüssiges Konzept 'über die klinge springen lassen' sollte.

Zu 3. Linus hats erfunden und will es behalten

Dass scheint mir der eigentliche Grund zu sein. Wie Torvalds es selber schon gesagt hat:  I have an ego the size of a small planet. Und daher wird es den Index auch weiter geben. Auch wenn es eine schlechte Idee ist. Und die git-Benutzer werden sich damit arrangieren, da niemand die Lust hat das wirklich auszufechten.

Zumindest ist das meine Einschätzung.

Schade eigentlich.

Hier mein Vorschlag: Für alle Index-Liebhaber gibt es eine Option in ihrer .gitrc mit der sie den Index und wie er heute ist aktivieren können. Für alle anderen gibt es den vernünftigen default wert, der den Index einfach wie bei allen anderen Versionskontrollsystemen versteckt. Das macht man am besten so, dass bei einem Update, die .gitrc so verändert wird, dass alle die git updaten den index behalten und alle die git neu einrichten den index explizit aktivieren müssen. Dass sollte am wenigsten Geschrei erzeugen.

Kommentare bitte per mail an spamfaenger ät gmx.de

Update: Es gibt noch viel mehr leute die mit der Git UI probleme haben. :)

Liquid Democracy und Politikwissenschaftler

Heute waren zwei Politikwissenschaftler bei der Piratenpartei zu Gast - und sie sind durch  Liquid Democracy ( wikipedia) auf uns aufmerksam geworden.

Yay.

Auf die Frage was sie an diesem Thema reizt kamen tolle Sätze: "Kein Politikwissenschaftler weiß eigentlich noch was er noch wählen soll.", "Die Linke nicht für die Außenpolitik, die FDP für die Freiheitsrechte, die SPD nicht für die Sozialpolitik...".

Dem kann ich überhaupt nichts mehr hinzufügen. Keine Partei passt mir am Stück. Keine Partei kann ich mit gutem Gewissen wählen.

Und das ist auch die Grund-Idee hinter einer flüssigen Demokratie: Die fließband-Produkte die man von Parteien bekommt sind es heute einfach nicht mehr.

Nur die Alternative ist einfach noch nicht fertig. :-(

No software is free and spreading that misconception is harmful.

Da hat eine Lehrerin in Amerika doch tatsächlich ihren heiligen Eifer entdeckt und muss ihre Schüler davor schützen freie Software zu benutzen. Daraufhin hat sie die Linux-CDs eines Schülers konfisziert und klagte dann per e-mail den Projektleiter des Linux-Projekts an.  Weil es Software die Umsonst ist nicht geben kann und darf.

Unglaublich. Peinlich.

Und das wird immer schlimmer je weiter man ließt.  via

Software Literacy

The ability to “read” a medium means you can access materials and tools created by others. The ability to “write” in a medium means you can generate materials and tools for others. You must have both to be literate. In print writing, the tools you generate are rhetorical; they demonstrate and convince. In computer writing, the tools you generate are processes; they simulate and decide.

-- Alan Key

  • Posted: 2009-01-08 21:09
  • Author: dwt
  • Categories: (none)
  • Comments (0)

Stop-Motion Videos are all the rage...

Epson All in One

 Schickes Gerät. Vor allem ist  der Support von Epson auch gar nicht so schlecht. Per Chat wurde mir da doch sehr schnell geholfen die Scan-Funktion so umzubiegen, dass sie auch über den Print-Server und damit über das Netzwerk funktioniert.

Da hatte sich meine Hartnäckigkeit doch gelohnt - denn laut Manual geht das nämlich nicht.

Apropos Manual... Das ist so mit DRM vollgesaut, dass man daraus nicht mal ein Stück Text herauskopieren kann (nicht mal für ein Zitat!).

Zum Kotzen.

Und an sich darf man es auch nicht speichern, kopieren, archivieren... unglaublich.

Das Gerät gefällt mir ja ganz gut - aber die Software ist unter jeder Kanone. Ach ja, neben den Manuals die ja noch nicht mal alle Features enthalten.

25C3 vorbei

war das anstrengend.

Die Highlights waren für mich das  Piratenprojekt zu Liquid Democracy und die  Bierfass-Verleihung für den OpenTracker. Der Rest war natürlich auch grandios - aber darüber schreiben schon andere und ich später auch noch mal.

Mein Persönliches Ergebnis für den 25C3 ist eine kleine Implementierung einer Proxy-Voting-Engine in Python - das ist aber natürlich mehr ein Proof of Concept denn irgend etwas anderes - und das muss man jetzt erst einmal irgendwo implementieren um es tatsächlich benutzen zu können.

World of Goo

Was soll ich sagen - ich bin begeistert.

 Das Spiel ist eine Mischung aus Cracy-Machines und Lemmings und macht gerade ob des total einfachen Spielprinzips unheimlich Spaß.

Aufmerksam bin ich darauf geworden, weil die Entwickler Ron Carmel und Kyle Gabler sich entschieden haben  in ihr Spiel keinerlei Kopierschutz einzubauen.

Da musste ich es doch gleich ausprobieren - und hab es mir gerade gekauft. Absolut das Geld wert. ( 15 €)

Meine Empfehlung für Weihnachten. (Mac und Windows, Linux ist gerade noch in der Entwicklung)

Windows für Atom U-Boote

 BAE führt in den UK die Konversion der Kontrollsysteme durch.

Gut oder schlecht?

Gut
"Blue Screen of Death" hat eine ganz neue Bedeutung... Vielleicht ist das die ultimative Befriedungsmaschine?
Bad
Windows kann Atomraketen abfeuern? Oder irgend welche Waffen? *angst*

Was macht erfolgreich?

 Richard St. John auf der TED Konferenz sagt es sind 8 Dinge.

  • Leidenschaft
  • Harte Arbeit
  • Fokus
  • Ausdauer
  • Ideen haben
  • Etwas gut machen
  • Immer wieder versuchen
  • Dienen

Dem stimme ich voll zu.

Wer hat Angst vor extremistischen Moslems?

Na, hände hoch?

Ich hab hier ein neues Angst ziel. Eines das viel näher ist! *grusel*

Dance and go to hell

  • Posted: 2008-12-14 10:20 (Updated: 2009-10-24 16:14)
  • Author: dwt
  • Categories: fnord
  • Comments (0)

Liblingsutilities: Mehrere Zwischenablagen

Das ist ein eher unbekanntes Utility das mir aber unheimlich Zeit spart:  PTHPasteboard.

Unglaublich gut. Schnell und einfach so viele Zwischenablagen wie man will - die auch über Neustarts gesichert werden.

Und das ganze für umsonst - wo alle anderen Clipboard-Applikationen (und davon gibt's viele) Geld kosten.

Man kann natürlich auch für PTH-Pasteboard Geld bezahlen - aber nur wenn man noch fortgeschrittenere Features braucht.

Unheimlich nützlich - sofort installieren und einen Tag bewust ausprobieren - schon kommt man nicht mehr ohne aus.

Open Trace

Zeigt was die Vorratsdatenspeicherung bedeuten kann. Eine Webseite auf der man surfen kann - und während dessen werden ein paar der Fingerabdrücke die man hinterlässt ausgewertet und daraus ein Profil erstellt.

 Wirklich hochspannend was dabei herauskommt.

Das passt finde ich hervorragend zu der Tatsache, dass im letzten Jahr  in 2200 (zwei tausend zwei hundert) Gerichtsprozessen von Richtern angeordnet wurde solche Verbindungsdaten zu nutzen. ( via)

Großartig. Unsere Regierung kann nicht einmal sagen dass die Daten irgend etwas genutzt haben, aber jeder bedient sich schon mal kräftig daran. Von wegen "nur in schwersten fällen".

p.s.: Wenn man zwei drei Webseiten aufgerufen hat, muss man oben in der Mitte auf "Profil auslesen" klicken um sich den wirklich beängstigenden Teil anzusehen.

The first and second rule of optimization are

(according to  Michael A Jackson)

  • The First Rule of Program Optimization: Don't do it.
  • The Second Rule of Program Optimization – For experts only: Don't do it yet.

Bisher dachte ich immer dass es sich dabei nur um eine andere Formulierung des guten alten: "First make it work, then make it fast" handelt.

Bis es mir jetzt wie Schuppen von den Augen fiel, dass da noch viel mehr dahinter steckt. Denn natürlich lässt sich der Spruch auch auf das tatsächliche Optimieren selber anwenden.

Wie macht man etwas schneller? Am besten in dem man es nicht tut.

Und wenn das nicht geht: Mach es zu einer anderen Zeit!

Doh.

Gründung Bürgerplattform Moabit: Wir sind da!

Bühne So heißen sie.

Heute fand sie statt. Die Gründung. Zumindest haben die Veranstalter dass so genannt.

Genau genommen fand die auf 90 minuten geplante Veranstaltung (in einer  Boxhalle!) nämlich nach zwei ein halb Jahre Vorarbeit mit den ganzen lokalen Vereinigungen statt. Die haben sich dort getroffen - jeder Verein oder Kirche oder Gemeinde oder irgend etwas hat sich vorgestellt und auch gesagt wie viele Leute sie mitgebracht haben.

Immer unterbrochen von fetziger Trommelmusik und auch ein paar Sketchen.

Und der Saal war proppevoll! So voll, dass der Veranstalter gebeten hat, dass die Jungen Leute aufstehen mögen für die Älteren. Und die Teilnehmer haben applaudiert und es gemacht. (Detail: die meisten Ordner waren Frauen - und nicht wenige mit Kopftuch)

Großartig.

Dann hat sich die Plattform vorgestellt und anhand von Adjektiven verortet:

  • Bunt: Weil so verschiedene Gruppen, Religionen, Geschlechter und Generationen dabei sind
  • Unparteiisch: Weil keine Wählerstimmen gebraucht werden
  • Kraftvoll: Weil über 40 Organisationen vertreten werden
  • Wissend: Weil alle Mitglieder aus Moabit und Wedding sind und daher wissen was die Probleme sind
  • Zielstrebig und Selbstbewusst: Weil man für Ergebnisse Arbeitet, kompromissbereit, aber hart in der Sache
  • Langlebig: Als dritte Kraft neben Wirtschaft und Politik, als im positiven Sinne: "Unruhestifter und Anstifter!"

Saal

Danach haben alle Teilnehmenden Organisationen mehrsprachig und mit vielen persönlichen Grußworten vorgestellt. Jeweils mit erklärung warum sie teilnehmen und mit wie vielen Leuten sie gekommen sind: 10, 15, 12, 49, 160... Alles zusammen waren etwa 1200 Leute anwesend (und das war eine realistische Zahl)

Sätze daraus: "Gemeinsam sind wir Stark!", "Misch dich ein, misch mit!", "Let us stay together, work together, fight together, for the common good!", "Ein Verantwortlicher musste jemand im Krankenhaus besuchen, Kieferbruch, Intolleranz und der übliche Baseballschläger.", "Der Islam fordert uns auf uns zu engagieren", "Zwischen Knast und Kanzleramt", "Geht nicht, gibts nicht!"

Und damit war die Bürgerplattform  Wir sind da! gegründet.

Ach ja, als Abschluss der Vorstellungsrunde hat  Dico noch Werbung für die Fortbildungen gemacht die sie in Community Organising für die Teilnehmer der beteiligten Gruppen anbieten.

Und die Arbeit fing an. Einzelne Community-Leader haben erzählt was in den Bereichen die Sie überblicken jeweils ein großes Problem ist. Zwei Beispiele: Die meisten Migrantenkinder schaffen es nicht in ein Gymnasium zu kommen sondern müssen stattdessen Arbeiten - daher kriegen sie zu wenig Bildung mit und schlechtere Jobs. Oder das vor einer Kirche ständig gesoffen wird, bis Schießereien stattfinden.

Dann musste ich leider gehen, obwohl ich gerne geblieben wäre.

Hoch spannend.

Das Life Bildarchiv ist online gegangen

Wohl eines der wichtigsten Bildarchive unserer Zeit.  Hier.

Besonders beeindruckend finde ich die Übersichtsbilder über Hiroshima.

 via

Warum ich C++ hasse

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.

Amerikanischer Sport: Der "propper" Buttslap..

Erstes Cocoa Heads Berlin Meeting

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. :)

Obamas elektronischer Wahlsieg

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.

 Und will das auch weiter tun.

Das finde ich großartig.

Apple iPhone Tech-Talk

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.

iPhone Applicaton Development

Hier einige Notizen zu der iPhone API die ich spannend finde:

iPhone Development Facts

  • iPhones in 70 Ländern mit 70+ millionen iPhones (plus unbekannt viele Touches)
  • 5500 Apps gibts im App Store
  • 200 Millionen Apps wurden in 121 Tagen vergekauft
  • Wie Funktionieren iPhone Applikationen:
    • Bedienung mit dem Finger und Gesten: Pinch, Flick
    • So wenig Input wie möglich machen (Weil Input anstrengend ist)
    • Wenig Platz auf dem Bildschirm: Jede Applikation macht eine Sache und nur die
    • GPS, Accelerometer werden benutzen
    • Wenn die Applikation beendet wird wird der Zustand gesichert
  • Kriterien für Erfolgreiche Apps:
    • Delightfull (Spaß, Intuitiv)
    • Innovative (Revolutionär, Innovativ, anspruchsvolle Technik)
    • Designed
      • Great Design -> kleine Teams damit gute Ideen auch eine Chance haben
      • viele Iterationen
      • ständiger Fokus auf Design [40% der Zeit! Nicht wie sonst]
      • Attention To Detail
      • "Sollutions Not Features"
      • "Saying no to 1000 things"
      • "Chose top 5 Features and amplify them"
      • "Flatten data, to make it easily digestible"
      • 30 Second usage Scenario: Man soll nach 30 Sekunden mit der Applikation schon wieder fertig sein.
    • Integratied (Use all available technology - don't reinvent)
    • Optimized (Performance, Stability, Battery Life is important), no PORT -> neu und spezifisch fürs iPhone bauen
    • Connected: Integrate data as much as possible, Connect to a Mac-Application
    • Localized (40% des Maktes sind nicht-Englisch) Applikation UND Store lokalisieren! (Sonst weiß kein User dass die Applikation lokalisiert ist)
    • Diese Checkliste immer wieder abarbeiten. :)

Dev Tools Overview

  • Platz sparen ist das wichtigste, da sonst der watchdog das Programm killt
  • Ein iPhone Programm sollte nur etwa 20-25 MB Ram benutzen (Insbesondere nicht so viel wie direkt nach dem Start des iPhones frei ist!)
  • Code: Alles statisch gelinkt -> Code wird man nicht los
  • Bilder: png! (evtl. nochmal speziell komprimieren)
  • Named-Images: Die sind immer im Speicher da gecached -> Durch Filename laden (wird dann nicht gecached)
  • Audio: Dolby Surround ist schlecht -> mp3, mp4
  • Caching darf man gerne selber implementieren - Flasch kann man so viel nutzen wie man will
  • Applikationen im App-Store können maximal 2 Gig groß sein.

User Interface Design

Eine Applikation zu erstellen kann man grob in 4 Phasen einteilen

  • Familiarize:
    • iPhone verstehen
    • HIG lesen
    • Je schnell man mit einer Applikation fertig ist, desto besser: Starbucks, während jemand vor einem was ordert! (<30 sek)
    • Schnell starten / laden, schnell etwas rausfinden, schnell wieder beenden
    • Andere Input-Art: Finger. Weniger Input ist mehr!
      • Nach Möglichkeiten suchen Tippen zu vermeiden - weil schwer
      • Tippfehler akzeptieren / korrigieren
    • Weniger Platz am Bildschirm: Das wichtigste aussuchen, das Verstärken
      • "Reduce and Amplify!"
      • "You want to strip this app to the bone!"
  • Conceptualize
    • Fokus auf Lösungen!
    • "Refine, Refine, Refine"
    • Das Mentale Modell der User ergründen
      • Eine Frau die Kinder, Hund, Mann pflegt
      • Sie schaut auf ihre Einkaufsliste, wie viel sie auf dem Konto hat
    • Benutzer entscheiden in 20 Sekunden ob sie eine Applikation behalten. Wenn sie 15 davon zum Starten benötigt...
      • Nur Spiele die man eh länger (10-30 Minuten) spielt dürfen länger brauchen (manche Utilities auch)
    • Immer mit einer Idee anfangen:
      • "Vielleicht inneneinrichtung machen?" -> Was könnte man machen? Viel.
      • "Vielleicht  FoneLink auf das iPhone bringen?" -> Macht schweine viel....
      • Was ist die Lösung die man anbietet?
    • Define your solution:
      • Application Definition statement: Worum geht's wirklich? Was und für Wen ("iPhoto ist ein Programm zum sortieren, betrachten und teilen von Photos für Home-User und Amateure.")
      • Das ist das Sieb mit dem man Features aussiebt
    • Refine Features
      • Was ist das wenigste mit dem man durchkommt?
        • Wegschmeißen! Selber belohnen wenn man etwas rauslässt! :)
        • Sieben mit dem "Application Definition Statement"
      • Was ist Neu, Am häufigsten Benutzt, Von den meisten usern (80%), Passt für unterwegs Benutzung
      • Was passiert wenn man sich ver"klickt"?
      • Was wenn die Beleuchtung schlecht ist?
      • Weniger Information zu jedem Zeitpunkt anzeigen, dafür "drill down"
    • Welches Mentale Modell haben die Benutzer? Wie sieht er die Applikation?
      • Identify: Objects, Tasks, Roles, Relationships
  • Realize
    • Welche Art Programm baut man? (Welcher Typ?)
    • Produktivität: Lang benutzung (Mail), Wenig Graphik, Viele daten (Drilldown)
    • Utility: Ein Blick auf etwas, dann fertig
    • Immersive: Games, eigene Oberfläche, viel Graphik
    • Das kann man plotten: Von oben (Serious) nach unten (Fun), von links (Entertainment) nach rechts (Tool)
      • Oben Rechts (Serious Tool) Mail: Viel Text, Hierarchien, wenig Graphik
      • Unten Rechts: (Fun Tool) Social, Twitterific: Graphisch, wenig Text, Flache Hierarchien
      • Unten Links: (Fun Entertainment) Games: Graphisch, alles eigenes Interface
      • Oben Links: (Serious Entertainment) News: Text, wenig Graphik, Hierarchien (drill down)
      • Mitte: Utilities (Rest?) Wetter, Aktienkurse, Uhrzeit / Wecker
    • Objekthierarchie in der UI wiederspiegeln (Das hat mich überrascht, da man das auf dem Desktop ja eigentlich eher nicht machen will (Weil das Mentale Modell der user, nach dem man das Interface baut, nicht unbedingt der beste Implementierungsweg ist)
    • Mit Papier Iterieren (Welcher Screen kommt wo und wann?) immer wieder...
  • Finalize
    • Verbessern mit Photos und Bildern
    • Animation für Begeisterung und Feedback!
    • Refine, Optimize, Enhance

Zusammengefasst:

  • "Application Definition Statement" erstellen
  • Iterieren "early and often" (Auf Papier?)
  • Bis zum Release wiederholen - dann wieder von vorn. :)

UIKit Development

  • View Controllers stehen immer im Zentrum: "The C in MVC" :)
    • Einer für jeden Bildschirm / Screen in der App
    • Zwei Sorten: Custom Subclasses (Typischerweise 1 Screen), Apples Subklassen (machen mehrere Screens!)
    • "view" property zum ablegen des UIViews
    • wichtige delegate methoden: loadView: viewDidLoad: viewWillAppear: viewDidAppear:
    • initWithNibName:bundle: -> Designated initializer
    • Releasen wenn man fertig ist mit anzeigen -> Speicher sparen
    • Navigation controller: "Drill Down" interfaces
      • Managt andere ViewController!
      • wichtige Delegate Methoden: pushViewController:animated: popViewController:animated:
      • Wechselt Controller, Show/Hide NavigationController (für die Rückwärtsnavigation und wenige Aktionen)
    • UITabBarController: Verschiedene Ansichten auf die gleichen Daten (iTunes)
      • Managt NSViewControllers
      • More und Konfiguration (fast wie NSToolbar!)
      • Icons schwarz-weiß Outlines mit Alpha!
    • Toolbars: Tools und Aktionen (nur ein Icon)
      • Kein UIViewController!
      • OK: Modales-Sheet als Aktion bringen (Slide up from the bottom!)
      • Slide up meint: Etwas worauf man reagieren muss (Slide across meint navigating)
      • Nie im Tab-Switcher aktionen auslösen!
      • Bookmarks: Sheet dass den ganzen Bildschirm abdeckt
    • UITableViewController: Tabellen...
      • Plain (Adressbuch), Grouped (Prefs)
      • Header, Footer, Sektionen (wieder mit Header & Footer)
      • Jede menge delegate calls um es zu befüllen
      • UITableCells:
        • Kann: Bild, Text, Disclosure / Accessory (evtl. auch checkbox?)
        • Kann einfach Subviews hinzufügen (Yay, nie mehr SubviewTableViewController)
          • Speicher sparen: (Speziell beim scrollen wichtig, damit es flüssig ist) "Cellen" mit gleicher Klasse / Struktur sollten gleiche ID haben, dann kann man mit [tableView dequeReusableCellWithIdentifier:someID] die die oben rausgescrollt sind wieder verwenden statt jedesmal eine Neue zu machen
    • View Controller Tips
      • Immer festlegen ob man das View drehen kann oder nicht (Telefon verkehrt herum macht keinen Sinn - Spiele könnten aber auch in beiden Landscapes prima funktionieren)
      • Bildschirmgröße kann unterschiedlich sein: Beim Telefonieren ist die Statusbar doppelt so hoch!
      • Memory
        • Jeder UIViewController kriegt Memory-Warnings
        • applicationDidFinishLaunching -> leicht halten (für schnellen Startup)
        • Jedes UIKit View ist / hat einen core-animation Layer -> Macht spaß
        • Während der Animation (asynchron) die Applikation blockieren. Wenn der User irgendwo klickt und einen view-wechsel auslöst, der die Animation sinnlos macht...
  • Text Display:
    • UILabel, UIWebView (html, pdf, word)
    • NSString (UIStringDrawing)
    • UITextField (so wenig wie möglich, immer defaults anbieten!)
    • Keyboard Code: (UITextInputTraits) oder IB
      • shown in becomesFirstResponder hidden in resignFirstResponder
      • Cancel bedenken!
  • UITouch (ein Finger!)
    • multiTouch muss man per view einschalten!
    • Gesten muss man selber erkennen
    • touchesBegan:withEvent: touchesMoved:withEvent: touchesended:withEvent:
  • Accelerometer: Reichtung
    • deviceOrientationChanged: delegate
    • Oder direkt -[UIAccelerometer sharedAccelerometer]
      • möglichst wenig (baterie) grob: 10/sec, spiel: 30/sec
      • filtern! low pass (konstante bewegungen)-> Bubble-Level Sample, high-pass für plötzliche bewegungen
      • Kriegt keine konstante Bewegung oder Richtung mit
  • MediaPlayer: Full screen movies
  • Wichtig man kann zu jedem Zeitpunkt unterbrochen werden. Telefon, SMS, Termin (Telefonieren ist aber das wichtigste!)
    • Dann: Adio anhalten, Animation weg, Pausen-Funktion
    • Bei einem Telefonanruf: Erst wird eine Pause ausgelöst, und eine Dialogbox die dem User erlaubt das Telefonat anzunehmen oder abzuweisen, Wenn er annimmt, wird die Applikation terminiert, sonst "resumed"
  • CoreLocation
    • Filter setzen damit weniger callbacks notwendig sind: distanceFilter = xxx; desiredAccuracy = kConstant;
    • setzt man die filter "niedrig" genug wird möglicherweise GPS gar nicht angeworfen -> weniger Strom, schneller
    • Authorization Dialog: durch startUpdatingLocation -> lehnt der User ab muss man das behandeln (Muss man das jedes mal authorisieren?)

Optimization with Instruments

  • Wenig über Instruments und Shark. Mehr allgemeines Zeug
  • Man muss sich klarmachen was man wo an informationen kriegen kann:
    • Simulator: Mac: 2 ghz, 2 gig ram, 500 gb platte, 2mb l2 cache, ethernet, wifi
    • iPhone: 400mhz, 128 mb ram, 8-32 gb flash, kein cache, wifi, 3g, edge
  • Was messen: Speicher, Malen und Scrollen, Startzeit, Dateizugriff, Stromverbrauch
  • VM gibt's, aber kein swap, read only pages (memmap) werden aber geschossen und neu geladen
  • Keine Garbage Collector (man könnte sich aber mal an dem Boehm versuchen :)

Tips:

  • Static Memory minimieren
    • Code Size
    • Compiler flags (schon standardmäßig): -mthumb -> benutzt nur ein 16 Bit Subset und macht kleineren -> Floating point Code wird aber wesentlich größer -> Abwägen
    • "Dead Code Stripping" -> hilft aber nur bei C/C++ Code
    • Möglichst abschalten was man nicht braucht (C++ RTTI, Exceptions)
    • PNGs statt BMP/TIFF
    • Plists als binary Variante (macht Xcode automatisch beim Resourcen Kopieren)
  • Dynamic Memory
    • NSAutoreleasePools eher vermeiden sonst so nutzen wie mans machen soll -> computation intensive schleife -> alle 100/1000 mal einen neuen nehmen
    • "nonatomic" properties sind bis zu 10 mal schneller
    • leaks vermeiden....
  • Memory warnings
    • Unbedingt reagieren -> sonst wird die Applikation abgeschossen
    • Werden u.a. via den UIViewControllern geliefert
    • Dem Benutzer sagen dass die App gleich crashen könnte ist KEINE Lösung
  • Custom Drawing:
    • Views undurchsichtig (opaque) machen -> schneller
    • optimiert Zeichnen: -setNeedsDisplayInRect:, dann nur das in -drawRect: malen
    • Cachen was sich nicht verändert
    • Möglichst views nicht beim Scrollen allokieren -> langsam
      • "reusable cells" machen mehr sinn (siehe dequeue...)
    • Cell layer hierarchies zusammenfallen lassen? (Unklar was das genau sein soll
    • "Design for fast launch, short use"
    • "Optimize startup, Optimize quit"
    • Rest per lazy initializing
  • Große Datensets:
    • -[NSData initWithContentsOfMappedFile:]
    • SQLite für random access in großen Datensets
  • So wenig wie möglich schreiben
  • Sich schnell / langsam ändernde Daten trennen
  • Möglichst wenig Batterie verbrauchen
  • Möglichst wenig Netzwerktraffic
    • wenn doch: Viel auf einmal, wenig "chatty protokolls"
  • Location:
    • Holen, dann callbacks ausschalten
    • Genauigkeit nur so weit einschränken wie man es tatsächlich braucht
  • Posted: 2008-11-10 21:06 (Updated: 2008-11-10 21:12)
  • Author: dwt
  • Categories: code
  • Comments (0)

Piratenpartei Berlin Blog

 Noch zwar unter einer obskuren URL aber das ändert sich auch bald  hat sich geändert.

Yay, wir haben einen Blog eingerichtet.

:)

  • Posted: 2008-11-06 20:14 (Updated: 2008-11-15 08:15)
  • Author: dwt
  • Categories: links
  • Comments (0)

Die Wahl in Amerika

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?

 Hier schon mal die Ergebnisse.

Delegation sucks

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 of my invocation? 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.

Syntax matters

Gerade habe ich doch ein Stück Code hochgeladen? mit dem man jeden beliebigen Methodenaufruf in eine Invocation umwandeln kann.

Nun, das hat mir nicht gereicht. Jetzt hab ich mich noch mal hingesetzt und mich an einer anderen Syntax versucht:

// anstatt
id invocation = NMCatchInvocation(@"fnord", stringByAppendingString:@"42");

// jetzt
id invocation = [NMRecordingInvocation invocation];
[invocation recordWithTarget:@"fnord"] stringByAppendingString:@"42"];

// oder
id invocation = [NMRecordingInvocation invocationWithTarget:@"fnord"];
[invocation record] stringByAppendingString:@"42"];

Und ich finde das ist von der Syntax her deutlich eleganter als das Makro.

Allerdings:

  • Es ist etwa der doppelte Aufwand dass zu implementieren
  • Das Makro erzeugt viel schnelleren Code (viel weniger allokationen)

Was soll ich davon jetzt halten? Small is beautifull? Keep it simple stupid? Oder ist doch wichtiger dass der zweite Versuch eher dem Objc-Spirit entspricht?

Mir ist das auch nach einem Tag darüber nachdenken erheblich unklar.

Grundeinkommen

Spannend wars heute auf  dem Kongress.

Vormittags der Workshop über Simulationsmodelle über die Auswirkungen der Einführung von Grundeinkommen auf ein Modell der österreichischen Volkswirtschaft (in dem sich zeigte dass Gewinnsteuerfinanziertes Grundeinkommen das verwendete Modell stärker destabilisierte als ein durch negative Einkommenssteur finanziertes.

Well, dafür das der verantwortliche für das Modell nur einen Tag lang simuliert hat...

Danach ging es noch ein bisschen mit zellulären automaten weiter um damit zu simulieren wie sich das Wissen um Grundeinkommen in der Bevölkerung ausbreiten konnte.

Beides nicht großartig, aber doch ein interessanter Einblick darin dass auch in der Simulation eben nur mit Wasser gekocht wird. Will sagen: Das hätte ich auch gekonnt.

Danach gabs dann einen Argumentationsworkshop gegen Stammtischparolen und Killerargumente - das war mal was praktisches und für mich (trotz einer was Argumente angeht eher mageren Ausbeute) damit das Highlight des Tages.

Schlussendich noch eine (gefühlt endlose) Podiumsdiskussion. Bei der ich wie auf Kohlen saß - mir ist nach wie vor noch nicht klar wieso ich das so extrem nervig fand. Naja.

Immerhin kam mir dabei noch eine interessante Idee: Viel beschworen ist ja die Angst vor der Arbeitsunwütigkeit der Bevölkerung wenn es ein Grundeinkommen gibt. Dass die dann nicht mehr Arbeiten würden und es sich nur noch gut gehen lassen werden.

Tja, das kann man doch einfach Testen. Alle Gemeinden < $GRENZWERT dürfen sich für eine Lotterie anmelden. Die Leute die in der Gemeinde leben die Gewinnt (und nur die die zu dem Zeitpunkt dort leben) kriegen dann von da ab bis an ihr Lebensende ein garantiertes und bedingungsloses Grundeinkommen.

Voila - schon weiß man bald viel mehr darüber wie sich Menschen mit Grundeinkommen verhalten. Und dann kann man bald die Angst dass die dann ja alle nicht mehr Arbeiten würden fundiert wiederlegen. (Ok, kann man IMO jetzt auch schon, aber es wäre halt doch etwas anderes)

Bonus wäre natürlich wenn man gleich mehrere solcher Versuche macht um verschiedene Rahmenbedingungen zu testen.

Billiger als ein Bankencrash wäre es allemal - und viel Produktiver.

NSInvocations zusammenbauen...

...ist deutlich schmerzhaft.

Man muss eine Menge Aufwand treiben um aus einem objc-call etwas zu machen dass man schön hin und her passen kann.

Zum Beispiel:

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    id aString = @"fnord";
    
    id signature = [aString methodSignatureForSelector:@selector(stringByAppendingString:)];
    id invocation = [NSInvocation invocationWithMethodSignature:signature];
    
    [invocation setTarget:aString];
    [invocation setSelector:@selector(stringByAppendingString:)];
    id appender = @"23";
    [invocation setArgument:&appender atIndex:2];
    
    [invocation invoke];
    
    id returnValue = nil;
    [invocation getReturnValue:&returnValue];
    
    NSLog(@"Got: %@", returnValue);
    
    [pool drain];
    return 0;
}

Das nervt sobald man es öfters als einmal machen muss.

Darum hab ich mir nach langem nachdenken mal etwas zusammengebaut das das erleichtert. Es ist nicht perfekt und ich hab auch eine Menge Ideen wie man es noch schöner machen kann, aber es funktioniert. :)

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    id invocation = NMCatchInvocation(@"fnord", stringByAppendingString:@"23");

    [invocation invoke];

    id returnValue = nil;
    [invocation getReturnValue:&returnValue];
    
    NSLog(@"Got: %@", returnValue);
    
    [pool drain];
    return 0;
}

Und das sieht schon bedeutend besser aus.

  • Posted: 2008-10-25 07:42 (Updated: 2008-10-26 20:28)
  • Author: dwt
  • Categories: code
  • Comments (0)

Captcha again

Kongress zum bedingungslosen Grundeinkommen

C-Code für C und C++ verwendbar machen

Ich hab mich schon immer gefragt woher man eigentlich diese Defines nimmt um C-Code deklarationen so zu schützen, dass sie auch in C++ Code gut reingeholt werden können.

Ja klar, man kann das selber machen, etwas präprozessor bla und los gehts. Aber, das gibts ja vielleicht schon.

Enter #import <sys/cdefs.h>.

Und das ist in in Apple-Code praktischerweise immer schon includiert und enthält praktische Kleinigkeiten wie:

  • __BEGIN_DECLS - jetzt kommen C-Deklarationen
  • __END_DECLS - fettich
  • __dead2 - diese Funktion kehrt nicht zurück (über das 2 könnte ich mich total amüsieren)
  • __pure2 - diese Funktion hat keine Seiteneffekte
  • __unused
  • __printflike(formatArg, firstVarArg)
  • __scanflike(formatArg, firstVarArg)
  • __COPYRIGHT(string) - erzeugt eine globale variable
  • __PROJECT_VERSION(string) - erzeugt eine globale variable
  • __deprecated

Dann gibts natürlich noch <AvailabilityMacros.h> das auch noch ein paar Kleinigkeiten enthält - neben dem ganzen Zeug um APIs zu versionieren sind da auch noch mal Attribute definiert:

  • WEAK_IMPORT_ATTRIBUTE -- funktion ist vielleicht da
  • DEPRECATED_ATTRIBUTE -- funktion soll nicht mehr verwendet werden
  • UNAVAILABLE_ATTRIBUTE -- funktion ist nicht vorhanden (z.B. weil sie API ist die erst in einer späteren Version des Frameworks unterstützt wird)

Vor allem __BEGIN_DECLS, __END_DECLS und __deprecated werde ich mit Sicherheit sofort benutzen. Ob ich die anderen auch verwende, weiß ich noch nicht. Mal schaun. :)

Ich find User-Ideen großartig

Einfach mal kreativ mit der Techik umgehen. Mal probieren und testen und dann die Erfahrung austauschen.

http://failblog.files.wordpress.com/2008/09/fail-owned-yahoo-science-mirror-fail1.jpg ( via)

Unglaublich über sowas einfach herzuziehen.  Einfach die eingebaute Kamera als Spiegel verwenden. Zum Beispiel  damit.

If you want to count on it - pirate it

  • Posted: 2008-10-13 09:17 (Updated: 2008-10-13 09:18)
  • Author: dwt
  • Categories: fnord
  • Comments (0)

Das Gedicht zum Bankendomino

(via  Fefe, von  Brokerz)

Wenn die Börsenkurse fallen,
regt sich Kummer fast bei allen,
aber manche blühen auf:
Ihr Rezept heißt Leerverkauf.
Keck verhökern diese Knaben
Dinge, die sie gar nicht haben,
treten selbst den Absturz los,
den sie brauchen - echt famos!

Leichter noch bei solchen Taten
tun sie sich mit Derivaten:
Wenn Papier den Wert frisiert,
wird die Wirkung potenziert.

Wenn in Folge Banken krachen,
haben Sparer nichts zu lachen,
und die Hypothek aufs Haus
heißt, Bewohner müssen raus.

Trifft's hingegen große Banken,
kommt die ganze Welt ins Wanken -
auch die Spekulantenbrut
zittert jetzt um Hab und Gut!

Soll man das System gefährden?
Da muss eingeschritten werden:
Der Gewinn, der bleibt privat,
die Verluste kauft der Staat.

Dazu braucht der Staat Kredite,
und das bringt erneut Profite,
hat man doch in jenem Land
die Regierung in der Hand.

Für die Zechen dieser Frechen
hat der Kleine Mann zu blechen
und - das ist das Feine ja -
nicht nur in Amerika!

Und wenn Kurse wieder steigen,
fängt von vorne an der Reigen -
ist halt Umverteilung pur,
stets in eine Richtung nur.

Aber sollten sich die Massen
das mal nimmer bieten lassen,
ist der Ausweg längst bedacht:
Dann wird bisschen Krieg gemacht.

Regexe updated

Hab ich mir doch gedacht, nur matching von regexen auf ganzen Strings ist doch langweilig - also hab ich noch containsRegex: hinzugefügt um etwas mehr komfort zu haben.

Da dachte ich ja zuerst dass ein Regex wie dieser hier eigentlich nicht funktionieren dürfte: .*^a angewandt auf "aaa" - aber interessanterweise funktioniert das ohne Probleme. Muss ich wohl noch etwas an meinen Regex-Verständnis feilen.

Ah well.

Code hier

Wie kriegt man eigentlich mit was sich im Linux Kernel so tut?

Schließlich gibt es dort nicht so ausgezeichnete release notes wie man sie von  Eclipse,  Gnome oder  Ubuntu kennt.

Die Antwort ist überraschenderweise:  Heise lesen. Und sogar  optional auch auf englisch.

Cocoa hat ja Regex Support

Überraschend.

Das der so vollständig ist, hätte ich nicht erwartet. Aber in der Tat,  ICU-Regexe in ihrer ganzen Pracht. Völlig ohne eine neue externe Dependency.

Laut der Dokumentation sollte das sogar in 10.4 schon funktionieren - mit dem einen Caveat, dass multiline Support dort wohl von Hand eingeschaltet werden muss (via (?m))

Sowas wird da möglich:

if ([@"aaa" matchesRegex:@"a{3}"])
    NSLog(@"gotcha");

// other examples
[@"argh fnord argh" matchesRegex:@".*\\bfnord\\b.*"];
[@"aaa" matchesRegex:@"\\w{3}"];

Und das mit extrem wenig Aufwand:

@interface NSString (SimpleRegexMatching)
- (BOOL) matchesRegex:(NSString *)aRegex;
@end

@implementation NSString (SimpleRegexMatching)
- (BOOL) matchesRegex:(NSString *)aRegex;
{
    id predicate = [NSPredicate predicateWithFormat:@"self matches %@", aRegex];
    return [predicate evaluateWithObject:self];
}
@end

Ich bin beeindruckt.

Code hier

  • Posted: 2008-10-09 20:43 (Updated: 2008-10-12 14:16)
  • Author: dwt
  • Categories: code
  • Comments (0)

Die gegenwärtige Finanzkrise ist...

Darfs noch etwas mehr Atommüll sein?

Gerne auch Freihaus...

 Extra 3 hat es mal wieder genagelt.

:-)

Aus einem Variablen-Namen einen String machen

Braucht man manchmal für Bindings. Gleichzeitig will ich aber nicht überall die namen meiner Variablen als Strings hinterlegen - schon alleine damit ich beim Refactorn auch alle Namen erwische.

Also den Macro-Prozessor zur Rettung:

#define NSStringize(aVariableName) @#aVariableName
#
macht aus einer beliebigen expression einen String
@
und das @ davor macht aus einem constanten c-string einen ObjC-NSString.

Und das problem ist gelöst. :)

_HiStOrY_V2_

Mit ein bisschen Hilfe von meinen Freunden...

Heute hab ich mal wieder die aktuelle Version von  Bazaar (1.7.1) ausprobiert. Soweit ganz schnuckelig. Sogar der SVN Checkout von  Adium hat hervorragend geklappt.

Ich muss sagen, beeindruckend.

Nur mit dem Plugin  bzrtools hatte ich Schwierigkeiten, denn die darin enthaltene shell (ein geiles feature) zu benutzen brachte bzr reproduzierbar zum Absturz. :-(

Stellt sich mit hilfe von #bazaar und nach einigen Detours über den Python Debugger (nice!) und  dtruss (nice!) heraus dass es an der libreadline liegt.

Die hat sich nämlich geändert und erwartet inzwischen am Anfang eines History-Files als allererste Zeile diesen eintrag: _HiStOrY_V2_.

Na toll. Und ansonsten stürzt das Programm einfach ab. Also wer sich das ausgedacht hat, der gehört aber auch echt erschossen. Wenigstens die Fehlermeldung hätte vernünftig sein können. Grumpf.

Ausnahmen vs. Regeln in der Usability

Heute hatten wir wieder ein schönes Beispiel für Usability unter Windows. Zuerst das Setting. Eine Bekannte hatte auf einem USB-Stick Fotos mitgebracht und diese sollten auf einem Windows-Vista Notebook dann angeschaut werden.

Das ganze wäre dann fast daran gescheitert, dass auf dem USB-Stick ein Trojaner drauf war und sich Windows nach Entdeckung und Beseitigung des Virus (durch irgend ein Third-Party-Programm) standhaft geweigert hat den Stick im Explorer anzuzeigen. Je nachdem in welchem der USB-Stecker man den Stick einsteckte erkannte Windows nicht mal das überhaupt ein USB-Stick eingesteckt war. Aber ich lenke ab, denn das Problem konnte ich mit etwas Windows-Shell dann doch lösen.

Zum Thema: Nachdem der Ordner mit den Bildern im Explorer aufgemacht wurde, ging es nach einem Doppelklick auf das erste Bild los - der Bildbetrachter ging auf und die Slideshow ging los.

Und das ist das Thema: Unter Windows öffnet der Bildbetrachter Bilder anders als sonst Programme Dateien öffnen - implizit wird dort nämlich der ganze Ordner geöffnet, damit man leicht eine Slideshow mit den Bildern starten kann.

Und das hat doch immerhin so gut funktioniert, dass die Slideshows doch zusammen kamen.

Das bringt aber die Abstrakte Frage mit, was passiert wenn solche "Ausnahmen" immer mehr werden. Verstehen die Anwender dann trotzdem noch das allgemeine Prinzip was dahinter liegt? Sind sie in der Lage zu abstrahieren und das Verhalten an anderen Stellen vorherzusagen?

Ich sehe ein Problem darin, dass Computer für die meisten Menschen "magisch" sind - man lernt nur die magische Formel, die zu einem konkreten Ziel führt. Dass hinter den 30 Formeln die man mit der Zeit lernt ein Prinzip steht geht dann nur allzu oft verloren.

Zurück zum Beispiel: Am Mac ist es so, dass man, wenn man eine Datei öffnet, dann auch nur diese Datei aufgeht. Und das ist auch so wenn man ein Bild öffnet. Unter Windows ist das anders, denn man öffnet im Bildbetrachter (wehe wenn die Zuordnung verloren geht, weil man ein Bildbearbeitungsprogramm installiert hat) der von sich aus schon die nächsten Bilder kennt und es einem leicht macht eine Slideshow zu starten.

Was ist Besser? Im Beispiel waren relative Laien in der Lage eine Slideshow zu starten - das ist ein Plus. Hätten sie das auch auf einem Mac geschafft?

Wann ist es Besser so eine Ausnahme vom regulären Benutzungs-Konzept zu machen und wann nicht? Für mich ist die Grenze völlig unklar - nur dass es irgendwann den Punkt gibt, wo zu viele Ausnahmen selbst zum Problem werden.

Creating NSNumbers from arbitrary values...

... without needing to care which constructor to use this time to get it right.

Well, I was offended by this just long enough, so I sat down and wrote a macro that allows this:

//  Use like this:
    id dict = [NSDictionary dictionary];
    NSNumber *ten = NMMakeNumber(10.0f);
    [dict setObject:ten forKey:@"numberOfFingers"];
    [dict setObject:NMMakeNumber(23) forKey:@"fnord"];
    [dict setObject:NMMakeNumber(YES) forKey:@"wantFries"];

I'ts almost the way  Autoboxing works in  Java or C#.

This quite eases the pain of creating NSNumbers correctly for me, because it means I don't have to repeat the type of what I am working with quite as often.

Pretty  DRY. :)

Here's the code to a NSNumber category and a makro that makes this happen.

  • Posted: 2008-10-04 12:20 (Updated: 2008-10-07 10:07)
  • Author: dwt
  • Categories: code
  • Comments (0)

Wundervolle Werbung...

Wie definiert man "Glück haben"?

  • Posted: 2008-09-28 16:10 (Updated: 2008-09-28 16:12)
  • Author: dwt
  • Categories: funny
  • Comments (0)

Applicationen in den !AppStore zu kriegen...

... ist schwer.

Glücklicherweise  wurde der Prozess endlich offen gelegt!

Afro Samurai

Wunderschönes Comic - gezeichnet und gesprochen von Meistern.

Eine schräge Mischung aus japanischem Samurai-Gemetzel mit western Einflüssen plus Handies und Roboter...

 Muss man sehen.

( Mehr  Info)

Ein Tool sie zu finden und alle zu binden...

... auf die Shell zu ziehen und ins Highlighting zu ziehen. :) (Sorry, ich muss dringend mal wieder  Herr der Ringe anschauen)

Mir geht es um grep, der Urgroßvater aller Projektweiten Suchmöglichkeiten. Das kann viel - aber nicht alles.

Zum Beispiel ist es nicht besonders einfach in einem Projekt zu suchen dass SVN für die Versionskontrolle einsetzt. Grep besteht nämlich darauf dass es unbedingt bei -r auch in .svn Verzeichnissen suchen will. Und das beste: es gibt zwar eine Option --exclude - die funktioniert aber nur auf File-Basis. Das heißt man kann damit keine Verzeichnisse (wie z.B. .svn) ausschließen.

Doh.

Die Entwickler sagen dazu dass man doch lieber find . mumbojumbomagic | grep muster benutzen soll. Tja.

Enter  Ack. Die Lösung aller Probleme. :)

  • Das Tool sucht standardmäßig rekursiv - d.h. man muss nicht ständig -r angeben.
  • Es ignoriert standardmäßig .svn .hg .git etc. Verzeichnisse - daher muss man nicht ständig irrelevante Resultate ignorieren.
  • Man kann mit switches wie --python oder --objc nur in Dateien dieses Typs suchen.
  • Man hat vollständige Unterstützung für Perls Regular Expressions auf der Kommandozeile (das Tool ist in Perl geschrieben)
  • Man kann das Tool supereinfach in ~/.ackrc konfigurieren.

Hier meine .ackrc:

$ cat ~./ackrc
--type-set=nib=.nib
--type-add=objc=.mm
--ignore-dir=build

Schick ne?

 Hier zu finden.

2008/09/13/13.40

Flüssigkeit != Flüssig

Was ich als Spaß alles verpasst habe, weil ich  sowas  noch  nicht gesehen habe.

Damit ist sogar endlich geklärt wie es  Jesus geschafft hat über das Wasser zu gehen.

:-)

Ach ja,  die Erklärung (Wikipedia) und  mehr details (Wikipedia) und  eine Anleitung zum Selber herstellen.

Have phun!

Sicherheit und Parkhäuser

Heute hatte ich das witzige Erlebnis dass wir in ein Parkhaus gefahren sind - und einfach keinen Parkplatz gefunden haben.

Ok, soweit wars noch nicht spannend - aber was ich hoch-interessant fand, ist dass wir dann beim Rausfahren nicht zur Kasse gebeten wurden. Das macht Sinn, denn wer keinen Parkplatz findet, ist natürlich Dreifach angepisst wenn er dann dafür auch noch Zahlen muss. (Und vielleicht während dessen auch noch den Ausgang versperrt.. :)

Ich halte es für sehr wahrscheinlich, dass jedes Parkhaus so funktioniert. Cool. Denn das bedeutet, dass man prinzipiell jedes Parkhaus umsonst benutzen kann - man muss sich nur unmittelbar vor dem herausfahren eine neue Marke besorgen.

:)

(Ok, das mag nicht soo leicht sein, aber im Prinzip...)

2008/09/05/19.08

Python != Funktionales Programmieren

--- zumindest scheint es so.

Das hier zum Beispiel:

#!/usr/bin/env python
# encoding: utf-8

def counter_generator():
    current_value = 0
    def counter():
        current_value += 1
        return current_value
    return counter

import unittest
class ClosureTest(unittest.TestCase):
    def test_counter(self):
        self.assertEquals(1, counter_generator()())

if __name__ == '__main__':
    unittest.main()

Wenn man das ausführt dann kriegt man den wenig aussagekräftigen Fehler UnboundLocalError: local variable 'current_value' referenced before assignment. Oder mit anderen Worten: "Wiebidde?"

Kommentiert man current_value += 1 aus, funktioniert das ganze (ok, bis auf den dann fehlschlagenden Testcase).

Immerhin kommt man dem Problem dann auf die Spur (ich und Felix haben das leider erst herausgefunden nachdem wir auf #python nachgefragt haben...) Python kann nämlich seine Scopes nicht vernünftig. Das heißt, man kriegt keinen schreibenden Zugriff auf die Variablen eine Funktion weiter draußen - nur lesend. Nur dass die Fehlermeldung natürlich total mist ist.

Grah.

Interessanterweise geht diese Lösung auch nicht

#!/usr/bin/env python
# encoding: utf-8

def counter_generator():
    workaround = object()
    workaround.current_value = 0
    def counter():
        workaround.current_value += 1
        return workaround.current_value
    return counter

import unittest
class ClosureTest(unittest.TestCase):
    def test_counter(self):
        self.assertEquals(1, counter_generator()())

if __name__ == '__main__':
    unittest.main()

Für hinweise wieso bin ich dankbar.

Vielleicht kriegt Python dass ja irgendwann mal hin. In der Zwischenzeit hilft dieser Workaround:

#!/usr/bin/env python
# encoding: utf-8

class AttributableDict(dict):
    def __getattr__(self, attribute_name):
        return self[attribute_name]
    def __setattr__(self, attribute_name, value):
        self[attribute_name] = value

def counter_generator():
    workaround = AttributableDict()
    workaround.current_value = 0
    def counter():
        workaround.current_value += 1
        return workaround.current_value
    return counter

import unittest
class ClosureTest(unittest.TestCase):
    def test_counter(self):
        self.assertEquals(1, counter_generator()())

if __name__ == '__main__':
    unittest.main()
  • Posted: 2008-09-05 19:14 (Updated: 2008-09-05 19:14)
  • Author: dwt
  • Categories: fnord code
  • Comments (0)

UI Schlendrian bei Apple iCal

iCal - ein Programm das man lieben und hassen kann.

Einerseits, es funktioniert gut, ist ordentlich ins System integriert - aber andererseits sowas:

Wenn man einen Termin bearbeitet, dann doppelklickt man ihn. Danach öffnet sich dieser in einem neuen Fenster, in dem man dann noch einmal auf Bearbeiten klicken muss damit man ihn tatsächlich verändern kann.

Das tolle daran: Wenn man dann irgendwann mit seinen Änderungen zufrieden ist und ihn bestätigen möchte, dann stellt man fest das der "Bestätigen" Knopf auf keinen sinnvollen Keyboard Shortcut reagiert. Enter, Return, Controll-Return, Command-Return, Alt-Return - alles voll daneben.

Bisher dachte ich nur: "Naja, voll nervig" aber heute ist mir aufgefallen dass sie es sogar geschafft haben dem noch die Spitze aufzusetzen: Es gibt nämlich doch eine Tastenkombination um die gemachten Änderungen zu akzeptieren:

ESCAPE

!!!!1111!!!!(elf)!!!

Ich bin Sprachlos.

Authenticating an OTR user in Adium

(With many thanks to Dan Levin for his help)

This is what I arrived at last week as an authentication GUI:

This GUI Design has several good and bad points - first the good ones:

  • It tells the user exactly what he should do
  • It gives help in how to achieve that
  • It provides additional help on how to achieve this

The bad ones though weigh very heavy:

  • Its a dialog.
  • Its super text heavy
  • it looks ugly (well not because of the design, but because it has so much text in it.)

The most pressing problem however is in the library support from OTR. It simply does not know what a question is.

This is a problem, because it makes it almost impossible to have the Question as a special entitiy in the GUI - and also that none of the synchronisation problems that this brings are adressed in the GUI. So what to do if both users start typing their own question? The other User wouldn't know - then how does the programm tell the user that his question was just overruled be the other persons and that he should provide the answer to that as the secret word?

There is more of course - but this is what I consider the most important.

Well, this is our current approach at solving these problems:

This is what I like about this:

  • No more dialog, it's all happening inline
  • It clearly states what goes where in clear statements
  • It tells the user in clear terms what he needs to do and how to do it
  • Only as much text as is absolutely needed
  • Provides more help should the user request it.

Especially this is the most simple GUI of all the approaches that I tried.

I don't have finished mockups of the other aproaches (most is pen'n'paper work) but I did try having the question and answer thing inline like so:

I especially like the fact that this gives lots of practical information to the user - even if it is still very wordy and does not solve the race condition of who will actually ask the question.

Therefore we decided to go with the first aproach pictured above.

There is of course more to this GUI than just the pretty pictures shown above. A few more things come to mind, that we think are very important:

  • The normal chat window can and should be used as a feedback and instruction window. (With help messages clearly marked as such of course.) We want to use this to show some initial help when the "Verify" button is clicked and the authentication process is started and also at least when the authentication process fails multiple times, to provide additional help and tips as to how to overcome this situation.
  • Whenever the user types the secret word in the normal chat we want to either clearly notify the user that he has just compromised his password exchange and needs to choose a new question and answer (also if it is in the recent history) or we'd like to prevent the sending of the message (perhaps with a dialog box that also allows to proceed if that is really wanted).

One unsolved problem is, that when the authentication fails multiple times, we need to find a good compromise between teaching the user about ways to prevent errors and making him aware of the possibility that there may be a man in the middle attack taking place.

Of course, just as the last time: Feedback welcome.

 Here's the rest of the work

  • Posted: 2008-09-03 17:50 (Updated: 2009-10-24 15:55)
  • Author: dwt
  • Categories: code
  • Comments (0)

Schadenfreude ist..

 ... die schönste freude.

Stimmt einfach. :)

Wo ich gerade am lästern bin

Apple hat sich da ja einen richtigen Kracher geleistet mit ihrem  App-Store. Vor allem ist das Update-System absolut grandios gelöst.

Man geht einfach im iPhone auf den App-Store, dort in den Updates-Reiter und.... sieht nichts. Weil, da sind zwar die Updates. Aber eben nicht alle.

Ein Programm das ich mir gekauft hatte ( Things, weil die UI einfach sehr, sehr gut ist) tauchte dort nämlich nicht auf - obwohl ich es sehnsüchtig erwartete. Und das, obwohl der iTunes Store das Programm schon längst als upgedatet aufgelistet hat.

Tja, was tun? Letztlich habe ich mich dann dafür entschieden, dass ich für 8 € auch das Programm einfach noch einmal herunterladen kann. Wenigstens kann ich dann die neue Version nutzen. Und kann so mal Probieren ob der App-Store nicht vielleicht einen Bug hat und mir den Preis nur fälschlicherweise anzeigt.

Gesagt getan - da kommt dann erst eine Warnung dass der Betrag jetzt direkt von meiner Kreditkarte abgezogen wird (gut, Kreditkarte hab ich nicht, aber das ist halt ne Amerikanische Firma) und dann... dann kommt der Dialog der mir erklärt das ich das Produkt ja schon gekauft hätte und das Update daher kostenlos sei.

Pfffff. Wenn ich ein Update lade, dann will ich vorher wissen ob mich das Geld kostet! Vorher, nicht hinterher. Vielleicht.

Ganz große Klasse.

Kryptographie saugt

Und zwar gewaltig.

Heute hab ich eine Menge Zeit darauf verbrannt unserem Online-Update-System auf den Zahn zu fühlen. Das arbeitet nämlich ganz hervorragend mit  Sparkle um für unsere Applikation via  Appcast herunter zu laden, wenn eine neue Version ansteht. Und damit das auch schön sicher ist, nutzen wir ein kleines öffentlich/privates Schlüsselpärchen um das abzusichern.

Nun ja, bis heute mittag - da hat es nämlich auf einmal aufgehört und konnte die heruntergeladenen Dateien nicht mehr validieren.

Jetzt hatte ich natürlich das Problem, das ich an sich recht wenig von Crypto verstehe und erst recht wie man das von der shell aus einsetzt. Das wiederum hatte zur Folge, dass ich das nicht sofort auf der Shell nachvollziehen konnte und wir schon anfingen zu fürchten das vielleicht unsere Schlüssel abgelaufen sind.

Gott sei dank war es aber doch was anderes - denn unser Proxy hatte fieser weise einfach eine alte Version des Appcasts gespeichert und stattdessen immer die ausgeliefert - was natürlich nicht funktionierte... Grumpf.

Note to self: Nächstes mal gleich den ganzen Vorgang von Hand reproduzieren um zu sehen wo es schief läuft - und zwar angefangen von da wo das Programm anfängt. (Auch wenn in diesem Fall die Fehlermeldung wirklich eher auf einen OpenSSL Fehler hindeutete).

Debuggen ist eben schwieriger als den Code zu schreiben. Ich vermute, weil man ihn dafür wirklich verstehen muss - inklusive aller Fehler die man in seinem eigenen Verständnis hat.

P.S.: So Signiert und Validiert man ein File mit OpenSSL von der Kommandozeile:

# base 64 encoding to ease textual transmission
openssl dgst -dss1 -sign dsa_private_key.pem Important.rtf | openssl enc -base64 > signature.sig
# and decode again
openssl enc -base64 -d < signature.sig > decoded.signature.sig
# and verify
openssl dgst -dss1 -verify dsa_public_key.pem -signature decoded.signature.sig Important.rtf

Einige Fallstricke: -dss1 und -sha1 erzeugen offenbar die gleichen Checksummen (man könnte also meinen das es der gleiche Algorithmus ist) die beiden digest modi werden aber in openssl offenbar unterschiedlich behandelt. Beim Signieren löst das verwenden von -sha1 auch schön eine Fehlermeldung aus - wenn man beim Überprüfen aber -sha1 zu verwenden versucht, dann erhält man nur den Hinweis dass die Verifikation gescheitert ist - an einem falschen public key. Seeehr hilfreich liebe Entwickler.

Wie man ein Schlüsselpaar erzeugt und vieles mehr  gibts hier.

  • Posted: 2008-09-01 21:44 (Updated: 2008-09-01 21:48)
  • Author: dwt
  • Categories: fnord code
  • Comments (0)

Kontrollieren welche Libraries ein Programm lädt

ist beim Entwickeln ein echtes Problem.

Frameworks unter Mac OS X werden schließlich so gelinkt, das jeder Framework den Pfad enthält, an dem er später einmal leben wird - und dieser Pfad wird dann in die Applikation eingetragen die ihn laden möchte.

Das ist blöd, wenn man Frameworks in /Library/Frameworks/ installiert, bei der Entwicklung dann aber mal eine andere Version ausprobieren will oder muss. Auch klassisch ist, dass ein Framework der von Apple kommt zu alt ist und man sicherstellen muss, das ein eigener Framework stattdessen verwendet wird, der Bugfixes enthält.

Schwierig.

Nunja, man macht das unter OS X mit dem Äquivalent des Linux Konstrukts LD_LIBRARY_PATH, also diversen Umgebungsvariablen, mit denen man das Verhalten des dynamischen linkers beeinflussen kann. Spaßigerweise hat Apple das verhalten des dynamischen Linkers unter Tiger (10.4) verändert, dass er sich jetzt genauso verhält wie unter Leopard (10.5) - zumindest sagt mein Gedächtnis andere Dinge als die 10.4 manpage von dyld.

Also sind jetzt eigentlich nur noch zwei Umgebungsvariablen interessant:

  • DYLD_FRAMEWORK_PATH wenn man etwas laden will, bevor die Pfade verwendet werden die in der Applikation für einen Framework stehen -> also um einen Framework zu überschreiben.
  • DYLD_FALLBACK_FRAMEWORK_PATH wenn man etwas nachladen will, nachdem es an den vorgegebenen Pfaden nicht gefunden wurde. Die Manpage ist mir da noch nicht 100% klar - es wirkt fast so, als könnte man dyld auch dafür verwenden eine neuere Version anzugeben, die nur genutzt wird, wenn in der alten ein bestimmtes Symbol nicht gefunden wurde - das konnte ich aber noch nicht testen (und kommt mir auch komisch vor).

Also: kennen sollte man die - das gibt viel flexibilität.

Obfuscated Objc - oder - wie macht man Konstanten?

Ist ja eigentlich nicht schwer, man braucht lediglich eine Definition wie diese

#define kIOHIDVendorIDKey @"VendorID"
const NSString *windowName = @"Morgens"

Einziges Problem - immer wieder hat man vom System konstante C-Strings, die man aber als Objc-Strings benötigt.

Interessanterweise hat der Compiler überhaupt kein Problem das hier zu machen:

#define kIOHIDVendorIDKey "VendorID"
// ...
[matchingDict setValue:[NSNumber numberWithInt:entry->Vendor_ID] 
       forKey: @kIOHIDVendorIDKey]; 

// same, but more readable than
[matchingDict setValue:[NSNumber numberWithInt:entry->Vendor_ID] 
       forKey: [NSString stringWithCString:kIOHIDVendorIDKey]];
// Also note that -stringWithCString is deprecated

Oder mit anderen Worten man kann problemlos aus jeder C-String-Konstante eine Objc-String-Konstante machen, indem man einfach ein @ davor schreibt.

Neat.

Debugging Magic in Cococa

Erstaunlich aber wahr - viele Programmierer scheinen die Debugging-Möglichkeiten der Plattform ihrer Wahl nicht zu kennen.

Cocoa zum Beispiel. Viele Programmierer wissen nicht wie man Speicherlöcher effektiv fängt.

Well, nicht Leaks - da kann man ja mit  ObjectAlloc draufhauen und dann das Programm fixen.

Nein, viel problematischer als das sind die doppelten Befreiungen.

id foo = [[NSString alloc] initWithFormat:@"foo"];
[foo release];
// do something else
NSLog(@"foo is %d", [foo length]); // almost certainly bombs

Die krachen nämlich fast immer - und dann sucht man sich tot was genau da eigentlich gekracht hat und woher das genau kommt. Tja.

Dabei kriegt man aus dem Programm eigentlich alle Informationen heraus die man braucht. Man muss nur jedes malloc mitzählen und aufschreiben wo es passiert ist, dann jedes objekt das freigegeben wird, nicht wirklich freigeben, sondern lediglich markieren und dann bei einem weiteren Zugriff auf so ein Objekt eine Exception werfen.

Nichts leichter als das. :)

Man setze diese Environment Variablen (am besten auf einem Duplikat der zu entwanzenden Applikation in Xcode)

MallocStackLogging YES
MallocStackLoggingNoCompact YES
NSZombieEnabled YES
NSDebugEnabled YES

Hat man dass macht die Runtime alles richtig. Jede allokation wird aufgezeichnet und jedes freigegebene Objekt durch einen Zombie ersetzt. Und der Meldet sich, sobald er für irgend etwas verwendet wird. Nämlich so:

2008-08-26 00:19:43.524 CrashTest[1663:817] *** -[CFString length]:
 	message sent to deallocated instance 0x105440

Hängt man dann im Debugger, kann man von dort aus direkt diese Information abgreifen.

(gdb) shell malloc_history 1663 0x105440

Call [2] [arg=16]: thread_a00ddfa0 |start | main | -[NSString initWithFormat:] |
 -[NSPlaceholderString initWithFormat:locale:arguments:] |
 _CFStringCreateWithFormatAndArgumentsAux | CFStringCreateCopy |
 __CFStringCreateImmutableFunnel3 | _CFRuntimeCreateInstance | malloc_zone_malloc 

Die Syntax für malloc_history ist dabei malloc_history pid address.

Jetzt weiß man mit was für einem Objekt man es zu tun hat und man weiß wo es her kommt.

Nice! (Mehr unter  Mac OS X Debugging Magic)

p.s.: Ohne etwas Schelte an Apple geht es aber nicht. Das man sich da von Hand die Umgebungsvariablen einstellen muss - böse. Zumal das noch an einer Custom Executable geschieht. Die sind nämlich nicht im Projektfile gespeichert, sondern in den Dateien die Xcode pro Benutzer anlegt. Das hat zur Folge, dass im Normalfall nicht ein Entwickler diese Dinge raussucht und dann alle anderen im Projekt dass als Tool nutzen können, sondern dass sich das jeder Selber einrichten und warten muss. Ach ja, und natürlich zeichnet malloc_history nur die allocs auf und nicht die frees - das wäre nämlich noch praktischer, dann könnte man nämlich direkt kucken wo es das erste mal freigegeben wurde. Aber nein....

NSToolbarItem whoes

Kleines Detail, dass man wissen sollte.

NSToolbarItems sind etwas völlig anderes als normale Controls. Sie sind nämlich keine. Sondern sie enthalten höchstens welche - aber nur als View. Das heißt, wenn eine Toolbar z.b. auf "nur Text" geschaltet ist, dann hat das Item überhaupt kein wissen darüber was in dem NSView eigentlich passiert - und daher versucht es auch überhaupt nicht etwas sinniges zu tun.

Unter Tiger zumindest. Da wird zwar alles schön angezeigt - aber machen tut das dann alles nix mehr. Unter Leopard ist es immerhin so, dass auf einen Klick die Toolbar wieder mit Bild angezeigt wird.

Tja und Lösen muss man das ganze dann so, dass man verstehen muss, das NSToolbarItems für die nur Text Darstellung ein NSMenuItem verwenden, dass man selbst anpassen muss. Steht nur in der Dokumentation lediglich als mini Absatz ohne Erklärung wieso man das braucht.

Hrmpf. Naja. Immerhin macht es Sinn wenn man versteht was sie als Design gewählt haben.

Aber wieso sie sich für dieses Design entschieden haben, verstehe ich absolut nicht. Sie hätten ja auch gleich ein NSControll als content nehmen können - und wenn das ein Target und eine Action hat dann einfach die wiederverwenden...

Aber neee....

  • Posted: 2008-08-21 20:20 (Updated: 2008-08-25 23:45)
  • Author: dwt
  • Categories: fnord code
  • Comments (0)

Usability und Programmierer

Ich habe ja schon lange den Verdacht, dass das allgemeine Vorurteil das Programmierer schlechte GUI-Designer sind vielleicht nicht ganz korrekt ist.

Jetzt habe ich endlich den Beweis: Gutes GUI Design ist wie gutes API-Design - die allermeisten leute können es nicht.

 Das hier zum Beispiel  gethostbyname() ist teil der libc und gibt einem zu einem Hostnamen die Daten aus einem DNS-Lookup zurück.

Well.

Nur das wir jetzt eben mal zwei Tage darauf verbrannt haben herauszufinden, dass dieses gethostbyname so dämlich ist, dass es niemals nicht von sich aus checkt ob sich vielleicht seit das Programm gestartet wurde, die Netzwerkeinstellungen irgendwie verändert haben könnten. Egal wie lange das Programm schon läuft...

Groooßartig.

Dafür muss man nämlich die Funktion  res_init() aufrufen. Ach ja, und wann man das tut rät man einfach. Weil einen Callback gibts dafür natürlich nicht. Ach ja, und in der Manpage von gethostbyname steht natürlich auch nix über res_init.

Gnah.

Das ist für mich ein Musterbeispiel für eine verkackte API - eine API deren Benutzerfreundlichkeit gegen null geht.

Ergo: Programmierer können Benutzeroberflächen machen - aber die meisten eben nicht. Und das müssen wir alle dann wieder an den APIs erleiden die sie designen.

Hab ich schon mal erwähnt das ich die libc immer weniger mag?

Adium + OTR

So I want to be able to chat to my buddies in private. This is still very hard - one has to have all sorts of knowledge about encryption to get it right and even then the process is painful and hard to get right. Well, it's time to do something about it.  Adium has supported  OTR for some time now, and OTR recently gained the ability to use the  Socialist Millionaire Protocol as a means for authenticating chat partners to each other. The problem is, It's just not yet implemented in Adium.

We'd like to change that.

(Disclaimer: Imagine in long and fearful words me saying that this is not final and is just part of my thinking process and stuff I want to get feedback on) The obvious first thing to do is to think about the GUI and what I want to achieve there. Adium is quite good, in that it's reasonably easy to set it up so that as much as possible is encrypted, or to start encryption by just a single mouse click. The most pressing problem lies in that it's very hard to verify that a buddy really is who he claims to be. This is because both users have to read and confirm a 20-something digit fingerprint to each other out of the band of im communication (preferably over the phone or in person).

The Socialist Millionaire Protocol offers an alluring alternative - in theory, authentication is now as simple as you asking your partner a question that only he can answer correctly. If he provides the correct answer, dual-sided, authenticated encryption can be established. However, as shown in a  usability study on the Pidgin implementation of OTR bad GUI-Design can still ruin this great idea.

So lets get think about how we can make this work as seamlessly as possible.

Here's the example user that guides my thinking: Andrea, a history student wants to chat with her buddy Bert. She has no deeper understanding of computer science and cryptography, nor is she especially computer savvy. Even so she should be able to effectively secure her privacy with a few clicks and without any studying of handbooks or confusion on her part.

Two parts are needed for this to work:

1) Adium needs to inform her of the 'security status' of her connection without any doubt. This includes that it needs to show her in unambigous ways what she has to do next if she wants to get to a secure chat-connection. 2) Adium needs to allow her to run the Social Millionaire Protocol.

For 1) I have some nice ideas already. (linked to at the end of the article. For 2) I'm still not very far. The obvious way would be to just open another window - but thats merely ok GUI-Design as it completely disrupts whatever the user wanted to do. Another alternative could be to do it inline in the chat window - but this leads to all sorts of confusion, as the chat window suddenly becomes the interface to something completely different than chatting - something which it wasn't meant to do.

So, more drawing board needed there.

On to some mockups. :)

It's all basically the same idea. There are two ways that I see this working: either by showing the status of the chat inline in the message view - or not.

Inline has several advantages - for one, it's a lot easier to program. However, it has severe usability disadvantages. It is hard to see for example, because the font is small and who reads those system messages anyway? Also running the Socialist Millionaire Protocol requires an action by the user, so that leaves me with either adding a hyperlink to the message field to start this (which is unexpected by the user) or just explaining him what to do (which is bad, if I have to explain to him, why not just let him do it from right there?)

So I discarded that idea.

What I really like is Firefox in this regard. Their way of showing that they just suppressed a popup or a cookie is just a perfect example of the kind of interface I have in mind. Easy to see, enough space to put a button and a nice way to tell the user some status that doesn't disturb his workflow if he doesn't bother / can't do anything about it right now.

So I have something like this in mind:

This fits my requirements pretty good (more Ideas I toyed with at the end of the article). It clearly states what is happening, and gives the user an immediate means to do something about it. No confusion possible.

Well, to be frank, wording is still a problem. "Verify his identity" is very long, and will be much longer in german. Same for the first sentence. Some users may also react with a heartfelt: "Now you tell me, when I tried to turn encryption on?". Also what if the user just doesn't care?

Well, I'l ponder that some more.

Next stop: Actually doing the Socialist Millionaire Protocol.

After the user clicks the darned button, there be dragons. As I said above, I briefly toyed with the idea of doing everything inline the message view, however decided against that. My current working thesis is this:

This dialog has some merits: It clearly states what the user is supposed to do. It gives hints on how to do it and what to avoid, and it is mostly text.

Well.... I'm not very content with it yet. Also I haven't had a good look at how  Pidgin actually implements this feature (I wanted to build my own ideas unobstructed first).

Well, onto that later.

Here's the rest of my WIPs:

Note the lock in the menu-bar that also tells me the status of the conversation is private (to make the easy to miss lock in the toolbar more prominent.

I toyed with placing more locks, here's some results:

Just repeating something that doesn't work seems, to force it to work seems foolish though, so I thought about more radical approaches, of which I like this the most:

The problem is to communicate to the user that he is in a completely different status now, and make it accessible at a glance. Well, why dont just change the background color? Again Firefox is an example here, when surfing to a secure site, the status bar is rendered completely different to give the user good feedback. Why not apply that to Adium?

Oh and the inline SMP implementation:

Well.... It could be made to work... from a technological standpoint. :) Maybe it sparks some new ideas.

Want to read more?

  • Posted: 2008-08-19 21:25 (Updated: 2009-10-24 15:57)
  • Author: dwt
  • Categories: code links
  • Comments (0)

Was steht eigentlich in der EU-Verfassung?

Ehrlich, wer weiss das?

 Er hier weiss als Kritiker dazu viel.

Persönlich finde ich ihn reichlich unerträglich, inhaltlich ist er aber hochspannend.

Zum Beispiel wusste ich nicht das man aus der Europäischen Union so ohne weiteres austreten kann. Als einzelnes Land.

Er, dass ist  Prof. Dr. Karl Albrecht Schachtschneider der schon einige Verfassungsbeschwerden (davon einige Erfolgreich) hinter sich gebracht hat.

Also absolut zuhörenswert.

Bei Vorträgen über das Programmieren...

... stellt sich immer wieder die Frage schöne relevante Zitate einzuflechten.

 Well, diese wunderschöne Sammlung macht mir das beim nächsten mal sicher einfacher.

:)

Unsere neutrale und gute Presse

Seit ein paar Jahren muss ich mich mühsam mit dem Gedanken anfreunden, dass unsere Presse vielleicht doch nicht das gelbe vom Ei ist.

Well, aus persönlicher Erfahrung wird man klüger.  Spannend finde ich, das inzwischen auch immer mehr Journalisten dieses Problem einsehen und durchaus auch selbstkritisch sein können.

Besonders spannend finde ich die Beschreibung der Journalistentätigkeit in fremden Ländern. Man fliegt hin, und hat dort am Ziel zwei Menschen die einem Helfen. Ein Übersetzer und ein Fixer. Der letzte ist spannend - denn das ist der, der dem Journalisten die leute vermittelt, die in extrem kurzer Zeit das sagen können, was er hören will.

Wunderschöne Objektivität.

Mehr davon.

(via  fefe)

Template engines in Python

Sind fast alle XML-Basiert, oder haben eine hässliche special case Syntax.

Well, zumindest finde ich das.

Jetzt bin ich über  Jinja gestolpert und war auf den ersten Eindruck erst mal ganz überrascht. Übersichtliche Syntax, kein xml Zwang, und template inheritance.

Muss ich mal genauer anschauen. Immerhin finde ich Xpath wie es in Genshi implementiert ist auch reichlich nice - damit kann man sich wunderschön in bestehende Templates reinhacken - auch wenn die gar nicht dafür gemacht sind wiederverwendet zu werden.

Das ist natürlich gut und schlecht zugleich, daher bin ich mir nicht sicher dass das die beste aller Ideen ist. Also mal schaun.

Falls ich mal wieder Argumente für eine Killerspiele-Debatte brauche...

 ...kann ich ja hier nochmal nachschlagen.

An manchen Stellen noch nicht so stark wie sie sein könnte - aber ansonsten sehr ordentlich.

Wer die Olympia Start-Zeremonie

wie ich auch verpasst hat...

 Kann sie sich ja hier anschauen. :)

Beweismaschine

Open Street Map rules

hard.

Jetzt auch mit  deutscher Homepage. ( Überhaupt ist in Deutschland Kartenmäßig ziemlich was los.)

So cool was man mit den Daten alles anfangen kann und was leute tatsächlich damit tun!

Da wäre zum Beispiel

Absolut cool.

Ich hätte wirklich gerne einen Client für das iPhone... nicht nur zur Anzeige, sondern direkt zum ändern und aufzeichnen. Boah wär das geil.

Leider ist Open Source auf dem iPhone  ein echtes Problem.

  • Posted: 2008-08-08 22:13 (Updated: 2008-08-08 22:40)
  • Author: dwt
  • Categories: links
  • Comments (0)

Doufu Mapo...

... ist super lecker. Haben wir gerade grob nach  einem Rezept auf Chefkoch gemacht.

MJAM.

Ach ja, wir haben die Pilze weggelassen, dafür doppelt so viel Fleisch.

Scrumtisch ist rum

.. und ich hab sogar meine  Notizen dort veröffentlicht.

:) Yay!

bzr vs. hg vs. git

Ich fang ja nur langsam an zu verstehen wie sich die verschiedenen Konstrukte unterscheiden.

Da wäre zum Beispiel das immer wieder auftretende Problem das man an Sourcen arbeitet, auf die man nicht comiten kann oder will.

Also zum Beispiel an Bugfixes für ein Projekt, von dem man zwar die Sourcen hat, das aber dooferweise einer Firma gehört die keine comits zulässt. Ah well.

In  Git löst man das, indem man das einfach brancht und bei einem neuen Release mit rebase seine Changes auf die neue Plattform hebt.  Mercurial und  Bazaar lösen das anders, dort gibt es spezielle Plugins  Mercurial Patch-Queues und  Bazaar Looms die ein  Quilt ähnliches Interface bieten um das Problem zu lösen.

Tja, was macht den Unterschied aus?

Eine Sache die mir allmählich aufgeht ist das Teilen dieser Änderungen. Macht man einen Branch und rebased dann immer wieder auf die originalen Sourcen. Das ist super, weil es kein neues Konzept braucht und somit relativ simpel. Aber man kann diesen Branch so gut wie nicht mit anderen leuten Teilen - schließlich verändert man ständig die History. Also doof für die Zusammenarbeit an so einem branch.

Mercurial Patch-Queues sind da besser geeignet - mit dem unterschied das sie extra sind und nicht versioniert werden. Damit kann man sie aber auch nicht teilen.... :) - Das wiederum lässt sich hacken, indem man einfach in dem repository in dem ordner in dem die patch-queue liegt wiederum ein eigenes hg-repository eröffnet. Ein Hack - aber er löst das Problem auf elegante Art und Weise.

Bazaar scheint das mit dem looms am besten gelöst zu haben - die lassen sich nämlich ganz normal im repository pushen - sind aber eben nicht teil der history und führen daher nicht zu den üblen merge-conflikten die man in git erhält.

Auf mich wirkt das so, als zeigen sich die verschiedenen Ideologien der Entwicklungsteams in diesen Entscheidungen: GIT:: KISS - kein neues Konzept (Quilt) ohne das es absolut sein muss, gleichzeitig aber die Linux-Poweruser Mentalität: Wenn du deine History-Verändern willst, dann mach doch, wirst schon wissen was du willst. HG:: Gutes Design, history verändern ist evil - daher musste es was anderes sein. Gleichzeitig ist man aber so stolz auf die Binary- und Wire-Formate, dass man sie nicht verändern darf - daher bleibt die Information aus dem Repository ausgeschlossen. BZR:: Hier wird vor allem auf die Qualität der Code-Basis geachtet, Veränderbarkeit, Usability und schöne API sind dort am wichtigsten - daher ist es überhaupt kein Problem, das die looms natürlich im repository und damit push-bar sind.

Mir ist unklar wie ich das gegeneinander abwägen kann - jede der Mentalitäten hat ihre eigenen Vor- und Nachteile. Zum Beispiel ist mir BZR immer noch zu Langsam um es im täglichen gebrauch einzusetzen - es macht schlicht keinen Spaß.

Andererseits erinnert es mich stark an das alte Mantra: "First make it work, then make it fast!". Also vielleicht wird es doch noch?

p.s.: Ich weiß natürlich das es  Stacked-GIT gibt - aber soweit ich das feststellen konnte, ist das nicht der "recommended way of doing things" in der GIT community.

  • Posted: 2008-08-02 17:51 (Updated: 2008-08-02 17:53)
  • Author: dwt
  • Categories: code links
  • Comments (0)

Origami ist cool

".. it may even someday save your life."

 Hier kucken. (Ted-Vortrag)

Obama war doch in Berlin..

..und hat da gesprochen.

Ganz hervorragend dazu  der Kommentar von Jon Stewart

I think, the america flags are broken… they're not on fire […] You know, […] there's something about a charismatic leader, rallying huge crowds of Germans in a large public square…

*rofl*

Where the hell is Matt?

Zuverlässiger Spamschutz

kann so einfach sein.

Man muss einfach nur ein Captcha einbauen, dass "zuverlässig" zwischen Mensch und Maschine unterscheidet.

Well, zuverlässig.

Ich jedenfalls fühle mich jetzt offiziell zur Maschine geadelt, denn  bei diesem Captcha bin ich einfach nicht weitergekommen. (Man muss noch sein Alter bestätigen, damit man das Captcha sieht.)

Doh.

Wie lernt man am besten Programmieren?

Hab ich mal für Python gegoogelt.

Und bin erstaunlicherweise auf eine extrem coole idee gestoßen:

Einfach indem man dem Lernenden Rätsel aufgibt, die ihn stück für stück an neue Konzepte aus der Python Standardbibliothek heran bringen.

Definitiv die beste Idee für Übungsaufgaben die ich bisher gesehen habe - und wunderschön über eine Webseite machbar.

 Hier gibts die Rätsel

By the way:  Auf dieses Coole Programm zum Python lernen bin auch auch gestoßen Einfach ein Webbrowser mit einem Manual links, und rechts ein Terminal um das alles auszuprobieren.

Nice!

One does not walk into Mortor!

  • Posted: 2008-07-27 09:40 (Updated: 2008-07-28 09:54)
  • Author: dwt
  • Categories: links
  • Comments (0)

DVCS verglichen

Endlich mal ein guter ausgeglichener Vergleich zwischen den drei großen verteilten Versionskontrollsystemen.

 Lest solange er aktuell ist!

  • Posted: 2008-07-27 07:30 (Updated: 2008-07-28 09:54)
  • Author: dwt
  • Categories: links
  • Comments (0)

Drogen und andere dinge die man mit python machen kann

 NodeBox ein tool mit dem man in Python die Mac OS X Graphik-Bibliotheken ansprechen kann.

 Die Galerie ist besonders faszinierend.

Wunderschöne APIs

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?

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.

Kunst und Programmierung: Was macht APIs schön?

Neulich beim Diskutieren mit  Felix kam wieder die Frage auf, die schon viele Flamewars ausgelöst hat.

Was macht APIs schon?

Das lässt sich natürlich nicht beantworten - aber an Beispiele kann man dass sehr konkret besprechen:

Das fängt ganz vorne an: Namensgebung der Klassen. In Python ist es guter Stil, das man alle Namen so kurz wie irgend möglich macht.

Das hat zur Folge, dass leider aus den Funktionsnamen so gut wie nichts über die Anzahl und die Typen der Argumente abzuleiten ist.

Und das heißt, das man entweder in der API-Doku nachsieht, oder es halt wissen muss.

Gar nicht schön.

Cocoa dagegen funktioniert so, dass vor jedem Argument ein Stück Methodennamen kommt. Und es ist Usus, dass man dieses Stück Methodennamen verwendet die Argumente zu erklären, Beschreiben oder zumindest deren Typ anzugeben.

Damit kann die billigste Autocompletion fast jede API-Doc ersetzen. Zusammen mit den strikten Regeln wie Methoden zu bennen sind (und z.B. [welche Abkürzungen in Namen verwendet werden dürfen]) kann man damit fast alle Methodennamen hervorragend raten und braucht noch weniger Trips in die Dokumentation.

Hier mal ein paar Beispiele:

[NSException raise:NSInternalInconsistencyException 
            format:@"'format' allways means that there %@ %@", 
                       @"is format string support", @"very handy. :)"];

[aDictionary setObject:@"anObject" forKey:@"aKey"];
// No more confusion which is first, key or value

// or if you do GUIs and want to ingegrate with other applications
[[NSWorkspace sharedWorkspace] openFile:aPath
    fromImage:anImage at:theLocationInWindow inView:aView];

Keine Konfusion an dieser Stelle. Kommentare werden viel seltener gebraucht, da sich der Code ausgezeichnet selbst dokumentiert - in jedem fall viel besser als ähnlich guter Python Code.

So. Morgen gehts weiter mit der anderen Seite - was mir an Python besser gefällt als an Obj-C.

Git the Basics

 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

Tja, nach anfänglichem 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!

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.

  • Posted: 2008-07-14 12:10 (Updated: 2008-10-08 09:09)
  • Author: dwt
  • Categories: code
  • Comments (0)

!TimeMachine auf einem beliebigen NAS

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.

  • Posted: 2008-07-12 22:24
  • Author: dwt
  • Categories: (none)
  • Comments (0)

Matjessalat mit Roter Beete und Apfel

Mjam....

 etwa so.

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

... 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

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

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.

iPhones bei O2 Germany?

Gerade hat mich meine "Tarifberaterin" angerufen und mich darauf hingewiesen das ich meinen Vertrag erneuern könne.

Auf meine Frage wie es denn da mit den iPhones aussieht erhielt ich dann eine überraschende Antwort:

"Ja klar, das dauert aber noch bis zum 11. bis die auf den Markt kommen, in welchem von diesen drei geschäften möchten sie den Vertrag denn dann abschließen?"

Doh.

Also entweder:

  • Sie will mich verarschen, damit ich doch einen Tarif über sie Abschließe
  • Sie war völlig Dämlich und hat nicht verstanden das O2 keine iPhones hat
  • O2 hat einen Deal, den sie jetzt ausgeplaudert hat.

Letzteres kann ich mir aber nur sehr schwer vorstellen - denn diese Neuigkeit wäre ja der Vollhammer für die Telekom. Bleibt eigentlich nur noch Möglichkeit eins und zwei.

Ersteres fände ich reichlich geschmacklos - vor allem, was soll dann danach kommen?

Bleibt eigentlich nur noch Möglichkeit zwei. Dagegen spricht allerdings das sie doch sehr überzeugt und resolut klang und auch offenbar diese eindeutige Liste von drei Geschäften in Berlin hatte wo das gehen wird.

Hmm....

Brainworks in presentation

 Garr Raynolds spricht mal wieder.  Seinen Blog verfolge ich ja schon lange - und habe ihn noch nie sprechen hören.

Daher war ich auch am Anfang etwas enttäuscht, da er (IMO) viel besser Schreibt als er spricht. Aber er kommt rein und hält letztlich eine sehr gute Präsentation - mit dem Thema wie man präsentieren soll (nach ihm).

 Den Vortrag kann ich daher nur empfehlen.

p.s.: By the way: Durch den Vortrag bin ich auch auf  Brain Rules ein Buch von John Medina gestoßen, der aus der Sicht eines Molekularbiologen beschreibt was wir über das Gehirn wissen und wie wir uns demnach verhalten sollen.

Good stuff. (Buch gerade bestellt)

iTunes - ohne Schlüssel?

Ist ja nicht so einfach.  Die  verschiedenen  Versuche waren immer mit nur kurzen Halbwertszeiten gesegnet.

Aber  Reqiem ist ganz Nett. Schöne C-Implementierung,  verteilt über viele Torrents und mit einer Homepage die in Freenet gehostet wird (1) kann man sich echte Chancen ausrechnen das es mal bestand haben wird.

Zumindest von einer technischen Seite aus.

Davon abgesehen finde ich den Sourcecode aber auch Schick. :-)

(1) Reqiem Homepage: freenet:USK@GSQgFDoeQUG0cSkbUVYYkB-ssqEEavRdo-RDVEAm0jk,rVvV3LjSZq3UNdGJrrup~~ZBPq4ohBhJeKkREXDLULw,AQACAAE/requiem/-1/

Hacking !TracBlog

Well, wir sind weiter gekommen. Man kann sogar schon posten.

Vor allem aber, haben wir eine recht vollständige Testsuite. Und dazu gehören auch funktionale Tests  mit Twill.

Die finde ich vom Ablauf her noch reichlich krude und aufwendig, aber ein Anfang ist gemacht.

 Wer schon mal einen Blick werfen will, darf das gerne tun. :-)

Censorship sells

 and how it does!

Via  Rivva (genaues Post weiß ich nicht mehr)

Outteach

Ich mag es wie  Kathy Sierry bloggt. Immer hat sie den Fokus darauf das Benutzer von Software (oder von irgend etwas) dadurch mehr schaffen können.

Das ist der richtige Ansatz.

Zusammengefasst ist dieser Grundsatz vielleicht  in dem Zitat: "Outteach not outspend".

Ich bin noch am Überlegen wie das auf Novamedia anzuwenden ist - aber

Stop Shopping!

 Bloggalujah to ya all!

Now Introducing:  Reverend Billy and the Church of Stop Shopping

 Und darüber gibts auch eine Dokumentation,  die ich mir gerade angesehen habe. Großartig.

Politik und Unterhaltung und auch noch Spiritualität - alles zusammen. Großartig.

Kritische Anmerkungen:

  • Wie ginge es unserer Wirtschaft, wenn tatsächlich niemand mehr ausgäbe als er hat?
  • Wo und für wie viel Geld würden die Menschen Arbeiten wenn sie keinen Job bei Nike, Wallmart, etc. hätten? ( siehe WP: Sweatshop)

Super film.

p.s.: Einige der  Songs von der Truppe gibt es hier und noch ein paar sachen  hier.

Kommunikationsstrukturen

Wohin führt es, wenn in einer Firma keine geordneten Kommunikationsstrukturen existieren?

Richtig, es wird weniger kommuniziert.

Na hat Captain Obvious bei euch auch eingeschlagen?

Ich finde es ja hochspannend, dass Kommunikation so ein Problem ist.

Open Source Projekte lösen das in der Regel so, dass die Mailingliste die ständige und ausdauernde Besprechung ist, in die alle Vorschläge kommuniziert und diskutiert werden. Passt die Kommunikation nicht, wird das Projekt entweder geforkt (wenn es anderen Personen wichtig ist) oder aber das Projekt schläft ein und hört auf. (War also doch nicht soo wichtig)

In Firmen werden gerne agile Methoden eingesetzt um das Problem zu lösen, da diese immer darum kreisen die Arbeit die passiert transparent zu machen und die Kommunikation der Teilnehmer zu erweitern.

Ob das jetzt ein Stand-Up-Meeting oder das Daily-Scrum oder das was weiß ich was ist - immer geht es darum das man regelmäßig kommuniziert.

Wichtig.

Und jetzt zur nächsten Lektion: Wie kriegt man so eine Kommunikationsstruktur in eine Firma hinein die dass (noch) nicht macht?

Warum kann man…

… eine Wurzel berechnen indem man einen float einfach um ein Bit nach rechts schiftet?

float InvSqrt(float x)
{
    float xhalf = 0.5f*x; 
    int i = *(int*)&x; // get bits for floating value
    i = 0x5f3759df - (i>>1); // gives initial guess y0
    x = *(float*)&i; // convert bits back to float
    x = x*(1.5f-xhalf*x*x); // Newton step, repeating increases accuracy
    return x;
}

 Chris Lomont sich das mal angesehen und seine Erklärung hab ich verstanden.

Was diese Stelle tut:

    int i = *(int*)&x; // get bits for floating value
    i = 0x5f3759df - (i>>1); // gives initial guess y0
    x = *(float*)&i; // convert bits back to float

Ist total cool. das Bitmuster des floats wird einfach als long interpretiert - was nichts weiter bedeutet, als das die Teile des Floats, Vorzeichen, Mantisse und Exponent jetzt halt nebeneinander in einem Bitfeld liegen. Wenn man dieses Bitfeld jetzt nach rechts schiftet dann hat man das effektiv eben auch mit jedem der Bitfelder gemacht. Wenn man dann dieses Bitmuster noch etwas manipuliert, indem man es mit einer Korrekturkonstante vermurkst die die Fehler durch das hereinschiften von werten aus der Mantisse in den Exponent minimieren, dann hat man eine tolle Annäherung.

Und diese Annäherung erlaubt es mit nur einem Schritt nach  Newton zu einer sehr guten Näherung an die Quadratwurzel zu kommen.

Rockig.

Vor allem finde ich es cool, wie die Hacker hinter diesem Algorithmus ihn gefunden haben. Das konnten sie nämlich nur machen, weil sie genau wussten wie ein float tatsächlich implementiert ist - einem Wissen das die meisten Hacker heute nur noch theoretisch haben - aber nicht so genau das sie dieses Format auch mal so ohne weiteres für so einen fiesen Trick missbrauchen können.

In diesem Sinne: Aus der Geschichte lässt sich viel lernen. :-)

Was macht dieser Code

Aus dem  Q3 Source Code:

float Q_rsqrt( float number )
{
  long i;
  float x2, y;
  const float threehalfs = 1.5F;

  x2 = number * 0.5F;
  y  = number;
  i  = * ( long * ) &y;  // evil floating point bit level hacking
  i  = 0x5f3759df - ( i >> 1 ); // what the fuck?
  y  = * ( float * ) &i;
  y  = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration
  // y  = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed

  #ifndef Q3_VM
  #ifdef __linux__
    assert( !isnan(y) ); // bk010122 - FPE?
  #endif
  #endif
  return y;
}

Was macht das und wieso funktioniert es?

(Für all zu ungeduldige:  Auflösung)

Was ich besonders spannend finde, ist  die Geschichte mit der es entstanden ist. ( Und die Fortsetzung)

Total cool.

(via:  Einen Podcast von Ryan 'icculus' Gordon [etwa ab min. 30])

Eine Kulturelle Referenz

ist etwas das man nur versteht, wenn man "IN" ist.

Also in einer Gruppe, die die Sprache auf die sich das "Referenzwerk" bezieht.

 Kunst in diesem Sinne.

Total cool.

p.s.:  LOLCats rult natürlich nicht soo, aber...  noch einer

  • Posted: 2008-06-01 22:00 (Updated: 2008-06-01 22:28)
  • Author: dwt
  • Categories: links
  • Comments (0)

FoneLink 2.0

Yay!

Nachdem wir das Innenleben der Software fast komplett ausgetauscht haben ist  endlich die Version 2.0 fertig geworden.

Was ein Akt.

Von dem was die Software ausmacht, ist wirklich kein Stein mehr so gelassen worden wie er war.

Jede operation wurde Asyncron gemacht, alles in ein Konzept von Aktionen gepresst (und das war manchmal nicht einfach) die gescheduled werden und (wenn es das Telefon erlaubt) sogar parallel ausgeführt werden können.

Mein Hauptteil daran war das Datenmodell das den synchronen Zugriff auf das Dateisystem des Handies erlaubt - intern aber alle Operationen Asynchron abarbeitet.

Was gar nicht so einfach zu verkapseln war. (Dementsprechend sind die Unit Tests auch fast die noch mal halb so viel Code wie der eigentliche Code).

Das Design für das ich mich letztendlich entschieden habe ist recht simpel: Jeder Dateisystem-Knoten kann einen von mehreren Zuständen haben:

  1. Out Of Date -> Der Zustand muss mit dem Handy abgeglichen werden
  2. "Up To Date" -> nichts zu tun, die aktuellen Daten sind da
  3. Update In Progress-> Die Daten werden gerade Aktualisiert oder ein anderer Job (Meist mit Progress-Anzeige) läuft mit Bezug auf diesen Knoten.

Jobs können zum Beispiel das Kopieren auf oder von dem Handy sein.

Dazu kommt dann natürlich noch etwas Intelligenz die diese Jobs automatisch anwirft wenn es Sinn macht (Verzeichnisse Aktualisieren wenn die GUI sie anzeigt) und unnötiges Kopieren vermeidet (Es gibt einen Cache auf der Festplatte - wird eine Datei einmal vom Handy Kopiert und dann nicht mehr Verändert wird die Kopierte ab da für Operationen verwendet.) Und nicht zu vergessen: Versionierte Backup und Restores gibt es natürlich auch noch.

Ach ja und Rasend Schnell sollte das natürlich auch sein.

War nicht leicht - aber jetzt läuft es rock-solid. Und über die Implementierung erzähle ich später mal mehr.

Spaces in the path

are not allowed on UNIX.

Damn.

Um das klarer zu machen: Ich will ein Skript schreiben, bei dem oben im  shebang hartcodiert ein Pfad zum interpreter steht.

So weit so gut. ABER. Dieser Interpreter liegt in einem Verzeichnis - und dieses Verzeichnis hat ein Leerzeichen im Namen.

Doh.

Die Regeln sagen nämlich:

The initial line of a script file must begin with #! as the
first two bytes, followed by zero or more spaces, followed by
interpreter or interpreter argument.  One or more spaces or tabs
must separate interpreter and argument.  The first line should
end with either a new-line or null character.

Und da hält sich auch der Mac OS X Kernel genau daran.

 Ich bin auch nicht der erste der darüber gestolpert ist. Hallo Felix. :-)

Das Blöde daran: Die Implementierungen erlauben weder ein Escapen, noch ein "In Anführungszeichen Setzen" des Interpreters.

Hrmpf.

Nach einigem Nachdenken sind mir letztlich nur zwei Lösungsmöglichkeiten aufgefallen:

1) Das Programm in zwei Dateien aufsplitten - die erste startet mit /bin/sh im shebang und dann ganz normal im 'body' den normalen Interpreter mit den normalen Mitteln der Shell (die auch quotes und escapen erlauben).

2) Wenn das Programm ein File bleiben soll / muss, kann ein  Polyglot das Problem lösen.

Das sah bei mir dann so aus:

#!/bin/sh
# Solves the problem that shebang lines can't contain spaces 
# (even escaped or quoted) in the interpreter path via a polyglot
"""false"
exec /Users/dwt/Archiv/Code/Aktive\ Projekte/Trac/env-trac-0.11/bin/python $0 $@
"""

import sys
print sys.argv

Das funktioniert so:

  • wird die Datei gestartet, wird sie mit der Bourne Shell (oder einer der Nachkommen) ausgeführt
  • in der Zeile """false" maskiere ich mit Hilfe des Kommandos "false" den Beginn eines Python Doc-Strings / Kommentars / Multiline-Strings.
  • Danach wird mit "exec" die Datei nochmal ausgeführt - diesmal mit dem richtigen Interpreter.
  • Der überspringt diesen Teil dann weil für ihn der Start komplett im Kommentar / ... / ... verschwindet.

Einerseits finde ich es cool das ich diesen Workaround gefunden habe - andererseits ist das natürlich ein totaler Hack. Insofern bin ich eher dagegen.

Was ich jetzt damit Tue weiß ich jedenfalls noch nicht.

Liquid Democracy

Heute hat mich Bernd auf diesen coolen Wikipedia-Artikel hingewiesen:  Proxy Voting. Dort wird das was wir uns bei der Piratenpartei Berlin als Liquid Democracy vorstellen sehr schön beschrieben - insbesondere auch mit vielen Beispielen wo das schon angewendet wird.

Spannend finde ich auch das ein paar Leute wohl gleich versucht haben das in der Wikipedia einzuführen - erst mal ohne Erfolg.

 Aber die Diskussion darum ist sehr lesenswert.

Debugging Unit Tests in Xcode 3.1

Since I haven't found this info anywhere in the Blogosphere and had to painfully gather it through a long debugging stare, I'm posting it here:

If you want do debug Unit Tests in Xcode 3.1 you have to do the usual, that is:

  • Make a custom Executable
  • Set it's argumet to -SenTest All
  • Set some Environment Variables
    • DYLD_INSERT_LIBRARIES to ${DEVELOPER_LIBRARY_DIR}/PrivateFrameworks/DevToolsBundleInjection.framework/DevToolsBundleInjection
    • DYLD_FALLBACK_FRAMEWORK_PATH to $(DEVELOPER_LIBRARY_DIR)/Frameworks
    • XCInjectBundle to $(BUILT_PRODUCTS_DIR)/InvocationBuilder Tests.octest This is of course where you have enter the name of your test bundle

So far nothing new.

What is new though is that you also set the variable XCInjectBundleInto to point to the executable that is going to load the tests (probably to avoid the 3.0 Bug that would load the tests into the shell that GDB used to start the Application). This should be the same as the $(TEST_HOST) variable that you have to set for the Unit Test bundle. In my case this is $(BUILT_PRODUCTS_DIR)/InvocationBuilder.app/Contents/MacOS/InvocationBuilder.

This is quite interesting, since it means that otest is not used anymore to start the tests, but instead RunTargetUnitTests executes the tests directly.

Well, now that I can again debug my tests maybe I'l even get it to work with debugging Unit Tests which use Mock-Objects sometime. :-)

  • Posted: 2008-05-25 09:45 (Updated: 2008-05-25 09:46)
  • Author: dwt
  • Categories: code
  • Comments (0)

Über Fehlermeldungen aus alten Tagen

.. bin ich mal wieder in  Wards Wiki gestolpert.

Lovely. :-)

Wie man über Objektorientierung nachdenken kann

Eines meiner Lieblingszitate über Objektorientierung kommt von  Ward Cunningham: "Jedes Objekt ist eine kleine Sprache".

Ich verstehe das so das man mit jedem Objekt das man entwirft eine kleine Sprache schreibt. Eine Sprache die es einfach macht die lösung für ein spezifisches Problem darzustellen.

Fast noch wichtiger finde ich aber jetzt gerade (wo ich mich  auf Arbeit mit vielen globalen Variablen herumschlage) das jedes Objekt eben auch einen eigenen Namensraum darstellt - der optimaler weise auch verschachtelt werden kann.

Wunderschön finde ich das zum Beispiel bei Ruby sichtbar: Wenn man in eine Datei direkt Code schreibt, dann ist dieser Code teil eines top-level objekts. Schreibt mann in einer Datei dann weitere Objekte, sind diese Objekte in diesem top-level objekt eingebettet.

Das Prinzip erweitert sich wunderbar zu paketen und paketen von paketen - öffentlichen und privaten klassen (fals man das braucht) etc.

Und das alles ohne ein weiteres Konzept einzuführen - nur die Objektabstraktion. (*schnief* Java?)

Warum nur machen das so wenige Programmiersprachen so? Objective-C jedenfalls hat noch nix in die Richtung. In C++ hat man sowieso verloren - C hat gar keine Objekte - aber man kann dafür jede Bibliothek als Objekt sehen (so man will).

Stellt sich die Frage: Übersehe ich irgend ein total geiles Feature das man erhält wenn man Pakete als ein eigenes Feature in eine Sprache einbaut?

Hmpf.

Genshi

Heute habe ich mir mit  Felix den Template Teil des Blogs, an dem wir gerade schrauben, angeschaut. Ziel war es eine Blog-Posting Seite zu bauen die möglichst einfach zu warten ist und gleichzeitig möglichst alle Features bietet die auch die  Standard Wiki-Editier-Seite von  Trac bietet.

Das geht überraschenderweise sogar ganz gut. Denn: Trac ab 0.11 verwendet Genshi als Template-Sprache und Genshi wiederum ist XML mit  XPath allüren.

Will heißen wir konnten uns das Template für die normale Wiki-Eingabe nehmen und dann sagen: Aber die Überschrift oben "Editing XXXXX" soll bitte weg und dafür soll da stehen "Create Blog Entry" - ein Feature das die meisten Template-Engines schon mal nicht bieten.

Und das ist natürlich geil, weil wir nicht den kompletten Template-Source kopieren müssen um das gleiche look und feel zu kriegen.

Nur das XPath natürlich wie alles bei XML total kompliziert macht. Das heißt zum Beispiel das man damit nicht sagen kann, nimm dass und ersetze darin das gegen dies. Neeeiiiin. Natürlich ist alles andersherum.

Man sagt also: Meine Welt ist so definiert, das dies immer wenn es auftritt durch das ersetzt wird und jetzt hole ich mal das original in meine Welt hinein und magisch wird darin alles ersetzt.

Großartig.

Klar das geht - aber das hätte man auch einfacher haben können.

p.s.: Weiß jemand wie man mit XPath aus dieser Struktur

<fieldset id="changeinfo">
 <legend>Change information</legend>
 
 <div class="field">
    <label for="tags">Tag under: (<a href="http://xn--hcker-gra.net/cgi-bin/trac.cgi/tags">
                            view all tags</a>)</label><BR/>
    <input title="Comma separated list of tags" type="text" id='tags' 
                name="tags" size="30" value="blog">
 </div>
 <div class="field">
  <label>Comment about this change (optional):<br />
  <input id="comment" type="text" name="comment" size="60" value="" /></label>
 </div><br />
 
  <div class="options">
   <label><input type="checkbox" name="readonly" id="readonly" />
   Page is read-only</label>
  </div>
 
</fieldset>

nur das div mit dem label und input für den Kommentar herausmatchen kann?

Unsere Versuche sind erst einmal bei diesem XPath query stehen geblieben div[@id='changeinfo1']/div[@class='field'].

Oh und noch was zum Tanzen

  • Posted: 2008-05-19 21:17
  • Author: dwt
  • Categories: (none)
  • Comments (0)

Parteitagsfazit

Boah war ich gestresst von der Versammlung - aber zumindest ist das Ergebnis zufrieden stellend - die wichtigsten Änderungen zur Satzung sind durchgekommen:  Die neue Finanzordnung und  die Regelung zum dezentralen Parteitag.

Sonst war aber leider nicht viel los - die Tatsache das so viele Piraten auf einem Fleck saßen konnte nicht genutzt werden - ausser um über GO-Anträge zu streiten.

Der Inhaltlich produktivste Teil der Veranstaltung wohl das gemeinschaftliche Besäufnis am Abend nach dem ersten Tag. Da wurde wenigstens mal überhaupt etwas Inhaltliches getan (Wenn ich mich auch nicht mehr an alles erinnern kann).

Also ein gemischtes Fazit.

Regeln

haben immer einen Grund aus dem heraus sie entwickelt wurden. Nur leider wird dieser Grund viel zu oft beim Vermitteln der Regeln nicht mehr mitgereicht.

So gibt es Programmierer die ihren Code nicht einrücken weil sie den Grund dafür nicht kennen oder verstehen und Politiker die z.B. am Patentsystem schrauben ohne zu verstehen was der Grund dafür eigentlich war.

Und genau das ist ein Problem - jede Regel hat einen Sinn - und diesen Sinn kann man nur bewerten wenn man eben genau weiß warum sie eingeführt wurde.

Denn wenn dieser Sinn nicht mehr erfüllt wird, dann muss man die Regel verändern.

Und das fällt schwer - vor allem wenn es eine Gruppe von Menschen ist (sagen wir 40-100) die sich jetzt gerade an ein paar Regeln gewöhnt hat und noch nicht weiß wie ihre Zusammenarbeit unter den neuen Regeln aussehen wird.

Piratenpartei treibt Dollarkurs in die Höhe

"Nur haarscharf ist das amerikanische Volk heute der Dollarkatastrophe vorbeigeschrammt" so Winfried Engelke.

Engelke hatte in einem Akt heroischer Selbstaufopferung bei der Versteigerung des letzten und einzigen Dollars in der Piraten Barkasse (nein, nicht  diese) den Preis auf die Spitze getrieben und ihn für astronomische 20 € erworben.

"Dies ist der Beginn einer neuen Ära" mit diesen Worten leitete Engelke die Tradition des immer wieder versteigerns dieses Dollars zu jedem Parteitag ein.

Wir sind begeistert.

Die Piratenpartei ist groß

denn sie hat 804 Mitglieder.

Also im letzten Jahr etwas mehr als ein Mitglied pro Tag.

Parteitagswahnsinn

 GO Antrag auf:

  • Ende der Diskussion und Beschlussfassung -> Angenommen
  • Großer Protest des noch-Vorsitzenden
  • Daraufhin sein GO Antrag keine weiteren GO-Anträge auf Ende der Diskussion und Beschlussfassung zu stellen -> der wurde Angenommen
  • Daraufhin der Verweigerung des Versammlungsleiters die restlichen Diskutanten noch reden zu lassen, weil der Antrag auf Ende der Diskussion vor dem GO Antrag der das verhindern möchte beschlossen wurde
  • Daraufhin der GO Antrag die Diskussion wieder zu eröffnen
  • Und dann ging die Diskussion weiter
  • Viele viele GO Anträge später...
  • Und dann gab es GO Anträge die Sitzung auf morgen zu Vertagen

ARGHHHHHHH

Interessante Begriffe:  Filibuster

Was ist die Piratenpartei

Von dem Mitgliederausweis hinten:

Der Besitzer dieses Dokumentes ist berechtigt, sich seines Verstandes zu bedienen, Informationen zu produzieren, replizieren und konsumieren, sich frei und ohne Kontrolle zu entfalten in Privatspähre[sic] und Öffentlichkeit.

Behinderung dieser Rechte wird geahndet durch die Piratenpartei Deutschland.

Großartig!

  • Posted: 2008-05-17 17:09 (Updated: 2008-05-17 17:09)
  • Author: dwt
  • Categories: politik
  • Comments (0)

Parteitagsstimmung

Mal ein paar Stichworte:

  • Schöne gerade Tischreihen, streng Schulisch aufgestellt
  • Der Versammlungsleiter und die Vorsitzenden sitzen auf der Bühne vorne
  • Es gibt kaum Internet, nach langem hakeln haben wir wenigstens eine UMTS-Flat per W-Lan freigegeben
  • Endlose Diskussionen, Satzungsänderungsanträge, Satzungsänderungsänderungsanfragen ("selbstverständlich" ausgeschlossen)
  • Harte Sitze
  • Kaffee kostet extra
  • Es sind immer noch weit über die hälfte der 90 Satzungsänderungsanträge offen

*schnief*

Der Traum vom Fliegen ...

... ist schnell ausgeträumt wenn man sich  die Liste der Änderungsanträge für den Piratenparteitag anschaut.

Da kann man wirklich nur noch von einer  DOS Attacke sprechen.

Ich bin mal gespannt was wir daraus machen werden - ob sich wohl dieses Jahr mehr Leute vorbereitet und alles mal gelesen und sich eine Meinung gebildet haben?

Ich hoffe ja für das nächste Jahr, das man im Wiki jedem Antrag Punkte geben kann, damit wenigstens die wichtigsten nach vorne kommen.

Für dieses Jahr wünsche ich mir, dass alle, die noch Diskussionsbedarf haben, in einem Raum eingeschlossen werden und dort Diskutieren bis sie genug haben, während der Rest sich um andere Dinge kümmern kann. Die Abstimmungen werden dann gerafft in einem Zeitraum ohne viel Diskussion gemacht damit es schnell geht.

Na mal schaun.

Update: Tja, die Merhheit hat sich nicht vorbereitet und möchte das sich der Rest auch mit ihnen in Diskussionen abbricht. Mal schauen wie viel Zeit dann noch übrig bleibt.

Experimentalphysik und Programmieren

Das sind an sich identische Tätigkeiten - hat mir mein Vater heute klargemacht.

Klar, er ist ein alter Physiker und trauert immer noch ein wenig der Tatsache nach das ich keiner geworden bin.

Oder auch nicht, denn: Ein guter Experimentalphysiker arbeitet so, dass er in einer Versuchsreihe in jedem Schritt immer nur eine Variable verändert um methodisch vorzugehen. Entweder nimmt er eine (wirklich nur eine) Änderung an seinen Messinstrumenten, oder an dem Experiment vor.

Dazu dann natürlich noch einiges an Intuition welche Veränderung sinnvoll ist - experimentelle Physik ist eben auch eine Kunst, genau wie das Programmieren.

Ach ja, und natürlich schreibt er ein Protokoll um hinterher nachvollziehen zu können, was er eigentlich getan hat.

Beim Programmieren kann man diese Techniken genau so wiederfinden. Die Messinstrumente sind in der Regel  UnitTests oder etwas äquivalentes (wobei UnitTests besser geeignet sind, da sie exakter messen können) und damit wird eine API dann abgeklopft.

Jetzt kommt bei uns Programmierern aber noch eine komplette Dimension dazu. Denn während ein Experimentalphysiker die Welt um ihn herum so hinnehmen muss wie sie ist, können wir Programmierer den Gegenstand unserer Tests beliebig verändern. Nur unser Phantasie schränkt uns ein.

Aber es läuft genauso: Ein Messinstrument, ein Stück Weltveränderung, ad infinitum.

Das letzte fehlende Detail ist das Logbuch: Das sind die schon geschriebenen Tests, die dokumentieren was wir schon herausgefunden haben.

Ich war wirklich überrascht wie weit die analogie trägt. Und auch die Implikation gefällt mir als UnitTest-Fan natürlich sehr. Und natürlich auch der Fakt das wir als Informatiker 'wieder mal' mehr können als die Physiker.

:-)

Wann darf man eigentlich…

…die Syntax einer Sprache modifizieren?

In C natürlich. Das Problem ist klar: Makros können ja beliebige Ersetzungen im Text vornehmen und dann mit vielen Makros aus C Pascal zu machen geht auch - aber das will man ja nicht, denn sonst hat man das gleiche Problem wie die  Bourne- Shell die irgendwann niemand mehr weiterentwickeln konnte.

Klar.

Andererseits nervt es wirklich unter Cocoa z.B. für jede Iteration über einen Array das hier zu schreiben:

NSArray *someStrings = [NSArray arrayWithObjects:@"first", @"second", @"third", @"fourth", nil];

NSString *eachString = nil;
NSEnumerator *enumerator = [someStrings objectEnumerator];

while (eachString = [enumerator nextObject])
{
    NSLog(@"eachString is %@", eachString);
}

Das heißt, für eine Schleife (zwei Zeilen) ha man noch mal mindestens zwei weitere Zeilen nur für das Setup.

Das nervt so sehr, das viele Leute das etwas kürzen:

NSArray *someStrings = [NSArray arrayWithObjects:@"first", @"second", @"third", @"fourth", nil];

id eachString, enumerator = [someStrings objectEnumerator];
while (eachString = [enumerator nextObject])
{
    NSLog(@"eachString is %@", eachString);
}

Schon besser, aber man verliert die Typchecks (falls man die haben will) und man muss trotzdem noch eine langweilige Zeile schreiben, die immer gleich ist und sich nicht wirklich kürzen lässt.

Jetzt kann man natürlich unter C schön ein Makro bauen, was das schöner macht - aber, siehe  Bourne Shell...

Aber, mit  ObjC 2.0 gibt es das for(String *each in someStrings) konstrukt, das schon deutlich kürzer (und auch schneller - aber aus anderen Gründen) ist.

Also, doch mal ein Makro. Nach reiflichem (2 Minuten) überlegen hab ich mich entschieden es erst einmal mit einer for Schleife zu probieren, da das bedeutet das der Scope der Variablen schön beschränkt ist.

Ziel wäre es also, das hier schreiben zu können:

NSArray *someStrings = [NSArray arrayWithObjects:@"first", @"second", @"third", @"fourth", nil];

FOREACH(eachString, someStrings)
{
    NSLog(@"eachString is %@", eachString);
}

Und das sähe dann so aus:

#define FOREACH(each, collection) \
    for(id __enumerator = [collection objectEnumerator], each = [__enumerator nextObject]; \
        each; \
        each = [__enumerator nextObject])

In der Praxis hab ich es auf Wunsch meiner Kollegen noch etwas modifiziert, damit man den Typ der Variablen noch einstellen kann (auch wenn er bisher noch nicht verwendet wird - immerhin kann man ihn aber als Startpunkt für Dokumentations-Lookup verwenden).

/// Use like this:
// FOREACH(NSString *, each, arrayOfStrings)
// {
//      if ([each hasPrefix:@"foo"])
//          [self doSomething];
// }
// This macro is in preparation of the ObjC 2.0 Fast enumeration protocol
#define FOREACH(typeOfEach, each, collection) \
    for(id __enumerator = [collection objectEnumerator], each = [__enumerator nextObject]; \
        each; \
        each = [__enumerator nextObject])

Bei Verwendung, bitte e-mail. :-)

Wie man die Löschen Taste implementiert

sag ich heute nicht, aber dafür welch hervorragenden Podcasts ich gerade gehört habe:

  •  Energiesparhäuser Hochspannender Einblick was die Haustechnik so her gibt und wie ähnlich sie der Computertechnik ist.
  •  Hubschrauber Wie eine Voraussage über einen Hubschrauberabsturz (wahre Geschichte) ein Leben verändert.

Beides hoch spannend. :-)

cu Martin

Mein Name ist Martin und ich bin ein Pirat

Denn das worum es heute geht ist die Frage wer die Kultur von Morgen kontrolliert.

Die die es heute noch tun - oder die die sich gerade anschicken diese Kontrolle zu unterlaufen?

Die Wissenschaftler, die Privatmenschen, die Berufsausübenden, die Künstler - alle, die jetzt nicht mehr durch einen Engpass (auch Firma genannt) davon abgehalten werden können ihren Sermon zu veröffentlichen.

Manchmal werden diese Menschen Blogger genannt, aber es geht um etwas viel größeres.

Unsere Kultur. Was wir daraus machen. Wie wir sie machen.


Das ist in etwa die Meinung von  Rickard  Falkvinge die er in  immer wieder Vertritt.

Heute kriegt er erst mal meine Zustimmung. An die Kritik mache ich mich Später.

Den Mobile Monday

 hab ich gerade besucht.

Und ich muss sagen: "I am not impressed."

Obwohl nahezu alle anwesenden Deutsche waren, wurden "natürlich" alle Vorträge auf Englisch abgehalten. Sehr Hipp, aber leider auch in sehr brüchigem Englisch das vieles Verstehen eher erschwerte. :/

Überhaupt das Verstehen. Wenn ich es recht betrachte, dann war das eigentlich kein Problem. Denn das Niveau der Vorträge war so tief, das selbst das gebrochene Englisch vieler Vortragender nicht wirklich am Verstehen der nicht vorhandenen Inhalte störte.

Was genau ist das also für eine Veranstaltung?

Eine IT-Second-Generation-Gründer-Blase trifft sich dort und präsentiert zum Teil ihre Ideen - aber auch Vertreter von größeren Firmen kommen vorbei (in diesem Falle Vodafone) um ihre Produkte zu zeigen. (Getragen wird das ganze von  DER Post (?), Nokia,  Sun, Jamba...

Und dann sind natürlich immer auch Event Sponsoren, hier Kyte und Device Anywhere die die Gelegenheit nutzten um wenigstens ein paar Leuten ihre Software bekannt zu machen.

Insgesammt erinnert mich das Stark an einen Spruch den  Bernd ( wunderschönes Bild) vor einiger Zeit einmal getätigt hat: "In Berlin funktioniert das so: Es gibt viel mehr Aktive die etwas cooles machen wollen, als Leute die sich das ansehen wollen. Daher gibt es die soziale Übereinkunft, das man immer zu den anderen Leuten geht wenn sie was machen und die dafür auch auf die eigenen Veranstaltungen kommen wenn man selber eine macht."

Well, genau so hat es gewirkt. Und eher uninteressant. Leider.

Den das Thema  User Centered Design ist sauwichtig und völlig unterbelichtet.

Peinlich fand ich auch, das ausgerechnet der Typ der Von Jamba da war den besten Vortrag über User-Centered design abgeliefert hat den der ganze Abend zu bieten hatte. :-/

Der Grund wieso ich eigentlich hingegangen bin, nämlich der Vortrag von Jan Mühlig ( von Relevantive) ist leider ausgefallen. Wirklich schade. Ich bin sicher er hätte noch am ehesten etwas relevantes sagen können.

Warum jeder überall das gleiche Passwort verwendet …

… wo doch jeder weiß wie unsicher das ist?

Dabei ist dass Problem so klar: Niemand kann sich für jeden Account den man heute im Social Web anlegen muss eine neue Kombination aus Benutzername und Passwort merken.

Und es gibt mehrere Lösungen:

Microsoft (aber auch viele Andere) favorisiert Single-Sign-On - ein Server von Microsoft verwaltet die Benutzerdaten für alle Webseiten. Man meldet sich nur noch bei Microsoft an und alle anderen Sprechen nicht mehr mit einem selber, sondern nur noch mit Microsoft um festzustellen ob der der da rein will echt ist.

Super, nur noch ein Passwort - aber auch ein Punkt an dem alles schief gehen kann. Denn man muss dem Anbieter (Microsoft) vertrauen.

Apple hat eine Andere Lösung:  Keychain. Ganz Apple Typisch komplett in das System integriert und nicht nur eine Lösung für Webseite, sondern für jedes Authentifizierungsproblem.

Super, auch nur noch ein Passwort und keine zentrale Location der man Vertrauen muss (abgesehen von der Implementierung des Dienstes). Aber, wenn man mehrere Computer verwendet oder auch mal aus der Ferne auf eine Webseite zugreifen muss / möchte, hat man erst einmal verloren.

Und da habe ich heute die perfekte Lösung gefunden: Ein Javascript Bookmarklet das folgendes tut: Es verbindet ein konstantes Geheimnis (Master Password) mit einem Datum das für jede Webseite variiert (die URL oder den Namen der Seite) und jagt das Ergebnis durch eine  Kryptographische Hash-Funktion.

Das Ergebnis ist damit ein Passwort das für jede Webseite anders ist - aber das man sich nicht merken muss.

Das  Bookmarklet gibt es hier.  Und natürlich gibt es dafür auch eine Greasemonkey verschönerte Version für Firefox Benutzer. (Die Angenehmerweise auch auf dem iPhone funktioniert)

Ich verwende auf dem iPhone dieses Bookmarklet ( Als Backup gespeichert)

javascript:(function(){function%20hex_md5(s){%20return%20binl2hex(core_md5(str2binl(s),%20s.length%20*%208));}function%20core_md5(x,%20len){x[len%20%3E%3E%205]|=%200x80%20%3C%3C%20((len)%20%25%2032);x[(((len%20+%2064)%20%3E%3E%3E%209)%20%3C%3C%204)%20+%2014]%20=%20len;var%20a%20=%20%201732584193;var%20b%20=%20-271733879;var%20c%20=%20-1732584194;var%20d%20=%20%20271733878;for(var%20i%20=%200;i%20%3C%20x.length;i%20+=%2016){var%20olda%20=%20a;var%20oldb%20=%20b;var%20oldc%20=%20c;var%20oldd%20=%20d;a%20=%20md5_ff(a,%20b,%20c,%20d,%20x[i+%200],%207%20,%20-680876936);d%20=%20md5_ff(d,%20a,%20b,%20c,%20x[i+%201],%2012,%20-389564586);c%20=%20md5_ff(c,%20d,%20a,%20b,%20x[i+%202],%2017,%20%20606105819);b%20=%20md5_ff(b,%20c,%20d,%20a,%20x[i+%203],%2022,%20-1044525330);a%20=%20md5_ff(a,%20b,%20c,%20d,%20x[i+%204],%207%20,%20-176418897);d%20=%20md5_ff(d,%20a,%20b,%20c,%20x[i+%205],%2012,%20%201200080426);c%20=%20md5_ff(c,%20d,%20a,%20b,%20x[i+%206],%2017,%20-1473231341);b%20=%20md5_ff(b,%20c,%20d,%20a,%20x[i+%207],%2022,%20-45705983);a%20=%20md5_ff(a,%20b,%20c,%20d,%20x[i+%208],%207%20,%20%201770035416);d%20=%20md5_ff(d,%20a,%20b,%20c,%20x[i+%209],%2012,%20-1958414417);c%20=%20md5_ff(c,%20d,%20a,%20b,%20x[i+10],%2017,%20-42063);b%20=%20md5_ff(b,%20c,%20d,%20a,%20x[i+11],%2022,%20-1990404162);a%20=%20md5_ff(a,%20b,%20c,%20d,%20x[i+12],%207%20,%20%201804603682);d%20=%20md5_ff(d,%20a,%20b,%20c,%20x[i+13],%2012,%20-40341101);c%20=%20md5_ff(c,%20d,%20a,%20b,%20x[i+14],%2017,%20-1502002290);b%20=%20md5_ff(b,%20c,%20d,%20a,%20x[i+15],%2022,%20%201236535329);a%20=%20md5_gg(a,%20b,%20c,%20d,%20x[i+%201],%205%20,%20-165796510);d%20=%20md5_gg(d,%20a,%20b,%20c,%20x[i+%206],%209%20,%20-1069501632);c%20=%20md5_gg(c,%20d,%20a,%20b,%20x[i+11],%2014,%20%20643717713);b%20=%20md5_gg(b,%20c,%20d,%20a,%20x[i+%200],%2020,%20-373897302);a%20=%20md5_gg(a,%20b,%20c,%20d,%20x[i+%205],%205%20,%20-701558691);d%20=%20md5_gg(d,%20a,%20b,%20c,%20x[i+10],%209%20,%20%2038016083);c%20=%20md5_gg(c,%20d,%20a,%20b,%20x[i+15],%2014,%20-660478335);b%20=%20md5_gg(b,%20c,%20d,%20a,%20x[i+%204],%2020,%20-405537848);a%20=%20md5_gg(a,%20b,%20c,%20d,%20x[i+%209],%205%20,%20%20568446438);d%20=%20md5_gg(d,%20a,%20b,%20c,%20x[i+14],%209%20,%20-1019803690);c%20=%20md5_gg(c,%20d,%20a,%20b,%20x[i+%203],%2014,%20-187363961);b%20=%20md5_gg(b,%20c,%20d,%20a,%20x[i+%208],%2020,%20%201163531501);a%20=%20md5_gg(a,%20b,%20c,%20d,%20x[i+13],%205%20,%20-1444681467);d%20=%20md5_gg(d,%20a,%20b,%20c,%20x[i+%202],%209%20,%20-51403784);c%20=%20md5_gg(c,%20d,%20a,%20b,%20x[i+%207],%2014,%20%201735328473);b%20=%20md5_gg(b,%20c,%20d,%20a,%20x[i+12],%2020,%20-1926607734);a%20=%20md5_hh(a,%20b,%20c,%20d,%20x[i+%205],%204%20,%20-378558);d%20=%20md5_hh(d,%20a,%20b,%20c,%20x[i+%208],%2011,%20-2022574463);c%20=%20md5_hh(c,%20d,%20a,%20b,%20x[i+11],%2016,%20%201839030562);b%20=%20md5_hh(b,%20c,%20d,%20a,%20x[i+14],%2023,%20-35309556);a%20=%20md5_hh(a,%20b,%20c,%20d,%20x[i+%201],%204%20,%20-1530992060);d%20=%20md5_hh(d,%20a,%20b,%20c,%20x[i+%204],%2011,%20%201272893353);c%20=%20md5_hh(c,%20d,%20a,%20b,%20x[i+%207],%2016,%20-155497632);b%20=%20md5_hh(b,%20c,%20d,%20a,%20x[i+10],%2023,%20-1094730640);a%20=%20md5_hh(a,%20b,%20c,%20d,%20x[i+13],%204%20,%20%20681279174);d%20=%20md5_hh(d,%20a,%20b,%20c,%20x[i+%200],%2011,%20-358537222);c%20=%20md5_hh(c,%20d,%20a,%20b,%20x[i+%203],%2016,%20-722521979);b%20=%20md5_hh(b,%20c,%20d,%20a,%20x[i+%206],%2023,%20%2076029189);a%20=%20md5_hh(a,%20b,%20c,%20d,%20x[i+%209],%204%20,%20-640364487);d%20=%20md5_hh(d,%20a,%20b,%20c,%20x[i+12],%2011,%20-421815835);c%20=%20md5_hh(c,%20d,%20a,%20b,%20x[i+15],%2016,%20%20530742520);b%20=%20md5_hh(b,%20c,%20d,%20a,%20x[i+%202],%2023,%20-995338651);a%20=%20md5_ii(a,%20b,%20c,%20d,%20x[i+%200],%206%20,%20-198630844);d%20=%20md5_ii(d,%20a,%20b,%20c,%20x[i+%207],%2010,%20%201126891415);c%20=%20md5_ii(c,%20d,%20a,%20b,%20x[i+14],%2015,%20-1416354905);b%20=%20md5_ii(b,%20c,%20d,%20a,%20x[i+%205],%2021,%20-57434055);a%20=%20md5_ii(a,%20b,%20c,%20d,%20x[i+12],%206%20,%20%201700485571);d%20=%20md5_ii(d,%20a,%20b,%20c,%20x[i+%203],%2010,%20-1894986606);c%20=%20md5_ii(c,%20d,%20a,%20b,%20x[i+10],%2015,%20-1051523);b%20=%20md5_ii(b,%20c,%20d,%20a,%20x[i+%201],%2021,%20-2054922799);a%20=%20md5_ii(a,%20b,%20c,%20d,%20x[i+%208],%206%20,%20%201873313359);d%20=%20md5_ii(d,%20a,%20b,%20c,%20x[i+15],%2010,%20-30611744);c%20=%20md5_ii(c,%20d,%20a,%20b,%20x[i+%206],%2015,%20-1560198380);b%20=%20md5_ii(b,%20c,%20d,%20a,%20x[i+13],%2021,%20%201309151649);a%20=%20md5_ii(a,%20b,%20c,%20d,%20x[i+%204],%206%20,%20-145523070);d%20=%20md5_ii(d,%20a,%20b,%20c,%20x[i+11],%2010,%20-1120210379);c%20=%20md5_ii(c,%20d,%20a,%20b,%20x[i+%202],%2015,%20%20718787259);b%20=%20md5_ii(b,%20c,%20d,%20a,%20x[i+%209],%2021,%20-343485551);a%20=%20safe_add(a,%20olda);b%20=%20safe_add(b,%20oldb);c%20=%20safe_add(c,%20oldc);d%20=%20safe_add(d,%20oldd);}return%20Array(a,%20b,%20c,%20d);}function%20md5_cmn(q,%20a,%20b,%20x,%20s,%20t){return%20safe_add(bit_rol(safe_add(safe_add(a,%20q),%20safe_add(x,%20t)),%20s),b);}function%20md5_ff(a,%20b,%20c,%20d,%20x,%20s,%20t){return%20md5_cmn((b%20&%20c)%20|%20((~b)%20&%20d),%20a,%20b,%20x,%20s,%20t);}function%20md5_gg(a,%20b,%20c,%20d,%20x,%20s,%20t){return%20md5_cmn((b%20&%20d)%20|%20(c%20&%20(~d)),%20a,%20b,%20x,%20s,%20t);}function%20md5_hh(a,%20b,%20c,%20d,%20x,%20s,%20t){return%20md5_cmn(b%20^%20c%20^%20d,%20a,%20b,%20x,%20s,%20t);}function%20md5_ii(a,%20b,%20c,%20d,%20x,%20s,%20t){return%20md5_cmn(c%20^%20(b%20|%20(~d)),%20a,%20b,%20x,%20s,%20t);}function%20safe_add(x,%20y){var%20lsw%20=%20(x%20&%200xFFFF)%20+%20(y%20&%200xFFFF);var%20msw%20=%20(x%20%3E%3E%2016)%20+%20(y%20%3E%3E%2016)%20+%20(lsw%20%3E%3E%2016);return%20(msw%20%3C%3C%2016)%20|%20(lsw%20&%200xFFFF);}function%20bit_rol(num,%20cnt){return%20(num%20%3C%3C%20cnt)%20|%20(num%20%3E%3E%3E%20(32%20-%20cnt));}function%20str2binl(str){var%20bin%20=%20Array();var%20mask%20=%20(1%20%3C%3C%208)%20-%201;for(var%20i%20=%200;%20i%20%3C%20str.length%20*%208;%20i%20+=%208)bin[i%3E%3E5]%20|=%20(str.charCodeAt(i%20/%208)%20&%20mask)%20%3C%3C%20(i%20%25%2032);return%20bin;}function%20binl2hex(binarray){var%20hex_tab%20=%20%270123456789abcdef%27;var%20str%20=%20%27%27;for(var%20i%20=%200;%20i%20%3C%20binarray.length%20*%204;%20i++){str%20+=%20hex_tab.charAt((binarray[i%3E%3E2]%20%3E%3E%20((i%254)*8+4))%20&%200xF)%20+%20hex_tab.charAt((binarray[i%3E%3E2]%20%3E%3E%20((i%254)*8))%20&%200xF);}return%20str;}function%20mpwd_doIt(){var%20master=document.getElementById(%27masterpwd%27).value;if%20(master%20!=%20%27%27%20&&%20master%20!=%20null)%20{re%20=%20new%20RegExp(%27https*://([^/]+)%27);host%20=%20document.location.href.match(re)[1];var%20i=0,%20j=0,%20p=hex_md5(master+%27:%27+host).substr(0,8),%20F=document.forms;for(i=0;i%3CF.length;i++){E=F[i].elements;for(j=0;j%3CE.length;j++){D=E[j];if(D.type==%27password%27){D.value=p;D.focus();}if(D.type==%27text%27){if(D.name.toUpperCase().indexOf(%27PASSWORD%27)!=-1||D.name.toUpperCase().indexOf(%27PASSWD%27)!=-1){D.value=p;D.focus();}}}}}document.getElementsByTagName(%27body%27)[0].removeChild(document.getElementById(%27mpwd_panel%27));};function%20getPwdFld()%20{var%20L%20=%20document.getElementsByTagName(%27input%27);for%20(var%20i%20in%20L)%20{var%20nm%20=%20L[i].getAttribute(%22name%22)%20||%20%22%22;var%20tp%20=%20L[i].getAttribute(%22type%22)%20||%20%22%22;if%20((tp%20==%20%22password%22)%20||(tp%20==%20%22text%22%20&&%20nm.toLowerCase().substring(0,5)%20==%20%22passw%22))%20{return%20L[i];}}return%20null;}function%20panel()%20{var%20pwdTop%20=%200;var%20pwdLeft%20=%200;try%20{var%20obj%20=%20getPwdFld();if%20(obj.offsetParent)%20{while%20(obj.offsetParent)%20{pwdTop%20+=%20obj.offsetTop;pwdLeft%20+=%20obj.offsetLeft;obj%20=%20obj.offsetParent;}}}%20catch%20(e)%20{pwdTop%20=%2010;pwdLeft%20=%2010;}var%20div%20=%20document.createElement(%27div%27);div.style.padding=%274px%27;div.style.backgroundColor=%27yellow%27;div.style.border=%272px%20dotted%20red%27;div.style.position=%27absolute%27;div.style.top%20=%20pwdTop%20+%20%27px%27;div.style.left%20=%20pwdLeft%20+%20%27px%27;div.style.opacity=%27.9%27;div.setAttribute(%27id%27,%20%27mpwd_panel%27);div.appendChild(document.createTextNode(%27Master%20password:%20%27));var%20frm%20=%20document.createElement(%27form%27);frm.action=%27javascript:void(0);%27;div.appendChild(frm);var%20pwd%20=%20document.createElement(%27input%27);pwd.setAttribute(%27type%27,%27password%27);pwd.setAttribute(%27id%27,%27masterpwd%27);frm.appendChild(pwd);var%20ok%20=%20document.createElement(%27input%27);ok.setAttribute(%27type%27,%27submit%27);ok.setAttribute(%27value%27,%27OK%27);ok.onclick%20=%20mpwd_doIt;frm.appendChild(ok);document.getElementsByTagName(%27body%27)[0].appendChild(div);setTimeout(%22document.getElementById(%27masterpwd%27).focus();%22,%20333);};panel();})();

Rechtstaat und Demonstration

Ist schon etwas her, aber  fand ich trotzdem total spannend.

Immerhin, wer weiß wer demnächst noch alles demonstrieren muss?

Und noch ein Schlag gegen die Abmahner

Zuerst die gute Nachricht:

Das  LG München hat geurteilt, das Rechteinhaber nur aufgrund der IP-Adresse und Zeit kein Recht erhalten die Persönlichen Daten dieses Internet-Nutzers zu bekommen.

Wie es in den Kommentaren auf  Golem jemand sagt: "Das wirkt ja fast so, als ob die Gerichte jetzt auf einmal mit gesundem Menschenverstand entscheiden würden.".

Dabei hat das Urteil für mich aber noch so ein Geschmäckle - es ist nämlich so, das der Kläger der Inhalteindustrie ein Porno-Vertreiber war.

Da stellen sich mir mehrere Fragen

  • Warum ausgerechnet ein Porno-Anbieter? Trauen sich die Herren Richter nicht an die Musik-/Filmindustrie heran und wollten sich nicht von denen das Leben / die Karriere versauen lassen?
  • Hat da vielleicht jemand zu wenig geschmiert?
  • Hat der Porno-Anbieter sich vielleicht besonders doof angestellt? Immerhin ist teil der Urteilsbegründung explizit, das der Rechteinhaber offenbar kein Interesse daran habe der Urheberrechtsverletzung nachzugehen, sondern den Betroffenen lediglich abmahnen wollte.

Unklarheiten über unklarheiten.

Ich persönlich vermute ja das er sich tatsächlich einfach zu doof angestellt hat und in der Klage direkt geschrieben hat, das er ja schließlich die Leute abmahnen wolle und das Gericht das zum Anlass genommen hat das zu sagen was sie schon lange mal sagen wollten, aber aufgrund geschickterer Formulierung der Klagen seitens der Musikindustrie nie sagen konnten.

Tja, find ich gut.

Vom Populismus

Schon bezeichnend für unsere politische Landschaft das das immer mehr zu einem Schow-Theater verkommt. Inspiriert durch  die Analyse von Maha hab ich da nochmal über das Killerspiele Argument nachgedacht.

Kurz Zusammengefasst: Ein Mensch sieht sich so in die Enge gedrängt das er irgendwann durchdreht und zum Amokläufer wird.

Darauf dann die typische Reaktion: Dieser Mensch hat Killerspiele gespielt, ergo waren die Schuld, ergo müssen wir Killerspiele verbieten.

Völlig ungeachtet der Tatsache das Killerspiele für Jugendliche sowieso schon verboten sind und man sich jetzt lediglich darüber unterhält, dass eben auch für Erwachsene zu verbieten.

Wieder völlig ungeachtet der Tatsache, das natürlich alle diese Spiele übers Internet trivial zu haben sind.

Einfach schade, das man mit solchen einfachen Strohmännern jede sinnvolle Beschäftigung mit dem Thema komplett verhindert wird.

hg <-> svn

Tja... leider nicht so einfach wie ich dachte.

Meine Versuche mit  BZR die verbindung herzustellen, haben leider nicht geklappt. Das  hg-plugin dort läuft mit der aktuellen Version leider nicht mehr - und hat auch keine Unit-Tests, sonst hätte ich mir ja schon mal etwas Zeit genommen um zu schauen woran es liegt.

Aber so...

Egal.

Was doch geklappt hat, ist mit  hgimportsvn einen svn checkout zu machen. Mit einem lokalen hg clone konnte ich dann Arbeiten und auf den svn-checkout zurückschieben und dann von dort comitten.

Vorteil:

  • Es geht überhaupt

Nachteil:

  • Alle commit Kommentare gehen verloren
  • Ich kann lokal so oft comitten wie ich will - im Subversion kommt nur ein commit an. :-/

Eher unbefriedigend. Aber immerhin kann man überhaupt an einem SVN-Checkout arbeiten.

Das Internet an Frau Merkel

 Das internet schrieb einen Brief

!!1!!!!(elf)!!!1!!!

Pavel bringt es einfach auf den Punkt.

(via  fefe,  frank)

BZR -> SVN

Puah. Nach viel Gefrickel hab ich es endlich zum laufen gebracht.

Jetzt kann ich mit bzr von svn auschecken, lokal arbeiten (mit voller historie) und auch wieder comitten.

Was mich beim letzten mal? noch aufgehalten hatte war ein Bug, der in der neuesten Version zwar gefixt ist - aber man musste zusätzlich noch die ~/.bazaar/subversion.conf wegschmeißen.

Ach ja, und einen neuen Branch vom Subversion machen, das  rebase Plugin installieren und mit cd $NEW_BRANCH_LOCATION && bzr replay $OLD_BRANCH_LOCATION -r $REVISIONS_TO_GET die alten Patches holen.

Eigentlich ganz einfach wenn man es mal raushat. Und dann kann man das auch von dort aus in den SVN comitten.

Yeah. (Danke an  Jelmer Vernooij für die Hilfe beim fixen der Probleme)

Das neue Fazit: BZR: gut GIT: gut HG: kann bisher noch nicht ins SVN comitten - aber immerhin  arbeitet da jetzt jemand dran.

Bleibt noch den bzr hg modus auszuprobieren ob ich damit ins subversion comitten kann.

  • Posted: 2008-04-27 14:43 (Updated: 2008-04-27 14:48)
  • Author: dwt
  • Categories: code links
  • Comments (0)

Das neue Ubuntu ist da

Ubuntu: Die Linux distribution die am meisten Wert auf Usability legt!

Error message of installer when quitting

Fuck yeah!

*rofl*

 Bug Filed

  • Posted: 2008-04-26 17:45 (Updated: 2009-10-24 16:23)
  • Author: dwt
  • Categories: fnord
  • Comments (0)

Function Call vs. Message Send

Oder: Wieso mich die Lisp Syntax so stört.

In meiner Freizeit beschäftige ich mich gerade mit dem Buch  Practical Common Lisp.

Das Buch gefällt mir auch ganz gut - vielleicht abgesehen davon das er 'loop etwas zu häufig verwendet - ohne es zu erklären - was den Code gerade am Anfang reichlich magisch macht.

Aber: Worum es mir eigentlich geht, ist die Syntax von Lips. Nicht die Klammern, nicht die Einrückung, nicht die Art wie man es schreibt, sondern schlicht die Reihenfolge.

Weil: in Lisp ist erst einmal alles auf Funktionen abgebildet. Und das hat Vorteile aber eben auch einen gravierenden Nachteil: Jede Funktion muss immer als erstes in einem Funktionsaufruf Tupel stehen.

(funktion argument-eins argument-zwei)

Das ist ein Problem, weil man bei verschachtelten Funktionsaufrufen (auch schon bei nur sehr wenigen Ebenen) sehr schnell den Überblick verliert welcher Funktionsaufruf zu welchem argument gehört.

(funktion (funktion-zwei argument-eins (funktion-drei argument-eins argument-zwei)) argument-zwei)

Das kann man jetzt natürlich auch als Feature sehen, weil man gezwungen wird seinen Code vernünftig einzurücken und keine zu langen Funktionen zu schreiben

(funktion (funktion-zwei argument-eins
                     (funktion-drei argument-eins argument-zwei)) 
        argument-zwei)

Das hilft, aber eben nur so weit. Vor allem weil man beim Lesen von Code immer eine interne herumdrehung machen muss um den Code korrekt zu lesen.

(defparameter a-list (list 1 2 3 4 5))

(car (cdr (cdr (cdr a-list))))

Soll (wenn (ich) (mich nicht verschrieben) habe) 5 ergeben.

Aber man muss es von innen nach aussen lesen, damit man es richtig versteht.

Und das erfordert jede menge Geistige Kapazität, die besser beim finden von guten Namen für Variablen und Funktionen aufgehoben ist. Viel besser.

Jetzt zum Message-Passing - das ist zwar fundamental "weniger mächtig" als der Funktionsaufruf, weil man zum Beispiel generische Funktionen nicht oder nicht so gut implementieren kann, ABER: man kann viel besser mit dem resultat eines vorherigen Aufrufes das nächste tun.

Weil die Reihenfolge in der die Sachen ausgeführt werden die gleiche ist in der die Sachen auf dem Bildschirm stehen.

Und das ist eine ganze Menge besser les- und versteh-bar als die Funktion es jemals sein kann.

Das war es was  Alan Kay meinte, als er sagt das das wichtigste an  Smalltalk nicht die Objektorientierung, sondern das  Message Passing gewesen ist.

Yay, wir sind im Fernsehen!

 RKA hat es als  Berliner Vorstand  ins 3sat geschafft.

Gleich er erste Beitrag.

:-) Glückwunsch!

Programme sind auch nur eine Sprache

Das wissen wir ja alle - sind schließlich Informatiker.

Und Programme sollte man analysieren, damit man sich darüber im Klaren ist was sie tun.

Und aus Programm == Sprache folgt damit das man auch Sprache genau analysieren sollte, damit man versteht was sie tut.

Und das macht  MaHa hervorragend im Chaosradio 81.

Dieser Song kostete jetzt nur noch.... 100€!

Heimlich still und leise wurde die Urheberrechtsnovelle durchgeführt - und jetzt haben wir den Salat.

Wieder mal hat die Bundesregierung innovative neue Geschäftsmodelle kaputt gemacht und einer jungen und enorm wachsenden Branche den Hals gebrochen.

Denn, die erstmalige Abmahnung wegen privatem Urheberrechtsbruch darf jetzt nur mehr 100 € kosten.

Yay!

Der FDP war das natürlich zu billig, den Grünen zu teuer - ich finds ok.

Lustig find ich das ein Staatssekretär Hartenbach wohl die Deckelung ganz wesentlich vorangetrieben hatte, weil er selber schon zweimal abgemahnt wurde.

:-) Demokratur ist doch was feines.

Via:  Küchenradio  iRights

Geil...

Wuala vs. Tahoe

 Wuala und  Tahoe sind zwei technisch ähnliche Systeme mit dem gleichen Ziel: Sicher Online Dateien tauschen und speichern können.

Und das Verteilt, Verschlüsselt, Dateisystemsemantik. Als Modell haben sich beide ein Verschlüsselungs und Rechtesystem ausgedacht die ein Friendt-to-Friend Netzwerk möglich machen - also ein Netzwerk in dem man alles einstellen kann was man möchte, aber mit der Sicherheit, das nur derjenige dem man das erlaubt hat die Daten sehen kann.

Naja, eigentlich ein etwas unfaierer Vergleich.

Denn, hinter Wuala steht ein Startup, eine Firma also die jede Menge Geld in den Aufbau des Netzwerkes steckt (Interessanterweise handelt es sich dabei um eine  Ausgründung aus der ETH Zürich. Das erlaubt es dem Netzwerk jedem Benutzer erst einmal 1 Gigabyte Speicherplatz zu schenken (und ein weiteres für jeden Benutzer den man wirbt) und eben auch mittels zentraler Server, die Benutzung das Projekt vor allem am Anfang enorm zu beschleunigen und damit eine bessere User Experience zu bieten.

Auf der anderen Seite ist  Tahoe ein reinrassiges Open Source Projekt.  Buildserver,  Repositories ( Darcs), Trac... alles da.

Dafür ist das Programm noch deutlich unfertig. Immerhin gibt es am Anfang einen schönen Login Dialog - aber das war es auch erstmal.

Ah well, die Entwickler im IRC-Kanal #tahoe sind jedenfalls sehr hilfreich und nett - und der größte Teil des Projekts ist in Python geschrieben. Das ist doch schon mal was.

:-)

"Das Grundgesetzt ist die Institutionalisierung des Misstrauens der Bürger gegen den Staat"

Die Grundrechte sind ein Institutionalisiertes Misstrauen gegen den Staat. Der Bürger hat Sorge vor einem übermächtigen Staat und deswegen werden ihm als Schutzmaßnahme die Grundrechte zur verfügung gestellt. Herr Schäuble und andere machen das genau umgekehrt. Die haben ein prinzipielles Misstrauen des Staates gegen den Bürger.

Sagt Wolfgang Nešković  in einem Interview beim Küchenradio.

Wolfgang Nešković ist übrigens der Bundesrichter dem wir die Gesetzgebung der  Geringen Menge zu verdanken haben.

Ja, das Interview ist schon eine Weile her, aber an Aktualität kaum zu übertreffen.

OpenWRT

Funkt.

Jetzt endlich sogar kabellos verbunden mit meiner restlichen Infrastruktur.

Schon spannend was das System alles an Paketen mitbringt.

  • Aircrack-ng
  • Aircrack-ptw
  • etc...

Die volle Ausstattung um Unsinn zu treiben. :-)

Dazu noch die Pläne der Freifunker, einen La Fonera Router mit Notebook-Baterien im Rucksack liegen zu haben, der Mesh und gleichzeitig vorhandene Netze Attakieren öffnen kann...

:-)

Leider kann das gegenwärtige OpenWRT noch keinen AdHoc Modus gleichzeitig mit etwas anderem anbieten (sonst könnte der Accesspoint bis zu 4 Netzwerke gleichzeitig anbieten) so dass es nicht möglich ist, das er über ein Normales WLAN Netz sein Internet bezieht und diesen dann über das Mesh weiter gibt.

Andererseits gibt es den  La Fonera Pack, der auf das normale Fonera zusätzlich zu der Fonera Dienstleistung noch das Meshing anbietet.

Also muss es wohl doch irgendwie gehen.

Nur wie?

Freifunk

Ha!

Es Funkt. Frei.

Naja fast. Jedenfalls funkt das  OpenWRT schon mal. An dem  Freifunk arbeite ich noch.

Immerhin gibt es ein paar Straßen weiter wohl noch weitere 3 Leute die Freifunk machen. Interessanterweise wohl auch immer gleich sowohl  OLSR als auch  B.A.T.M.A.N..

Na mal schaun wie das läuft. Auf dem  Fonera soll ja zusätzlich auch noch FON als Dienst laufen.

Ah well, schaun mer mal.

Wenn die Hardware tatsächlich an Hitzeproblemen verstirbt, muss ich halt ein neueres Modell nachbestellen.

Wer, wer, wer, wer, wer hat uns verraten?

HG, BZR und GIT

(zu  Hotaka)

Well, am WE hab ich mich mit  Felix gerade über Versionskontrollsysteme und unsere Experimente mit  HG unterhalten, als mich jemand 'von der Seite angemacht' hat, dass doch wohl im Moment alle Welt weg von HG und hin zu  GIT wechseln würde.

Well, das konnte ich so nicht glauben, aber ich wollte mir die verschiedenen Tools dann doch mal anschauen - vor allem in Hinsicht auf  SVN Kompatibilität - denn ich setze SVN sowohl für meine  Arbeit, also auch für mich Privat ein.

Na, denn ma auf zu dem Vergleich:

GIT

... hab ich mir als erstes dran genommen, und bin erst mal dran gescheitert, das das perl-script, dass den SVN-Modus macht via Fink natürlich nicht mit meiner Installation zusammenwollte, weil diese alten Perlhacker natürlich alle davon ausgehen, das Perl in /usr/bin/perl liegt. Well, tut es bei mir nicht, bzw, in /usr/bin liegt eine alte version von Perl, die eine bestimmte Library nicht enthält, die aber das Skript benötigt. ARGH! Also erst mal einen Patch zusammengebaut und an den Maintainer geschickt der das auf /usr/bin/env perl ändert. Oh well.

Danach war aber eigentlich alles dandy, bis auf die Tatsache, das ich trotz längerem nachlesen ums verrecken nicht verstanden habe, welchen Sinn diese komische Staging-Area "Index" haben soll, die man bei GIT immer zuerst mal auffüllen muss, bevor man sie Comitten kann.

Well, GIT is powerfull - aber für meinen Geschmack zu sehr an den Geschmack von Herrn Torvalds angepasst. Mag ja sein das er nur mit inkonsistenten und komplizierten Kommandozeilenoptionen effizient arbeiten kann. Ich jedenfalls hab was besseres verdient. Ausserdem erzeugt es bei mir Ablehnung wenn Herr Torvalds aus seiner Göttlichen Eingebung sämtliches anderes für Mist erklärt und dann etwas neues macht was deutlich komplizierter ist als die anderen - ohne das klar wird, wieso diese Komplexität der richtige Default ist und man nicht das Einfache zum Default machen kann, um das komplizierte als Option anzubieten.

Fazit: Funktioniert, push und pull zum SVN server waren kein Problem und das ist schon mal ein starkes Stück. Beindruckendes Tool, dass aber auch viel Ablehnung in mir erzeugt.

 BZR

... war dann der zweite Kandidat, der nicht mehr viel Langsamer daherkommt als die anderen beiden (allerdings auch nicht zacko schnell). Allerdings, gibt es eine nette Extension die das Kommando shell hinzufügt. Das ist nett, denn dann hat man eine native Shell in bzr und hat superschnelle reaktionen, Tabvervollständigung überall, etc.

Der Checkout aus SVN hat auch prima geklappt (die Anfangsschwierigkeiten hatte ich vor einem halben Jahr, als ich mir die SVN-Python-Bindings selber bauen musste. ARGH war das ein Kampf.) Jetzt hatte ich sie aber schon und mir auch schon die notwendigen Wrapper-Skripte gebaut die die Library dann halt noch dazuladen.

Well, was soll ich sagen: pull vom SVN war hervorragend, lokales arbeiten auch, aber das Push.. das stirbt immer mit Fehler 175008 (ernsthaft!) und wirft mir dann noch an den Kopf das irgend eine property nicht angewendet werden konnte. Wenn er wenigstens sagen würde welche Property das Problem ist.. Aber naja.

Fazit: Sehr poliert. Gerade im Vergleich zu meinem letzten Test ist die Dokumentation viel besser geworden, das ganze Tool wirkt durchdacht. Vor allem der Output der Kommandos hat mir gefallen, schön aufgeräumt und übersichtlich. Dann ist da natürlich die Tatsache das dieses Tool doch immer noch das einzige ist, das tatsächlich Verzeichnisse auch Versionieren kann und mit renames vernünftig umgeht. Ahh.... Endlich ohne scheu refaktorn. :-)

HG

... will ich eigentlich schon länger mal benutzen, aber es hat mir bisher immer nur zu ein paar kleinen Experimenten gereicht. Allerdings: Felix hat sich schon anstecken lassen und verwendet das jetzt nahezu ausschließlich.

Well, mein Testcase hat leider gar nicht Funktioniert. Einigen  Anmerkungen hatte ich entnommen das HG jetzt auch auf SVN zurückschreiben kann herausgefunden wie das geht, hab ich aber leider nicht. Oh well.

Fazit: Schnell, gute Bedienung und Python - aber ungeeignet um damit gegen SVN Repositories zu Arbeiten.

Fazit Fazit

So, dann bleibt mir also die Wahl: entweder GIT zu akzeptieren um damit gegen SVN zu arbeiten, oder aber den Bug in BZR zu finden um dann damit zu Arbeiten.

Vom Bauchgefühl her würde ich mich eigentlich lieber an BZR heranmachen. Mögen tue ich HG am liebsten, das hat einfach das einfachste Design und auch noch eine sehr gute Integration in das System - so öffnet es zum Beispiel standardmäßig gleich das System Merge-Tool (opendiff) anstatt CVS like Konflitkmarker in der Datei zu verstreuen.

So macht man dass.

BZR ist auf jeden fall mein zweiter Favorit - auch Python (kann ich also Hacken) und schön durchdacht - wenn auch manchmal etwas verbose zu bedienen (pull z.B. macht kein merge, aber er sagt einem dann das man statt pull merge machen müsste. ???)

GIT wirkt wie eine mächtige Kanone - ja man kann damit auch auf Spatzen schießen - ja danach wären sie tot - aber muss man sich das wirklich antun, das jeder normale Usecase ein wenig Komplizierter zu handhaben ist als mit den anderen Tools, nur damit man im zweifelsfall auch den Linux-Kernel mit dem gleichen Tool Maintainen kann?

Ich jedenfalls beantworte diese Frage für mich mit einem klaren nein. Und werde mich jetzt erstmal auf bzr und hg werfen.

Eine Schreibmaschine... sort of :-)

Kleine Graphik-Schmankerl

Ich habe mich über die letzten zwei Tage erneut  von Katrin inspirieren lassen.

Herausgekommen ist ein kleines Cocoa-Programm Download (Source) dass ein wenig mit solchen Grid-Animierten Ansätzen herumspielt und nebenbei noch ein wenig Sheets und Preferences verwendet.

Interessant ist dabei für mich der unterschiedliche Ansatz: Katrin war wichtig, das jeder Display Vorgang in konstanter Zeit abläuft und sie verwendet daher eine Liste der einzelnen Rechtecke. Ich hatte mir das auch überlegt, mich dann aber dagegen entschieden weil es komplexer zu Programmieren gewesen wäre.

Geschwindigkeit hat sich dann im Test überhaupt nicht als Problem herausgestellt - aber das grundsätzliche Problem bleibt. War es vernünftig den Code erst einmal einfach zu halten? Ich bin überzeugt das ja.

Ganz zufrieden bin ich aber noch nicht, weil das einzige Objekt ein View und gleichzeitig der Controller für die Preferences des Programms ist.

Aber - das Programm ist so auch kurz und Übersichtlich.

Hm.

Mal schauen was ich noch daraus mache. Vorschläge für interessante und auf dem modell ausdrückbare Algorithmen immer gerne an mich.

Hier noch ein paar Screenshots:

Screenshot Brownian Motion Algorithmus

Screenshot Random Cycle and Prefs

Vom Sprachdesign: Konstruktoren

Endlich ist mir wieder so ein Punkt klargeworden, der mich schon lange an Python stört, den ich aber bisher noch nicht so richtig spezifizieren konnte.

Zusammenfassen lässt es sich als: Konvention ist besser als eine eigene Syntax / Regel.

Konkret geht es um folgendes: Python besitzt eine eigene Syntax für Konstruktoren. Nämlich diese:

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

point = Point(10, 15)

Der Konstruktor eines Objekts heißt immer __init__ (das mit den Unterstrichen finde ich sowieso hässlich, aber well, darüber ärgere ich mich wan anderes).

Das ist gut, weil man so den Konstruktor immer gleich findet.

ABER: Das ist total scheiße wenn man mehrere Wege braucht um ein Objekt zu initialisieren.

Denn genau wie in Java auch, kann man anhand den Argumenttypen ja keinen dispatch machen. Doh.

Also, wenn man das Beispiel erweitern will um auch Polarkoordinaten zu unterstützen, dann geht das nicht, denn bei

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __init__(self, theta, phi)
        self.x = ...
        self.y = ...

point = Point(10, 15)

kann die Runtime nicht mehr auflösen welchen Konstruktor mann denn jetzt genau gemeint hat.

Doh.

Jetzt hat man entweder die Wahl so etwas zu machen wie hier im  Trac-Projekt

class WikiPage(object):
    """Represents a wiki page (new or existing)."""

    realm = 'wiki'

    def __init__(self, env, name=None, version=None, db=None):
        self.env = env
        if isinstance(name, Resource):
            self.resource = name
            name = self.resource.id
        else:
            self.resource = Resource('wiki', name, version)
        self.name = name
# ....

Was aber total ekelig ist, denn jetzt hat der Konstruktor auf einmal einen Parameter name der überhaupt nicht mehr dass ist, was er mit seinem Namen dokumentiert.

Klasse. Jetzt muss man tatsächlich den Code des Konstruktors lesen um zu verstehen was für Argumente man benötigt um so ein Objekt zu erzeugen. Habt ihr wirklich gut gemacht!!!!11!!

Oder aber man scheißt auf das Konzept eines Konstruktors und schreibt Factory-Methoden, also im Beispiel etwa so:

class WikiPage(object):
    """Represents a wiki page (new or existing)."""

    realm = 'wiki'

    @classmethod()
    def create_from_resource(klass, env, resource, db=None):
        page = WikiPage(env, resource.id, resource.version, db)
        page.resource = resource
        return page

    def __init__(self, env, name=None, version=None, db=None):
        self.env = env
        self.resource = Resource('wiki', name, version)
        self.name = name
# ....

Das ist jetzt immerhin klarer - hat aber den Nachteil das der Leser jetzt wissen muss dass man Factory Methoden einsetzt und welche (nichtstandardisierte) Konvention man für diese einsetzt. Na Klasse.

Ergo: Die Sprachdesigner haben sich gedacht, das es ja eine Tolle Sache wäre, wenn sie eine eigene Syntax einführen würden, damit Konstruktoren etwas besonderes sein können und haben damit erreicht, dass man sich beim tatsächlichen Programmieren jetzt auf einmal ein Bein Brechen muss, damit man ganz alltägliche Probleme auf eine saubere Art und Weise lösen kann.

Ganz groß.

Hätte man doch von vornherein anerkannt, das ein Konstruktor auch nur eine Methode ist - mit der Konvention dass der Name mit "init" anfängt - dann existierten auf einmal diese Probleme nicht mehr. Denn dann kann man über den namen der Methode dokumentieren was sie soll.

class Point:

    def init_cartesian(self, x, y):
        self.x = x
        self.y = y
        return self
    
    def init_polar(self, theta, phi):
        # ...
        return self

cartesian = Point().init_cartesian(10, 15)
polar = Point().init_polar(0.23, 0.23)

Yucheh!

Dazu kommt, dass man dann auf einmal sinnige Dinge tun kann, wie zum Beispiel, das ein "Konstruktor" nicht immer die gleiche Klasse zurückgeben muss. Man könnte also zum Beispiel eine öffentliche Superklasse haben, die aber tatsächlich in mehreren privaten Subklassen implementiert ist - zum Beispiel ein String, der je nachdem wie er erzeugt wird anders aussieht: Stringkonstanten vielleicht eine Klasse die nicht/anders an der Garbage-Collection teilnimmt und dafür Uniqued (also garantiert nur einmal) existieren (für einen schnelleren Interpreter interessant), Strings aus einer Datei entweder normal, oder falls die Datei eine gewisse Größe überschreitet als Memory-Mapped File, Strings die Pfade repräsentieren so, dass sie mit den Eigenheiten von Dateisystemen besser klarkommen, Strings die keine Unicode enthalten noch mal anders, damit sie effizienter sein können.... etc.

Und das alles, weil man auf Sprachebene auf ein zusätzliches Konzept verzichtet.

Aber dass, scheint ja für Sprachdesigner das Schwerste zu sein.

[http://de.wikiversity.org/wiki/Hauptseite Wikiversity]

Ist ein Schwesterprojekt der  Wikipedia.

Man sieht sich als eine Plattform zum gemeinschaftlichen Lernen, Lehren, Nachdenken und Forschen.

Könnte das der lang ersehnte nächste Evolutionsschritt der Universität sein? Das wie sie in 10 Jahren aussieht?

Mal genauer schauen. Morgen.

Aircrack auf dem iPhone

Will man sowas haben?

Wäre ja schließlich ein Hackerwerkzeug und damit verboten.

Nun, wer will da schon. Immerhin würde man damit ja schließlich normale WEP-Verschlüsselung in so etwa einer Minute entschlüsseln können.

Pah...

Aber  Ankucken ist ja nicht verboten.

:-)

Was willst du in der Piratenpartei?

Ich will das die Partei transparent ist und bleibt. Jeder der dabei ist oder sich dafür interessiert soll komplett sehen können wie und an was wir arbeiten. Geheimniskrämerei ist nicht.

Ich will das die Partei Demokratie neu erfindet. Das Internet verspricht, dass man sich einfach und so tief man möchte, in die Themen einbringt die einen Interessieren und von denen man etwas versteht. Dieses Versprechen gilt es zu umzusetzen und gleichzeitig die Grundsätze der gleichen, freien und geheimen Wahl zu erhalten.

Hohe Ziele. Vor allem das letzte ist haarig. Denn: Wahlcomputer und mit ihnen alle Systeme die ich bisher kenne, haben einen gravierenden Nachteil: Bei einer normalen Wahl, kann man jeden x-beliebigen Erwachsenen bitten die Wahl zu beaufsichtigen. Wenn man ihm dann noch 3 Minuten lang erklärt wie alles funktioniert, kann er den ganzen Tag zusehen (er hatte vermutlich eh gerade nix zu tun) und am Abend dann mit voller Überzeugung verkünden dass dort alles korrekt abgelaufen ist (wenn dem denn so war).

Das geht mit technischen Systemen bisher nicht - und das ist ein Problem. Aber da sind wir garantiert die einzige Partei die das lösen kann.

  • Posted: 2008-04-07 22:12 (Updated: 2008-04-07 22:13)
  • Author: dwt
  • Categories: politik
  • Comments (0)

Programmieren Lernen - mit Scheme?

Meine Freunden hat sich mal damit beschäftigt. Und da dachte ich, schauste doch mal was es da so gibt.

Klaro das große alte  SICP, der Großvater aller großartigen Programmierbücher mit Tiefgang. Gleichzeitig aber natürlich auch ziemlich Tief und für jemanden der sonst von Informatik nicht so viel Ahnung hat vielleicht zu viel.

Das sehen  andere  Leute auch so und daher gibt es inzwischen einen Nachfolger: Das  HTDP.

Well, die Haupt Kritik war eigentlich das das Buch zu viele Grundlagen in der Elektrotechnik verlange und zu tief in die Konstruktion von Computern hineingeht, dabei aber gleichzeitig zu wenig darüber erklärt wie man eigentlich ein größeres Programm aufzieht.

Und genau das wollten sie anders machen.

Gut fand ich dass Sie sich mühe geben jede ihrer Kapitel mit einem Rezept abzuschließen, in dem dann Dinge stehen wie "Mach dir erst Gedanken darüber was aus deinen Funktionen herauskommen muss bevor Du sie implementierst, damit Du Logikfehler besser finden kannst. - Schon mal ein guter Ansatz.

Dazu kommt durchweg eigentlich ein recht sauberer Programmierstil mit dem ich durchaus leben kann.

Was mir eher auf den Geist ging: Die ganze Zeit über predigen sie es, dass man zu jeder Funktion einen "Kontrakt" schreibt, der erklärt welche Typen man erhält und welche man zurückgibt.

Well, das ist ja ganz schön, aber entweder, soll man eine Sprache mit Typechecking nehmen, oder es lassen. Die Dokumentation ist zwar ganz nett - aber dann doch bitte so, dass man die Variablen so eindeutig benennt, das keine Typ-Unsicherheiten auftreten.

So sind die Kommentare (von denen sie pro Funktion mindestens drei bis fünf Zeilen haben wollen) nach der ersten Änderung einer Funktion nicht mehr aktuell.

:-(

Dazu kommt, dass der Klammernwald von Scheme, natürlich gerade für Anfänger schnell mal verwirrend wird und ohne Editor-Unterstützung gar nicht handhabbar ist. Andererseits: da gewöhnt man sich gleich daran kleine Funktionen zu schreiben...

Was ich auch merkwürdig finde ist, dass den studenten die wirkliche Freude eines  metazirkulären Interpreters vorenthalten wird. Da hat man sowas mit Scheme schon unter der Haube, und dann geht es irgendwann um den Interpreter und es werden lauter neue Datentypen eingeführt um etwas Scheme-Ähnliches darzustellen, dass dann nicht mal richtig interpretiert werden kann.

Habt ihr wirklich toll gemacht.

Generell hat das Buch weniger Tiefgang als das  http://www.htdp.org/SICP - vor allem weil es dazu natürlich die ganz hervorragenden  Video-Lectures gibt, die einfach nur begeisternd sind.

Fazit: Irgendwie hat das Buch schon Sinn - aber Begeistern kann es mich nicht. Mal schauen wie es meiner Freundin geht. :)

p.s.: Zum SICP gibt es noch einen Nachfolger,  SICM - Structure and Interpretion of Classical Mechanics. Das werd ich mir mal demnächst ansehen müssen. :)

Computational Thinking

Was ist Informatik?  Jeannette Wing bringt es ganz hervorragend auf den Punkt:

Computational thinking is thinking recursively. It is parallel processing. It is interpreting code as data and data as code. It is type checking as the generalization of dimensional analysis. It is recognizing both the virtues and the dangers of aliasing, or giving someone or something more than one name. It is recognizing both the cost and power of indirect addressing and procedure call. It is judging a program not just for correctness and efficiency but for aesthetics, and a system’s design for simplicity and elegance.

Dem ist eigentlich nichts mehr hinzuzufügen - ausser vielleicht einem deutschen Begriff. Einen Perfekten Begriff habe ich noch nicht gefunden, aber einen Vorschlag: Informatisches Denken.

Wikipedia braucht einen neuen Namen

Soeben habe ich volgende fiktive Pressemitteilung zur Veröffentlichung erhalten:

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Aufwendige Untersuchungen haben ergeben, dass der gegenwärtige Name des liebevoll auch "allwissenden Müllhalde" genannten Nachschlagewerks geändert werden muss.

"Wir waren selbst von den Ergebnissen überrascht!" sagt ein Sprecher für das Projekt, "Wir hätten erwartet das wir den Namen erst wegen einer Copyright-Verletzung verlieren würden - und jetzt dass".

Aber die Ergebnisse sind eindeutig - der Name lässt sich einfach nicht in einen kurzen Satz pressen, so wie "Google es einfach". "Wikipedia es doch" funktioniert einfach nicht. Das ist das Grundproblem.

Die nun beginnende Diskussion um einen würdigen Nachfolger wird von allen Community-Mitgliedern mit Spannung verfolgt. Immerhin muss solch ein Satz in über 20 Sprachen funktionieren können - ein nicht triviales Problem bis zu dessen Lösung das Projekt aber in seinem gegenwärtigen Zustand eingefroren wird.

"Das ist ein notwendiger Schritt um die Kräfte Freizumachen die wir benötigen um diese Namensdiskussion voranzutreiben." Sagt der Sprecher der Wikipedia erneut auf unsere Nachfrage.

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Oder habe ich etwas übersehen und es gibt so einen Satz mit dem man effizient antworten kann?

Vorschläge willkommen.

Unser Feind - ''das Bundesverfassungsgericht''

Durch Denkanstoß von  CHRISTIAN RATH

Wer hätte das Gedacht. Die letzte Bastion der Gerechten in einem Staat voller kranker, überwachungsgeiler Politiker. Ein Kleines Dorf umgeben von vier Garnisonen....

Aber wenn man drüber nachdenkt: Das Bundesverfassungsgericht ist seit geraumer Zeit schon die letzte Hoffnung für alle Menschen die vernünftige Gesetze fordern. Jedes Sicherheitsgesetz macht eine Zwischenrunde durch Karlsruhe - und wird dort Beschnitten.

Und genau das ist das Problem. In Karlsruhe wird ein Kompromiss gefunden zwischen dem was das Grundgesezt / die Vernunft sagt und dem was die Politiker wollen.

Und das bedeutet letztlich auch nichts anderes als die Gesetze kommen - zwar gebremst, aber sie kommen.

Aber weil Karlsruhe gesagt hat jetzt ist alles ok, ist es dann natürlich in Ordnung.

Ha ha, selten so gelacht.

Vom Teilen

(Geschrieben für das Sternbuch meiner Familie)

Wenn man über das Teilen sprechen will, dann muss man diesen Begriff zuerst festklopfen.

Teilen kann man verschiedene Dinge. Dinge, die man anfassen kann und solche, die man nicht anfassen kann. Brot zum Beispiel kann man anfassen - und wenn man es unter mehreren aufteilt, dann hat man selbst weniger. Wenig überraschend ist es eines der drängendsten Probleme unserer Zeit, wie wir mit unserem knappen Trinkwasser umgehen. Pah, Öl. Trinkwasser!

Dann gibt es Dinge, die man anfassen kann - aber die man sowieso nur so kaufen kann, dass man sie alleine - außer in Extremfällen - gar nicht verbrauchen kann. Ein Auto zum Beispiel steht bei den meisten Menschen die meiste Zeit herum. Ab und zu jemanden mitzunehmen bringt da eine Menge - in manchen Gegenden sogar das Recht überhaupt fahren zu dürfen, damit weniger Verkehr ist.

Und dann gibt es jede Menge Dinge die man nicht anfassen kann - Liebe, Zuwendung, Musik, Freude, Theater, Humor...

Für einige davon wird in unserer Kultur eher nicht bezahlt. Liebe und Zuwendung zum Beispiel.

Für andere Dinge aber schon. Musik und Theater zum Beispiel. Die werden in unserer Gesellschaft meist industriell hergestellt, als CDs, Kino oder DVDs.

Lebt man, wie ich, schon größtenteils in einer Welt, in der solche geistigen Dinge vermehrt kopiert und geteilt werden, ohne dass sich etwas Greifbares bewegt, dann muss man sich früher oder später die Frage stellen: Was geht mir verloren, wenn ich zum Beispiel ein Lied singe, und meine Freundin das hört, dann mitsingt und es schließlich auch alleine singen kann? Habe ich wirklich weniger? Ist ein Lied teilen nicht Verbundenheit und habe ich damit sogar mehr als vorher? Oder abstrakter: Was verliere ich, wenn ich mit jemandem etwas teile, ohne dass ich danach weniger habe?

Diese schöne neue Welt hat natürlich einen Haken - denn wie für fast alles gibt es auch hier eine Industrie und Lobby - und die wollen von dem, was sie "schon immer" gemacht haben, weiterhin leben.

Dabei darf man aber den Blick für die Realität nicht verlieren - wer tatsächlich Kunst schafft, zum Beispiel als Musiker, verdient und verdiente - bis auf wenige Ausnahmen - immer schlecht. Es gibt viel mehr Künstler als Plattenfirmen produzieren wollen - und das drückt den Preis. Denn die Plattenfirmen leben davon, Hits zu produzieren - aber nicht zu viele, damit sich jeder einzelne auch lohnt.

Und diese verhältnismäßig kleine Industrie fordert jetzt, dass wir als Gesellschaft die beschriebenen Nuancen des Teilens vergessen sollen - und alle Dinge, auch die geistigen, betrachten sollen wie Brot. Als hätte man, wenn man sie teilt, selbst weniger. Vielleicht nimmt man dort an, dass wir auch nur die Intelligenz von selbigem besitzen.

Was würden wir wohl heute machen, wenn die Ochsenkarren-Industrie fordern würde, dass ab heute alle Straßen nur noch auf dem Standstreifen mit Autos befahren werden dürfen, damit der Rest endlich für ungehindertes Durchkommen mit Ochsenkarren frei wird?

Provokant gesagt: Das Geld wird eben heute anders verdient. Na und?

Mancher mag das für ein wenig wichtiges Thema halten - dabei bedeuten die hier besprochenen feinen Nuancen des Teilens eine Revolution.  Wikipedia legt einen Grundstock an geteiltem Wissen an, der zeigt, wo es hingehen kann, wenn man zulässt, dass Teilen zum Grundprinzip wird. Open Source-Software verändert komplett die Weltwirtschaft, weil ärmere Länder plötzlich keinen Grund mehr haben, viel Geld an den ohnehin schon reichsten Mann der Welt zu bezahlen. Regierungen wie Deutschland setzen Open Source-Software ein, um sicher zu sein, dass kein ausländischer Geheimdienst Hintertüren in ihre technischen Systeme einbaut, und auf der anderen Seite nutzen Privatpersonen die selbe Software, um kontrollwütigen Regimen wie in China entgehen zu können. Auch Künstler entdecken immer mehr, dass sie ihr dringendstes Problem - wahrgenommen zu werden - durch die Freigabe ihrer Kunst viel besser erreichen können, als wenn sie darauf warten, von einer (Platten-)Firma entdeckt zu werden.

Diese Revolution, die uns erlaubt, mit geistigen Gütern so umzugehen wie es ihnen gebührt, hat gerade erst als technische Revolution begonnen - und wird noch lange Zeit weitergehen, bis der soziale Teil dieser Revolution abgeschlossen ist.

Jetzt durch kurzfristige und eilig durchgeführte Regulierungen das Kind mit dem Bade auszuschütten, bedeutet, dass diese Entwicklungen um Jahrzehnte verzögert, vielleicht sogar vollständig verhindert werden könnten. Vernünftige Politik ist hier abwartend - und lässt neues mutig zu, ohne es zu verteufeln.

Der Kongress...

... ist vorbei.

Puah war das anstrengend.

Aber auch  Produktiv.

Vor allem war überraschenderweise die Location der Kommunikation total zuträglich - ich hatte zuerst befürchtet das  der Club mit seiner leicht verratzten und düsteren Atmosphäre das ganze eher unproduktiv gestalten könnte.

Es war aber genau das Gegenteil der Fall. Innen waren die Gespräche relativ strukturiert - obwohl sich 25 Leute gegenüber saßen. Und dadurch das es recht Eng und nicht soo schön und vor allem auch nicht soo gut belüftet war, wollten alle in schöner Regelmäßigkeit nach draußen auf die Straße zur Pause gehen.

Und diese Pausen waren gut! Die Gespräche wurden Befruchtet, neue andere Themen konnten zwanglos angeschnitten werden - oder man konnte auch einfach nur abschalten.

Alles in Allem: Gut. :-)

Piratenpartei und Transparenz

Schwieriges Thema. Die ganze Kommunikation findet ja schon fast ausschließlich online statt - da denkt man ja das Transparenz überhaupt kein Problem ist.

Tja... denkste.

Das Problem ist nämlich ein ganz anderes: Die Flut der Inhalte erschlägt jeden, der auch nur ansatzweise versucht das neben einem normalen Arbeitstag alles zu bewältigen.

Ugh.

Überraschung. Es braucht also doch noch mehr Energie um die Informationsflut übersichtlich zu machen.

Tja. Die müssen wir dann wohl erbringen. Aber Spaß machen tut es bisher noch nicht. :-(

 Das Protokoll gibts immerhin.

Nur wie kriegt man das Zusammengefasst?

Ich nehm jedenfalls mit, dass der sehr viele Piraten aus verschiedenen Ländern anwesend waren. Super.

Und wir haben immerhin schöne Wünsche / Empfehlungen formuliert. Auch super.

Das Wichtigste war aber das sich die Leite aus den verschiedenen Landesverbänden wirklich Person zu Person unterhalten haben - und nicht immer nur Elektronisch kommunizieren.

Yay!

Was ist an diesem Programm falsch?

So, jetzt kurz ganz intensiv hinschauen - so sagen wir mal für 10 Sekunden.

Funktionale

Und, schon gesehen was es ist?

Ok, nochmal 10 Sekunden.

Jetzt?

Na, will ich es mal auflösen. Das ist ein Programm das in der von mir schon beschriebenen Veranstaltung  Fortgeschrittene Techniken funktionaler Programmierung auf einer Folie erscheint.

Jep, als teil der Vorlesung für so sagen wir mal... 2 Minuten.

Aber jetzt zum Problem: Dieses Programm versteht man nicht! Schon gar nicht wenn man kein Opal kann - aber auch mit Opal-Kenntnissen hat man keine Chance.

Was für ein Schwachsinn diese ganzen Funktionssymbole sind.  Als würden Programmiersprachen heute noch mit einer eigenen Tastatur kommen. Vor allem aber haben sie ein Problem: Man muss den ganzen Kontext was sie Bedeuten komplett mitschleppen - was uns Menschen viel schwerer fällt als einfach ein Wort zu lesen das sagt worum es geht.

Jep.

Wer zweifelt, mag doch bitte das Programmfragment erklären.

q.e.d.

  • Posted: 2008-03-28 18:55 (Updated: 2009-10-24 15:58)
  • Author: dwt
  • Categories: fnord code
  • Comments (0)

Python saugt

Schon lange hab ich mich gefragt, wieso eigentlich mich dieser eine Punkt an Python so sehr stört:

Jede Methode eines Objektes erhält als ersten Parameter eine Referenz auf das aufrufende Objekt.

Bisher konnte ich den Finger nie darauf legen konnte, wieso mir das eigentlich so auf den Keks geht. Bisher dachte ich immer das es mich stört, weil man schwieriger aus normalen Funktionen Methoden zu machen, beim Refactorn, aber so wirklich passt das nicht. Also dachte ich, vielleicht gewöhne ich mich ja irgendwann daran. Dem war aber nicht so.

Bei den Vorbereitungen zum Java-Kurs ist mir jetzt durch einen Hinweis von  Robert der eigentliche Grund Aufgefallen.

Folgendes war der Auslöser: Wir haben uns gerade darüber unterhalten wie wir den Studenten im Java-Kurs erklären, wie sie this in Java verstehen sollen.

Naja, von der technischen Seite ist das klar - die Methoden sind im Klassenobjekt implementiert und die Methode braucht aber einen Weg um an die Daten zum gegenwärtigen Instanz-Objekt zu gelangen. Also wird dieses Instanz-Objekt als verstecktes erstes Argument übergeben, das immer den namen this trägt.

Soweit so klar.

Das Mentale Bild das man von diesem Systems hat, ist aber eigentlich anders: Darin gehören die Methoden zum Instanz-Objekt und "leben" auch darin - damit ist dann auch klar, wieso eine Instanz-Methode zugriff auf die Daten des Objekts hat und wieso zum Beispiel eine Klassen-Methode das nicht kann - sie lebt einfach im falschen Objekt.

Der Knackpunkt: this ist eigentlich ein Workaround (aber ein notwendiger) der zeigt wie diese Abstraktion implementiert wurde, der aber auch erlaubt eindeutig zu spezifizieren welchen Namensraum man jetzt meint. Jetzt möchte man aber die Implementierung möglichst von der Benutzung abstrahieren, damit man gut auf dieser Abstrakteren Ebene arbeiten kann und diese nicht ständig verlässt. Daher macht es viel Sinn diese Implementierung so transparent zu machen wie nur irgend möglich.

In Python dagegen ist das anders. Hier wird ganz Explizit immer self als erster Parameter geschrieben. Der Effekt? Ständig wird man daran erinnert das die Abstraktion eigentlich nicht so ist wie man sich das denkt und es tatsächlich alles anders implementiert ist in Python. Das Problem? Man erhält durch diesen Abstraktionsbruch keinen Vorteil - ja, alles ist expliziter, aber es bricht auch ständig mit der Abstraktionsschicht auf der man Arbeitet. Details der Implementierung "bluten" über dieses "Loch" in den ganzen Code den man schreibt.

Und saubere, klar getrennte Abstraktions-Ebenen sind einfach wichtiger als einfachste Implementierung - speziell für einen Sprachdesigner.

Fortgeschrittene Techniken Funktionaler Programmierung

(zu  Mother Earth von Within Temptation)

 Diese Folien habe ich gestern gefunden.

Das Thema finde ich schon spannend - immerhin wird doch einiges angesprochen, das ich mal wieder auffrischen könnte. Monaden, und effiziente implementierungen von Sequenzen und Maps würden mich vor allem interessieren.

Aber leider kranken die Folien unter einem ganz spezifischen Problem: Sie strotzen nur so vor Begeisterung über die tollen typographischen Möglichkeiten von  Tex.

:-(

Besonders bezeichnend finde ich  Vorlesung 3.2. Ich meine, es ist ja schön, das man mit Tech Programme auf solch mathematische Art und Weise schreiben kann.

Aber wer bitte soll das Lesen? Und wieso wohl hat sich APL nicht durchgesetzt?

Im GCC gibt es auch  eine Erweiterung die den tertiären Operator erweitert (test) ? ifTrueValue : ifFalseValue so dass man den mitleren Operanden weglassen kann um bei dieser Form zu landen aValue ?: ifValueEvaluatedToFalse . Das ist für sich gesehen nun jetzt erst einmal blöde - andersherum ergibt sich daraus die schöne Möglichkeit einen "Oder" Operator zu haben.

Das heißt: Muss man dieses Beispiel

void getImportantValue() {
    return somethingWhichGeneratesAStringOrNull();
}

erweitern, dass es nie null zurückgibt, sondern stattdessen immer mindestens einen leeren String, geht jetzt einfacher. Klassisch würde man das so machen müssen:

void getImportantValue() {
    char *value =  somethingWhichGeneratesAString();
    if (value) return value;
    else return "";
}

Oder eben kürzer mit der Erweiterung:

void getImportantValue() {
    return somethingWhichGeneratesAString() ?: "";
}

Ist diese Vereinfachung beim Schreiben die größere Komplexität beim Lesen wert? Immerhin wird fast kein C-Coder dieses Konstrukt kennen und daher zuerst einmal überrascht sein wird.

Vielleicht sollte man es dann also in ein Macro packen, das diese Funktion über den Namen dokumentiert, etwa

#define IF_NULL_USE ?:

Dann kann man aber eigentlich auch schon wieder ein Makro bauen das das explizit macht. So zum Beispiel:

#define IF_NULL_USE(testedValue, alternativeValue) (testedValue) ?: alternativeValue;

Oder man definiert sowas gleich als Funktion.

Und das ist genau das Problem dass diese Konstrukte, ob in Opal oder in C, immer haben. Es ist ja schön das man sowas machen kann - aber es dokumentiert sich selbst ganz beschissen. Und man schreibt den Code nun mal für andere Menschen - nicht für das Satzsystem. Also muss man doch eine Funktion oder ein Makro definieren, damit sich dieser Trick selbst dokumentiert - und dann kann man an der einen Stelle auch gleich ein if hinschreiben.

  • Posted: 2008-03-28 04:52 (Updated: 2008-03-28 04:56)
  • Author: dwt
  • Categories: code
  • Comments (0)

Wie schafft man sowas eigentlich?

(Zu  Rachel's Song von Vangelis)

Meine Bekannte  Katrin hat sich eine  Zeitschaltuhr zugelegt. Nun ja, da denkt man, diese Dinger gibts ja schon lange, kann ja alles nicht so schwer sein.

:-D

Nach längerer Zeit hat Sie herausgefunden wie der Funktioniert - zu zweit haben wir ihn dann mal im Detail angeschaut.

Schonmal vorweg: Meinen Respekt. Was die alles Falsch gemacht haben, muss man wirklich absichtlich machen, sonst geht das einfach nicht.

Hier erstmal ein Bild

Zeitschaltuhr Foto

Vielleicht das gute Vorne weg: Es ist klar eine Durchgangssteckdose, wo man was einsteckt ist schon mal einfach.

Nein, mehr positives fällt mir dazu nicht ein. Sorry.

Kommen wir mal zu den Details. Es ist eine Zeitschaltuhr. Völlig unbedarft erwartet man also erst einmal eine Uhr, die schaltet. Und wenn man das Bild betrachtet, dann ist das ja auch schon mal vertraut. Da sind Zahlen und die sind im Kreis angeordnet.

Ach ja, schalten... Das war schon die erste Schwierigkeit - wie schaltet man das gute Stück? Man muss die Schalter (der schwarze Kranz um das "Ziffernblatt" hoch oder herunterdrücken um den Strom zu schalten.

Interessanterweise gibt es auf dem guten Stück aber keinerlei Hinweis welche Stellung ein entspricht! Soweit ich das beurteilen kann scheint aber "herausgezogen" ein zu bedeuten. Sehr intuitiv.

Ach ja, und dann gibt es noch einen roten Schalter auf der Seite. Den haben wir auch nicht verstanden. Jetzt bei der Recherche hier zum Schreiben bin ich auf der Seite von Conrad-Elektronik fündig geworden. Offenbar ist das ein Master-Schalter der die Zeitschaltuhr völlig übergeht. Ist der UNBESCHRIFTETE Schalter also in der falschen Position, funktioniert sowieso gar nix.

Aber falls er zufällig richtig ist ist es trotzdem noch kompliziert - denn welcher der etwa 120 Schalter in dem Aussenring ist für welche Zeit zuständig? Beim Versuch das herauszufinden stößt man schnell darauf das man den äusseren Ring mit den Zahlen - das "Ziffernblatt" sozusagen - drehen kann.

Praktisch. So kann man zum Feststehenden Uhrzeiger die passende Uhrzeit einstellen.

Ich stelle mir das so vor: Damit man nicht völlig verzweifelt, wird man vermutlich die Uhr so einstellen, dass 0/24 Uhr oben ist, und dann stellt man sich einen Wecker, damit man die Uhr zum richtigen Zeitpunkt einsteckt, damit die Uhrzeit die er dann anzeigt zur Tageszeit passt. Und vielleicht betreibt man es vorher dann noch ein paar Stunden damit der Zeiger auf eine passende Stelle zeigt und man nicht um Mitternacht zum Zeitschaltuhr einstecken aufstehen muss.

Sehr komfortabel.

Ach ja, ausserdem stellt man ungefähr zu diesem Zeitpunkt fest, das die Beschriftung auf dem Ziffernblatt in die falsche Richtung ist. Nicht wie bei einer Uhr, nein, nein - natürlich anders herum. Auch wenn einem der Pfeil auf der "Zeiger"-Scheibe eine normale Richtung vorgaukeln möchte. Ach ja, natürlich macht der schon Sinn - denn den "Ziffernblatt"-Ring kann man nämlich ohne große Kraft nur in diese Richtung drehen. Oder soll - damit das einstellen der Uhrzeit noch "leichter" fällt vielleicht?

Der "Zeiger" jedenfalls bewegt sich genau in die andere Richtung.

Fassen wir also mal Zusammen:

  • Schalten? An schwarzen Stiften, so etwa 10 min pro Stift, was ein und was aus bedeutet muss man aber durch trial und Error bestimmen
  • Es gibt einen unbeschrifteten Schalter, der den ganzen Mechanismus ausser Kraft setzt - Was ein und was aus bedeutet muss man ausprobieren.
  • Man dreht nicht die Scheibe mit dem Pfeil darauf, sondern den Ring aussen herum auf dem die Zahlen stehen.
  • Damit stellt man die Uhrzeit zu dem feststehenden "Uhrzeiger" ein. Man stellt also nicht den "Uhrzeiger" sondern das "Ziffernblatt"
  • Das "Ziffernblatt" ist in die falsche Richtung beschriftet

Eine tolle Uhr ist dass. Ich meine, man hat wirklich das Gefühl das der Konstruktör entweder noch nie eine Uhr in der Hand gehabt hat und daher etwas völlig neues erfinden musste, oder aber das er sich absichtlich überlegt hat, wie er seine Benutzer noch ein bisschen mehr quälen kann.

Wirklich faszinierend.

  • Posted: 2008-03-26 20:44 (Updated: 2009-10-24 16:24)
  • Author: dwt
  • Categories: fnord
  • Comments (0)

Wie erklärt man Objektorientierung (2)

Da hab ich doch tatsächlich meinen ersten Kommentar zu einem Blog-Eintrag erhalten. Per mail von  Felix!.

:)

Ja, ich muss noch an der Technik hier schrauben. Wird gemacht. Versprochen.

Hier zum Kommentar:

Richtig verstanden hat man erst wenn man es erklären kann. Das bedeutet aber auch, dass deine Erklärung nicht zu einem vollständigen Verständnis deiner Zuhörer_innen führen kann.

So hab ich diesen Satz noch gar nicht gesehen - aber das steckt da drinnen und ist absolut korrekt.

Allerdings...

Das bedeutet natürlich nicht, dass man sich weniger bemühen sollte auch schon bei der Erklärung eines Konzeptes so viel wie möglich erreichen zu wollen.

... muss man es trotzdem versuchen. Ein Kurs ist ja immer von ganz unterschiedlichen Menschen belegt, die jeder auf einem anderen Level sind.

Das Problem als Vortragender ist da natürlich das ich nicht individuell auf die einzelnen Zuhörer eingehen kann - um das Beispiel zu wählen das ihm am Meisten erklärt.

Das bedeutet aber natürlich auch, das damit jeder aus einem Vortrag etwas anderes mitnimmt. Ein perfekt strukturierter Vortrag gibt damit jedem der ihn hört genau das mit, was er benötigt um weiterzumachen und bietet bei erneutem hören weitere Inspiration.

Ok, das schafft man wohl nicht - aber das Ziel, das man das Material so präsentiert, das der Anfänger einen Einstieg hat, und der der etwas weiter ist, mehr mitnehmen kann - das hab ich schon.

Ha-, ha-, ha-....

... war alles was ich noch sagen konnte, nachdem mir mein Vater ein (!!) Korn des  Szechuanpfeffers gegeben hatte, die meine Verwandte Renate aus China mitgebracht hat.

Was die Wikipedia als "scharf-prickelnde Geschmack, der ein Gefühl der Taubheit auf Lippen und Zunge bewirkt" beschreibt ist in wirklichkeit ein intensives prickeln des ganzen Mundes, als stünde der ganze Rachen unter Strom!

Und das eine viertel-Stunde lang.

Dabei ist der Pfeffer eigentlich nicht scharf - man hat nur einen völlig betäubten Mund - der Geschmack ist wirklich nur als "volle Dröhnung" zu beschreiben.

Genau genommen, bin ich immer noch etwas high...

:) Cooles Zeug.

Nur wie man damit Würzen soll ist mir noch schleierhaft.

Was ist Objektorientierung?

Es heißt ja, das man etwas erst wirklich verstanden hat, wenn man es einem anderen Menschen beigebracht hat.

Nun, mir stellt sich mal wieder die Frage, im Rahmen des  Javakurses der Freitagsrunde an der TU-Berlin:

Wie erklärt man Objektorientierung wirklich gut?

Verschiedene Kräfte zerren da an mir:

  • Der Vortrag muss in eine Stunde passen
  • Die Sprache anhand der es erklärt werden muss ist Java
  • Die Studenten haben noch nie eine Programmiersprache gesehen
    • oder vorher eine Funktionale Sprache gelernt, die sie nicht verstanden haben

Was mir am meisten am Herzen liegt sagt Kent Beck in  Smalltalk best Practice Patterns einfach wunderschön:

Objects model the world through behavior and state. Behavior is the dynamic, active, computational part of the model. State is what is left after behavior is done, how the model is represented before, after, and during a computation.

Of the two, behavior is the more important to get right. The primacy of behavior is one of the odd truths of objects, odd because it flies in the face of so much accumulated experience. Back in the bad old days you wanted to get the representation right as quickly as possible, because every change to the representation bred changes in many different computations.

Objects (done right) change all that. No longer is your system a slave of its representation. Because objects can hide their representation behind a wall of messages, you are free to change representation and only affect one object.

Nur leider können die Studenten mit dem Vergleich in die alten Tage nix anfangen, denn sie haben ja gerade keine Erfahrung warum die alten Tage schlecht waren.

Immerhin der erste Satz ist brauchbar - und ich werde ihn tunlichst einbringen. Damit ist das Problem doch schon mal zumindest kleiner geworden.

Denkfutter bis zum nächsten mal...

Warum entwickeln immer noch so viele Leute ohne !UnitTests?

Weiß ich nicht, aber ich weiß, was für Folgen es hat.

Wenn man ohne Tests entwickelt, dann hat man beim Schreiben von z.B. einer Klasse immer den vollen Zugriff auf das gesamte System - und es ist ständig verlockend, nur eben dieses andere Subsystem aufzurufen oder es in die klasse als Instanzvariable einzubinden. Da man kein Korrektiv hat, sind die Folgen dieser Handlungen fast unsichtbar. Die Abhängigkeiten im System nehmen immer weiter zu - und die Architetkur immer weiter ab. :/

Als Testgetriebener Entwickler muss man sich, um den Code in einer Testsuite überhaupt laufen lassen zu können maximal vom Rest des Systems abkapseln. Das bedeutet das man sich bei jeder Abhängigkeit die man dazu nimmt genau überlegt, ob man sie wirklich braucht, ob man sie erreichen kann, indem man einen Parameter übergibt, oder indem man ein Protokoll einführt das die Kommunikation dieser zweier Systembestandteile klärt. Immer macht man sich über die Grenzen der Komponente Gedanken und wie die Kommunikation darüber hinaus abläuft.

Man macht eben nicht einfach nur einen Konstruktorparameter über den dann als globale Variable alles zugänglich ist - den man im Test aber niemals instanziiert bekommt.

Diese Tatsache macht für mich einen der größten Unterschiede zwischen Testgetrieben entwickeltem Code und sonstigem Code aus.

Es ist unglaublich schwierig (auf anhieb) Code zu schreiben der Wiederbenutzbar ist und wenig Abhängigkeiten besitzt - wenn man Code testgetrieben entwickelt bekommt man aber unheimlich viel davon umsonst.

Alleine deswegen darf es heute eigentlich keine Ausrede mehr Geben ohne Tests zu entwickeln.

Die Provider sollen gefälligst P2P verhindern!

 Fodert Dieter Gorny, Cheff des Bundesverbands der Musikindustrie. Klar.

Spannend finde ich aber das er vorgibt, aus der letztlich erschienen Brennerstudie wäre ersichtlich das sich illegale Downloads um die Hälfte reduziert haben.

Nämlich von 600 Millionen auf 300 Millionen.

Da würde ich doch schon mal gerne die Studie sehen, Herr Bundesverband. Und was da genau gefragt wurde. "Wie viele illegale Downloads haben sie im letzten Jahr gemacht?" oder "Sind sie sich im klaren darüber das das herunterladen von Musik aus dem Internet illegal ist?" und direkt danach "Wie viele Musikstücke haben sie im letzten Jahr heruntergeladen?"

Vielleicht taugt die Studie ja auch und die Leute sind dazu übergegangen Fernsehserien etc. herunter zu laden. Jedenfalls weiß ich nichts darüber das sich die verbrauchte Bandbreite oder der Anteil der P2P-Dienste an der Gesamtbandbreite irgendwie verringert hätte.

Wirklich schade, das man in der Politik nicht seine Quellen offen legen muss, wie in der Forschung. :-/

Transparenz ist doch was feines.

!UnitTests auf ein !TracPlugin...

... sind eine schöne Sache. Wenn man sie denn hinkriegt.

Da wäre zuerst der einfache Fall: Was macht man um eine Wiki-Seite zu erzeugen und zu laden?

Well, hier ist wie es geht:

#!/usr/bin/env python

import unittest

from trac.wiki.model import WikiPage
from trac.test import EnvironmentStub

class PluginTests(unittest.TestCase):

    def test_can_save_and_load_wiki_page(self):
        env = EnvironmentStub()
        page = WikiPage(env, "Foo", None)
        page.text = "barfoo"
        page.save("fnord", "bar", "localhost")
        
        self.assertEquals("barfoo", WikiPage(env, "Foo", None).text)

Soweit nicht soo schwer. Vor allem sehr schick, das das EnvironmentStub() einem die ganze Arbeit abnimmt um das Trac-Environment UnitTest fähig zu machen. Ein Call und alles ist da - inklusive einer in-memory Sqlite Datenbank.

Nice.

Der eigentliche Hammer ist dann aber, wenn man ein Plugin bauen will das von anderen Plugins abhängt. Das ist nämlich deutlich komplizierter.

Da ergibt sich nämlich das Problem, das man plötzlich das Component-System von Trac verstehen muss, damit man überhaupt auf die Klassen und ExtensionPoints eines anderen Plugins aufbauen kann.

Für uns um Beispiel das TracTags-Plugin. Dieser Blog basiert auf diesen Tags. Blog-Posts werden durch einen speziellen Tag ("blog") zu einem Blog-Post, Kategorien sind nur Tags und überhaupt funktioniert alles nur über Tags. Tags sind cool.

Aber, man muss das Plugin erst einmal schwer zur Zusammenarbeit überreden - denn, es benötigt ein Datenbankupgrade damit es überhaupt funktioniert.

Und überhaupt ist die Datenbank am Anfang total leer. :/

Um es gleich zu verraten: Die Lösung lag darin, das man dem Environment einerseits sagen muss, das man gerne Standard-Daten hätte und andererseits, welche Plugins es alles aktivieren soll. Nicht schwer. Nur nicht offensichtlich. :(

#!/usr/bin/env python

import unittest

from trac.wiki.model import WikiPage
from trac.test import Mock, EnvironmentStub, MockPerm

from tractags.api import TagSystem

from tractags.model import TagModelProvider

class PostFinderTest(unittest.TestCase):
    
    def setUp(self):
        self.env = EnvironmentStub(default_data=True, enable=["tractags.*", 'trac.*'])
        self.env.upgrade()        
        self.env.db.commit()

    
    def test_can_save_and_load_wiki_page(self):
        page = WikiPage(self.env, "Foo", None)
        page.text = "barfoo"
        page.save("fnord", "bar", "localhost")
        
        self.assertEquals("barfoo", WikiPage(self.env, "Foo", None).text)

                        
    def test_can_add_tags_and_retrieve_tagged_pages(self):
        from trac.web.href import Href
        page = WikiPage(self.env, "Foo", None)
        page.text = "barfoo"
        tag_system = TagSystem(self.env)
        req = Mock(perm=MockPerm(), args={}, href=Href('/'))
        tag_system.add_tags(req, page.resource, ["blog"])
        page.save("fnord", "bar", "localhost")
        
        self.assertEquals("barfoo", WikiPage(self.env, "Foo", None).text)
        
        blog_resources = [i for i in tag_system.query(req, "blog")]
        self.assertEquals(1, len(blog_resources))

Mei war das eine Arbeit die ganzen Objekte zusammen zu suchen die man für test_can_add_tags_and_retrieve_tagged_pages() benötigt.

Well, ein start ist gemacht, aus dem wir jetzt einen Page-Loader refactor-n (-ieren?) werden.

Yay!

Heute blog ich nicht

Dafür bin ich nämlich viel zu betrunken.

Schließlich hat die Friedrich Ebert Stiftung heute den Wein bezahlt, den ich abgegriffen habe, während ich meine Freundin von einer Veranstaltung dort abgeholt habe.

Das Essen war auch nicht soo toll.

Naja, immerhin der Rotwein.

Ach ja, die Veranstaltung hieß: "Außen vor oder mittendrin? Gesellschaftliche Partizipation und Anerkennung erwerbsloser Menschen". An sich spannend, aber die Teilnehmer haben eigentlich alle nur immer die gleichen bekannten Stereotypen von sich gegeben. Wirklich gut fand ich (neben meinem Vater :) dann vor allem  Frauke Hehl die mal wirklich gesagt hat was sache ist: Das alle Arbeit haben ist einfach inzwischen eine Illusion der wir uns nicht mehr hingeben dürfen.

Recht hat sie.

So, und jetzt gute Nacht.

In der Piratenpartei…

Das Spannendste an der Piratenpartei sind die, die dabei mitmachen.

Zum Beispiel RKA. Mir ist ein Rätsel, wie er die ganzen Dinge, die er tut, in seine Zeit einsortiert.

  • Bei der Piratenpartei ist er aktiv - bald sogar im Vorstand.
  • Beim AK-Vorrat ist er aktiv - er hat dort z.B. die Abgabe des Schriftstücks (120 Ordner) für die Klage gegen die Vorratsdatenspeicherung mit vorbereitet
  • Privat gründet er noch diverse Firmen mit
  • Studiert nebenbei noch Wirtschaftsrecht
  • Weiß von allen Dingen, wo man sie bekommen kann
  • Hat einen grandiosen Überblick, wo im Internet welche Startups gerade was machen

Einfach beeindruckend.

  • Posted: 2008-03-12 21:58 (Updated: 2008-03-12 21:58)
  • Author: dwt
  • Categories: politik
  • Comments (0)

Was ist das eigentlich,

dass Betreiber von Geschäften so überwachungsgeil macht?

Zum Beispiel  dieser Eigentümer einer Diskothek. Der erstellt über jeden seiner Besucher ein komplettes Persönlichkeitsprofil, inclusive wann sie bei welcher Bedienung wie viel von welchen Getränken gekauft haben. Und natürlich von wann bis wann sie anwesend waren, woher sie kommen, welche Telefonnummer sie haben, etc.

Das Geilste: die Überwachten Club-Gänger werden dargestellt, als fänden sie das ganz toll. Schließlich müssen sie als Mitglied keinen Eintritt bezahlen und erhalten Zutritt zum Buffet.

Diese Daten werden ewig aufgezeichnet - die Bilder der Überwachungskamera 'nur' mindestens ein halbes Jahr auf dem Privatrechner des Eigentümers.

"Die wollen das doch genau so!" hört man den Betreiber quasi schreien.

Und was wenn er Windows benutzt und jemand bei ihm in das Rechnernetzwerk einbricht und die Daten alle stiehlt?

p.s.: Haben wir da jetzt nicht  ein Grundrecht auf Datenintegrität?

Connect the Dots

"You can only connect the dots looking backwards, never looking forward." -- Steve Jobs

Sagt er  hier.

Geiler Vortrag.

Piraten aller Länder, vereinigt euch!

Über meinem Schreibtisch hängt schon seit zwei Jahren ein Zettel. Darauf habe ich damals geschrieben:

Eine Revolution: Computer Zwei Ideen: Grundeinkommen, Zinskatastrophe

Das würde ich heute anders formulieren: Zwei Revolutionen, eine Idee

  1. Die Computerrevolution
  2. Die Arbeitsrevolution

Die zweite ist sichtbarer und erzeugt (scheinbar) mehr Probleme, da sie immer mehr Menschen arbeitslos macht. Dabei ist sie mit er der ersten Verknüpft. Immer mehr Tätigkeiten können durch Computer- und Maschineneinsatz dem Menschen abgenommen werden und uns allen steht damit mehr Freizeit zur Verfügung (ok, abgesehen von den Informatikern, die das alles am Laufen halten müssen). Das bedeutet letztlich, das mit fortschreitender Technik immer weniger Arbeit notwendig und immer mehr Arbeit freiwillig wird. Und das muss sich in unserer Gesellschaftsordnung früher oder später wieder spiegeln. Durchdenkt man das, wird natürlich auch schnell klar, das Geld als Druckmittel um Arbeit zu erzwingen damit ein reichlich merkwürdiges Konzept ist, denn tatsächlich ist die Arbeit ja unsinnig oder zumindest unnötig. Lösungsansätze:  Bedingungsloses Grundeinkommen (Wikipedia),  Netzwerk Grundeinkommen,  Deutsche Abteilung?

Die erste Revolution ist viel unsichtbarer - Computer durchdringen immer mehr Gebiete unseres Altags und algorithmisieren sie. Das bedeutet, das implizite Regelungen damit Explizit werden und wir uns plötzlich Gedanken über diese Details machen müssen.

Zum Beispiel: Heute sind Verkehrsregeln eine Konvention an die man sich hält. Sollten Autos irgendwann mit Autopiloten fahren, kann man nicht mehr einen Schwerverletzten auch über Rote Ampeln ins Krankenhaus fahren - ein Automat würde die Verkehrsregeln stur einhalten. Oder Verfahrensregeln in Verwaltungen. Wo heute etwas Charme vielleicht genügt unsinnige Regeln aufzuweichen, kann man sich einem Computer gegenüber noch so anstrengen. Man muss den Regeln doch genügen.

Das sind aber alles noch harmlose Beispiele. Wo früher die Komplettüberwachung alle Kommunikation völlig ausgeschlossen war, ist es heute Routine das  alle Verkehrsdaten aufgezeichnet werden.

Daher ist es notwendig, das diejenigen die diese Probleme verstehen (Informatiker?) dieses Wissen und ihre Erfahrung in den politischen Prozess einbringen.

Das darf auf keinen Fall in den Strukturen einer bestehenden Partei versickern und ist auch überhaupt nicht geeignet in die Farbenlehre der bestehenden Parteien eingeordnet zu werden - denn die Probleme haben (erstmal) überhaupt nichts mit den bisherigen politischen Richtungen zu tun.

Ich bin daher der Meinung das die Gründung der  Piratenpartei der richtige Schritt war.

Davon abstrahiert ist es aber Wichtig, das jeder der diese Probleme versteht mit seinen Mitteln an ihrer Lösung beteiligt - ich habe dafür mein Engagement im  Berliner Landesverbands gewählt und kann es natürlich nur jedem ans Herz legen. :)

<Schleichwerbung>Wir treffen uns jeden Mittwoch 18:00 Uhr in der C-Base. (Rungestraße 20, 2. HH - 10179 Berlin)</Schleichwerbung>

Zur Zinskatastrophe sage ich später mehr.

Darf's ein neuer Lampenschirm sein?

Ob Ikea wohl bald pleite geht?

So jedenfalls  malt Freitag die Zukunft in der jeder Zuhause einen 3D-Drucker stehen hat, der fast beliebige Altagsgegenstände (inklusive Elektronik) herstellen kann.

Klingt gut nicht?

Naja, bis man sich klar wird, das die angestrebte Selbstreproduktion dieser Geräte natürlich bedeutet das sie ihre Einzelteile selbst herstellen können. Zusammenschrauben muss sie immer noch der Mensch der ehrfürchtig vor dem Gerät sitzt.

Spannend finde ich das aber schon. Im Dunstkreis des CCC ist schon länger davon zu hören, das die (wieder) immer mehr zunehmenden Hardware-Hacker jetzt auch Rapid-Prototyping Maschinen selber bauen können. Und das für so etwa 200-3000 € - je nach Anspruch und Bastelkenntnis.

An den Durchbruch der Produktionsmittel Zuhause glaub ich zwar noch nicht - aber wenn man doch mal mit Aliens kommunizieren will, dann ist heute immer noch die Idee, Selbstreproduzierende Satelliten loszuschicken die beste. Die könnten dann nämlich mit möglichst viel lokalem Speicher die Kunde über unsere Kultur quasi in einem gigantischen "Turnschuhnetz" in fremde Sternensysteme bringen - und umgekehrt.

Da wäre eine erste sich selbst reproduzierende Maschine natürlich schon ein ganz guter Start...

Spannende Wikipedia-Artikel über die ich beim Schreiben gestolpert bin:  Alternative Biochemien (engl),  Exopolitik (engl),  Pansperma (engl)

Schöne Podiumsdiskussion

 Gab es bei Heise zum Thema Filesharing.

Vertreten sind die Gegner und Befürworter von Filesharing.

Inklusive Jan Huwald - das freut mich natürlich als Pirat.

:)

Piraten aus "Mangel an Auswahl"

 Torrentfreak schrieb heute über  eine Studie der  Wiggin LLP  Wiggin LLP.

In der graphisch anspruchsvollen Studie stellt die Firma fest (unklar ist mir noch, wer sie Bezahlt hat) das das eingeschränkte Angebot einer der wichtigsten Gründe ist wieso Leute zu Piraten werden.

Ahem.

Na gut, ich finde es ja richtig wenn sich die Entertainement Industrie endlich auf ihren Hosenboden setzt und alle Inhalte (ja, auch die Alten) im Netz verkauft.

ABER

Ich vermisse hier ein ganz wesentliches Argument: Filesharing machen zuallererst die Leute die Zeit haben, aber wenig Geld. Diese Leute (Jugendliche & Studenten z.B.) waren und sind aber ein ganz wesentlicher Markt für die Entertainment Branche.

Davon abgesehen bin ich als Pirat natürlich noch der festen Überzeugung, das unser Land mehr freie Kultur braucht und auch bekommen wird.

Dazu aber später mehr.

Sauberes Programmieren

(zu  Return to Innocence von Enigma)

Es ist wirklich erstaunlich wie viel schwieriger es ist saubere Programme zu schreiben wenn mehr Leute an der Konstruktion beteiligt sind.

Nehmen wir zum Beispiel drei Leute. Einer hat vorher viel C++ progirammiert. Ganz selbstverständlich ist für ihn das Paradigma geworden, das man Accessoren -getVar und Mutatoren -setVar:aValue nennt.

Und schon mischt sich im System der Namens-Salat. Und das ist noch keine große Sache. Von sich aus besteht keinerlei Einheitlichkeit, wie wer seine Variablen und Funktionen nennt. Wie z.B. heißt eine Klassenmethode zum erstellen eines Objekts? -classname:instanceVarName with:anotherInstanceVarname oder -intentionWithNamedThing:aTypeDescription withAnotherNamedThing:aTypeDescription

Wie geht man mit Prefixen um? Was will man mit Instanzvariablen tun? Wann verwendet man (sinnvollerweise Accessoren und wann direkten Zugriff auf Variablen?

Die Summe dieser kleinen Entscheidungen macht so viel von der ( olfaktorischen?) Sauberheit eines Programms aus, das man sich (eigentlich) nicht leisten kann sie dem Zufall zu überlassen.

Aber der Overhead das alles vorher festzulegen oder auch nur zu kommunizieren ist gewaltig. Vor allem wenn man weder Refaktoring-Werkzeuge hat die einem die Änderungen erleichtern, noch Unit-Tests die einem die Änderungen absichern, noch Reviews / Pair-Programming die einen zu der Entscheidung helfen was geändert werden soll.

Was tun?

Erleichterung finde ich in der Tatsache, das tatsächlich viele kleinen Entscheidungen kaum oder keine Rolle spielen. Wo die Klammern gesetzt werden, oder wie weit eingerückt wird ist egal. Man überließt diese Unterschiede einfach.

Dazu kommt die Aussage aus dem  Big Ball of Mud Paper: Ein Dreckball mag besser sein als gar keine Software.

Ist Sauberkeit also doch überschätzt?

  • Posted: 2008-03-04 21:39 (Updated: 2009-10-24 16:04)
  • Author: dwt
  • Categories: fnord code
  • Comments (0)

Bliki-Software

Nachdem ich ja schon vor ein paar Tagen? über das  FullBlogPlugin gesprochen habe, hab ich es jetzt endlich mal ausprobiert.

Schick. Deutlich schicker als das was ich jetzt hab.

Ok, der Editor ist irgendwie überladener als was ich jetzt im  TracBlogPlugin, und man hat immer Seitennahmen anstatt einem Datum plus einem Seitennahmen...

Mal schauen was mir noch so alles auffällt.

Muss ich nur noch herausfinden wie ich meine Posts migrieren kann. :)

  • Posted: 2008-03-03 22:06
  • Author: dwt
  • Categories: (none)
  • Comments (0)

Das iTeam: Die Jungs mit der Maus

Da gibt es eine grandiose englische Comedy-Serie  The IT Crowd bei der man sich nur totlachen kann.

Nun, da dachte sich SAT 1 wohl, hey, das können wir doch alles wörtlich ins Deutsche übersetzten und dem deutschen Fernsehpublikum verkaufen.

Nun, überraschenderweise hat sich gezeigt, das der Wortwitz der die Serie ganz wesentlich trägt bei dieser Übersetzung fast vollständig verloren geht.

DOH.

 Hier kann man sich selber überzeugen.

p.s.: Die Tiefe der Misere kann man ja schon am Titel erkennen. Der Wurde nämlich von "Die Jungs mit der Maus" in "Die Jungs an der Maus" geändert um auch noch die letzte Mehrdeutigkeit zu entfernen...

Armes deutsches Fernsehen.

if [ "z$?" != "z0" ] ; then ...

Aus dem Buildscript  imageFromFolder.sh des MOKit Releases.

Da ich so etwas schon oft gelesen habe, habe ich mich endlich mal dafür interessiert wieso zum Teufel so viele Programmierer das so machen. Könnte ja sein, hab ich mir gedacht, das es einfach so kranke sh implementierungen gibt, dass man das so machen muss damit das wirklich auf allen Systemen läuft.

Nun, ein guter Hacker im CCC den ich darauf mal ansprach antwortete darauf mit dem Klassiker: "Die machen das doch nur alle weil sie das Manual nie gelesen haben!" :-) Gut,  les ich mal nach...

Ok, also das Beispiel mal etwas detaillierter betrachtet:

hdiutil create # and then a lot of parameters

if [ "z$?" != "z0" ] ; then
    echo "Error creating image ($?)."
    exit 1
fi

Das hätte man doch in jedem fall auch so machen können:

hdiutil create # and then a lot of parameters

if [ 0 -ne $? ] ; then
    echo "Error creating image ($?)."
    exit 1
fi

Und das fängt den Sinn des Tests auch gleich viel besser ein.

Dann hätte man natürlich auch noch eine der Kurzformen wählen können, sowas wie

hdiutil create mumble mumble \
    || echo "Error creating image ($?)." ; exit 1

Das ich persönlich fast noch etwas klarer finde - erst recht wenn man es in eine Funktion error_exit oder etwas ähnlichem verpackt

error_exit ( )
{
    local exit_value=$?
    echo $1 "($exit_value)"
    exit $exit_value
}

hdiutil create mumble mumble \
    || error_exit "Error creating image." 

Überraschenderweise ist das nämlich gar kein Problem so etwas in der Shell zu machen. Macht sich nur offenbar kaum jemand die Mühe das "fine" manual mal zu lesen.

Oder zumindest so scheint es mir im Moment.

  • Posted: 2008-03-02 00:11 (Updated: 2009-10-24 16:00)
  • Author: dwt
  • Categories: fnord code
  • Comments (0)

Habermas nach Aktuell?

Habermas definiert die Privatsphäre aus der Oikos, der Lebensnotwendigkeit, die man braucht um sich die Überlebensfähigkeit zu sichern.

Was ist jetzt, wenn diese Sphäre wegfällt?

Schließlich sind immer mehr der überlebensnotwendigen Dinge in unserer Überflussgesellschaft einfach Verfügbar oder werden immer öffentlicher organisiert.

  • Arbeit findet nicht mehr auf dem eigenen Acker, sondern fremdbestimmt und öffentlich statt.
  • Heilung im Krankenhaus oder anderen öffentlichen Einrichtungen, denen man mühsam ein wenig eigenbestimmung der dabei entstehenden Daten abnötigt.
  • Fortpflanzung (oder zumindest Sex) wird immer mehr öffentlich zelebriert - die Schwulen machen es mit  Community Plattformen vor.

Wenn die Ernährung, Heilung und Fortpflanzung nicht mehr Privat ist, dann bleibt für den Rest vielleicht nicht mehr ausreichend Grund übrig Privat zu sein.

Dazu kommt, das durch das Internet und  passender  Software das veröffentlichen so einfach wird, dass immer mehr öffentlich gemacht wird.

Ob sich das "Private" diesem Sog auf lange Sicht entziehen kann?

Strange thoughts that I have...

YAY - ich bin auf der Apple Homepage

 Und zwar genau hier.

Na gut... das ich nur für  Novamedia arbeite und die Software trotzdem nur von mir Privat ist haben sie noch nicht hingekriegt, aber da Arbeite ich drann.

:)

Grundrecht per Verfassungsgericht

Das allgemeine Persönlichkeitsrecht ![...] umfasst das Grundrecht auf Gewährleistung der Vertraulichkeit und Integrität informationstechnischer Systeme.

Mehr im  Urteilsspruch des Bundesverfassungsgerichts.

Wow. Mir ist noch nicht ganz klar was für Auswirkungen dieses Gesetz alles haben wird.

Insbesondere die "Vertraulichkeit und Integrität" ist mir unklar. Mein Freund  Bernd formulierte das sehr schön: "Wenn StudiVZ öffentlich sagt das sie dein Profil an Werbetreibende verkaufen, dann gehört es zur Integrität der Plattform das diese Informationen Verkauft werden."

Großartig.

Na mal genauer durchlesen was das sagt.

In der Zwischenzeit:  Die Inspiration des Bundesverfassungsgerichts?.

Perry Rhodan - oder wie man großartige Ideen in den Sand setzt

Leider.

Von Perry Rhodan gibt es nämlich seit einiger Zeit  eine Hörbuch Ausgabe. Großartig! Die größte Science-Fiction Serie der Welt - endlich einfach jede Woche auf dem iPod haben, von professionellen Sprechern gemacht.

Super.

Dachte ich und kaufte mir ein Abo. Für 149,90 Euro.

Uff. Das ist für 50 Hefte. Im Print kostet ein Heft 1,85 Euro * 50 < 150 Euro. Deutlich. (Einzelhefte kosten mit knapp 8 Euro nochmal deutlich Premium)

Und damit fing erst an, denn an jeder Stelle wirkt das Produkt als wäre es gestümpert. Mit einer Ausnahme - die Hefte sind gut gesprochen und machen Spaß zuzuhören.

Das ist das was es so unerträglich macht - ich mag das Produkt. ich mag es sogar so gerne das ich es gekauft habe. Und gleichzeitig bin ich ständig davon entnervt. Und das von Problemen die ein bei einem Download von einer Warez-Seite nicht auftreten würden.

Gnah!

Die Webseite

  • Unübersichtlich
  • langsam
  • Auf der Heftübersicht werden die noch nicht für den Download-Freigeschalteten Hefte ohne Titelbild angezeigt. Jeder neue Kunde bekommt dadurch das Gefühl auf eine Unfertige Seite zu schauen.
  • Jedes Heft hat seine eigene Unterseite auf der man drei mal klicken muss um die Download-Links zu sehen. Man muss Qualität und anzahl der Dateien auswählen.
    • Die Download-Links erscheinen nicht via AJAX, man muss tatsächlich die ganze Seite neu laden. :-(
    • Die Einstellungen werden natürlich nicht gesichert, das heißt man muss die Einstellung jedes mal neu machen
  • Wenn man ein Heft herunterlädt, dann möglichst nicht mit dem Browser, sondern mit einem Download-Manager, weil es schon mal vorkommt das der Download auf eine Weise zusammenbricht die man im Browser nicht fortsetzen kann. Noch mal eine Komplizierung.

Die MP3s

  • Kein Titelbild
  • Keine Inhaltsangabe in den ID3 tags
  • Wenn man den ganzen Roman als eine Datei heruntergeladen hat, steht in der Titelzahl irgend etwas von Titel 70 von 70 Titeln. GNAH! Es ist nur EINN Titel.
  • Das Gendre "Hörbuch & Gesprochene Inhalte" oder ein anderes Passendes fehlt
  • Der Tag "Position Speichern und nach einer Unterbrechung dort Fortfahren" fehlt.
  • Keine Kapitelmarker (Das Format ist MP3 - ausschließlich, ein Alternativangebot mit AAC fehlt)

Die Hefte an sich:

  • Keine Titelbilder
  • Keine Zusammenfassung was vorher war in Textform
  • Keine Leserbriefe
  • Keine Risszeichnungen
  • Keine Clubnachrichten
  • Keine PR-Magazine
  • Keine PR-Computer
  • Keine PR-Encyclopdien

Überhaupt, damit ich die Hefte genießen kann, muss ich sie jede Woche (nachdem ich eine e-mail bekommen habe)

  • Die Webseite ansteuern
  • Umständlich einloggen
  • Herausfinden welche Hefte ich noch nicht heruntergeladen habe
  • Von diesen Heften die Seite öffnen
  • Die Hefte von Hand herunterladen
  • Die Hefte in iTunes importieren
  • Die Lautstärkenanpassung abwarten
  • Von irgendwoher die Titelbilder besorgen und auf die Hefte anwenden
  • Die ganzen Tags von Hand fixen
  • Alles auf den iPod syncen

Und dann kann ich sie endlich hören.

Verglichen damit das ich vorher einmal die Woche sowieso am Kiosk vorbei gekommen bin habe ich also ganz schön was zu tun um weniger für mehr Geld zu kriegen.

Was ich eigentlich will, ist dagegen folgendes:

  • Einmal einen Podcast in iTunes einbinden
  • Mich einmal die Woche darüber freuen das mein iPod schon wieder ein neues Perry-Rhodan Heft enthält.
  • Mich einmal die Woche wenn ich Lust habe über das PDF im Podcast hermachen das die Extras enthält.

Das Produkt ist Toll - endlich Perry Rhodan bequem zum Hören - und gleichzeitig so fürchterlich das man es wirklich nicht weiterempfehlen kann.

GNAH!

Wieso nur können die illegalen Download-Seiten das nur so viel besser? Da geht das schon lange.

So jedenfalls kann ich niemanden an die Wand argumentieren der sich die Folgen lieber illegal saugt.

Saugen tut das Produkt ja schließlich schon selbst. :-(

Kaiserschmarrn

Der Schmarrn im Ofen Ja so ein Schmarrn sag ih!

Ich war am Wochenende im Bayern - zu einem Geburtstagsfest. Da hatte ich das Glück das ein ganz hervorragender Koch da war - der mir gezeigt hat wie man einen richtig leckeren  Kaiserschmarrn macht.

Das Geheimnis: Der Schmarrn wird im Ofen bereitet und geht dadurch besonders schön auf und macht gleichzeitig viel weniger Mühe.

Hier die Details:

Der Schmarrn wo er grad aus dem Ofen kommt

Menge

Nachtisch
ca. 2 Eier pro Person
Hauptgericht
ca. 3-4 Eier pro Person

Zutaten

  • 1l Milch
  • ca. 3/4 kg Mehl (etwas mehr)

Kräftig glatt rühren und für mind. 1 Stunde gehen lassen (Etwas Milch oben drauf, damit sich keine Haut bildet)

Ofen auf 250° Ober UND Unterhitze aufheizen

  • 15 Eier in den Teig schlagen und ihn glatt rühren

Der Schmarrn beim Zerteilen

In einem tiefen Blech

  • ca. 50-100g Butter schmelzen lassen
  • Zucker (ordentlich - der Teig ist ja völlig ungesüßt) und
  • Mandelsplitter (wenn man hat) draufstreuen

und dann im Ofen den Zucker karamelisieren lassen. Fertig ist die Vorbereitung, wenn die ersten Mandelsplitter dunkel werden.

Den Teig auf die Mischung geben (wenn die Zucker-, Butter-, Mandel-Mischung nicht drunter bleibt, war's zu viel Butter). Nicht zu viel Teig, nur so das alles gut bedeckt ist. Noch einmal Zucker (reichlich), Mandelsplitter und wenn man mag Rosinnen (gerne auch in Rum eingelegte) drauf, dann im Ofen 'anbacken', bis die ersten Stellen anfangen Braun (Mahagoni) zu werden.

Der Zerteilte gesüßte Schmarrn

Jetzt den Schmarrn wenden und fertig backen. Je nachdem wie groß die Form ist muss man ihn dazu etwas klein schneiden. Fertig ist, wenn die andere Seite auch schön Goldbraun (Mahagoni) ist.

Dann zerreißen, durchmengen, nochmal Zucker (soll ja schon süß schmecken - ausserdem schmeckt der Zucker wenn er Karamelisiert ist nicht mehr so süß) und im Ofen ein letztes mal kurz "ankaramelisieren".

Mit Puderzucker auf einer vorher warmgestellten Form anrichten und servieren. Falls es schon dunkel ist darf man auch gerne Flambieren... :)

  • Posted: 2008-02-25 20:36 (Updated: 2009-10-24 15:47)
  • Author: dwt
  • Categories: cucina
  • Comments (0)

Kirche Modern!

Jaja, das gibts!

 Ab jetzt kann man mit Gott auch Chatten!

Ha!

Und sogar in schick!

Me: Do you know Eliza?
God: Eliza -- also known as doctor, is the original psychiatrist program 
     developed by Joseph Weisenbaum at MIT in the 1960's.
Me: How fast you type!
God: I can reply to about  queries per hour.
Me: How many?
God: How many would you guess?
Me: NaN from your sentence.

:-)

Legalese und Babelfisch

Gefunden auf  Whatatop.com

At the moment when the user sends to us an image, it is granting us the right and the license for his use, free of royalties, not exclusive and transferable to third, that authorizes us to use it, distribute it, show it and spread it, and incorporate it in other works for the targets of this web page. Also, it grants identical rights to the USERS of our portal for his visualization, and uses deprived without fortitude of lucre. The granting of these licenses, they will remain revoked with the simple retreat of the image of the web, remaining current, permanent and irrevocable the granted ones before his retreat, without detriment to the rights of intellectual property that it shows on the image.

Was will uns der Autor damit wohl sagen?

Die Seite ist offenbar ein kleines Community-Projekt wo man Bilder hochladen kann ( einiges  davon  gefällt  mir  auch  ganz  gut)

Aber die Frage welche Rechte nun wer an diesen Bildern genau hat - die bleibt irgendwie offen. Persönlich habe ich ja die Vermutung, das der Text von einem Anwalt auf Spanisch geschrieben wurde um dann Maschinell oder mit wenig Verstand übersetzt zu werden.

Nun ja, bleibt er mir halt spanisch. :)

Café Wall Illusion Saver (was Skewed Lines Saver)

Here it comes, the new version!

Now with configurable animation speed and block size. (Though I still find the default most pleasing :)

Oh, and I also fixed the buildscript so it now produces good zip files. Sorry for that on the first try.

Have fun trying it till your eyes become squared (as my boss uses to say. :)

  • Posted: 2008-02-19 20:45
  • Author: dwt
  • Categories: (none)
  • Comments (0)

Trac als Homepage

(Zu  Amy Amy Amy)

Trac als Homepage hat sich für mich ja schon bewährt. Ein Wiki, eine Versionsverwaltung, Theoretisch auch noch Bug-Tracking (deaktiviert wg. Spammern) - was will man mehr.

Naja, einen Blog. Und da fängt das Problem dann auch schon an.

Traditionell sind Blogs alle in HTML oder mit merkwürdigen Wysiwyg-Editoren die nicht richtig funktionieren oder so beschränkt sind, das man darin gar nicht alles machen kann was man will (z.B. Source-Code highlighten. Noch dazu Objective-C!)

Ausserdem will ich das mein Blog sauber mit meinem Wiki Verlinkt ist und ich die normale Wiki-Syntax zum Bloggen verwenden kann.

Das mache ich bisher mit dem  TracBlogPlugin, nachdem ich früher mal mit dem  SimpleBlogPlugin eher... unzufrieden war.

Leider aber ist auch das TracBlogPlugin nicht perfekt. Zwar setzt es auf das  TracTags Plugin auf, das ganz excelent ist - aber leider bleiben einige schwächen.

  • History + Archiv ist mehr oder weniger nicht vorhanden
  • Kommentare gehen nicht.
    • Moderation derselben schon gleich gar nicht.
  • RSS-Feeds sind eher... nun ja, mit einigem Experimentieren kriegt man einiges hin, aber schön ist es nicht.
  • WeblogPings und Backlinks werden nicht unterstützt.
  • Blogrolls etc... alles von hand.
  • XMLRPC... Ah well.

Weiterentwickelt wurde das Plugin seit fast einem Jahr nicht mehr (ok, in  den letzten Tagen passiert wieder etwas, mal schauen wie das weiter geht)

Jetzt hatte ich mir schon überlegt [vielleicht selber Hand anzulegen], da stellt sich heraus, das schon jemand anderes deutlich entnervt war und das Plugin  FullBlog entwickelt hat.

Pro:

  • Feeds++
  • Kategorien (mit TracTags Unterstützung?)
  • Kommentare + Spamfilterung!
  • XMLRPC support

Cons:

  • Seiten sind nicht im normalen Wiki-Namespace (Aber man kann wohl hin und her linken)
  • Ich kann also nicht alle bestehenden Postings direkt übernehmen
  • Der Code malt (da er keine normalen Wiki-Seiten verwendet) direkt in der Datenbank herum. Gnah.

Mehr hab ich mir noch nicht angesehen. Aber eine vernünftige Blog-Integration für Trac wäre Gold wert. Will schließlich heute jeder haben, einen Blog. Ah well.

Eye in the Sky Projektideen:

  • Endlich mehr Blogging Features hier im Trac
  • Mehr Release Management Unterstützung
    • Upload von neuen Releases
    • App-Cast auto-generieren - mit Wiki-Seite für die Change-Notes
  • Buildserver wäre ein Traum - geht aber nicht solange ich auf Linux hoste und für den Mac Entwickle.

Diesen Freitag 17:00 Uhr treff ich mich mit  Felix und  Felix in der  Freitagsrunde und wir werden mal weiter beraten was wir mit Trac weiter machen. Wer Trac Hacken mag oder schon tut und dazukommen mag ist natürlich herzlich eingeladen. :)

Bei Mac Donalds

Nicht nur das es jede menge kranke  Mc  Donalds  Werbung gibt.

Noch viel kranker sind nur  die Leute die bei McDonalds einkaufen...

LOGen von beliebig vielen Argumenten

Fehlt noch ein letzter Schritt - der erstaunlicherweise ganz einfach war und ausserdem noch ein ganz anderes Problem löste...

Zuerst die Implementierung:

#define LOG(what, variableArguments...) \
    [[Log sharedLog] logObjcType:@encode(typeof(what)) \
        arguments:(void *)what , ##variableArguments]

- logObjcType:(char *)typeString arguments:(void *) what, ...; {
    id formatString =  [self stringFromType:typeString inValue:what];
    
    va_list variadicArguments;
    va_start(variadicArguments, what);
    
    id logString = [[[NSString alloc] initWithFormat:formatString 
                    arguments:variadicArguments] autorelease];
    
    va_end(variadicArguments);
    
    return [self log:logString];
}

Eigentlich hatte ich hier mehr Probleme erwartet.

Ganz nebenbei löst das auch noch ein Problem von ganz zu Anfang:

LOG(@"%@", [NSString stringWithFormat:@"%s,%s", "fnord", "fnord"]);

Das macht jetzt keine Probleme mehr, da die zusätzlichen Komas vom Präprozessor (fälschlicherweise) als zusätzliche Argumente zur dem variadischen Makro aufgefasst werden. Hehe...

Jetzt fehlt nur noch ein Backend für den Logger und ich bin glücklich. Andererseits... da gibt es natürlich auch  Log4Cocoa das ich einfach erweitern könnte.

Hm. Mal schauen.

C-Typen in die Laufzeitumgebung heben

Wendet man @encode() jetzt auf ein paar Deklarationen an, erhält man folgende Ergebnisse:

#define LOG(what) [[Log sharedLog] logObjcType:@encode(typeof(what)) arguments:(void *)what]

LOG(@"fnord"); // @
LOG("foo"); // [3c]
char *string = "fnord";
LOG(string); // *

Ich parse das so:

#define RAISE_UNSUPPORTED_TYPE(encodedType) \
    [NSException raise:NSInvalidArgumentException \
        format:@" you are trying to log something that is not a string: %s", encodedType]

- stringFromType:(char *)encodedType inArray:(void *)what; {
    if ('[' != *encodedType) RAISE_UNSUPPORTED_TYPE(encodedType);
    
    encodedType++;
    unsigned length = strtol(encodedType, &encodedType, 10);
    if ('c' != *encodedType) RAISE_UNSUPPORTED_TYPE(encodedType);
    
    return [NSString stringWithCString:what length:length-1]; // \0 ignored
}

- stringFromType:(char *)encodedType inValue:(void *)what; {
    if ('@' == *encodedType) return [(id)what description];
    if ('*' == *encodedType) return [NSString stringWithCString:(char *)what];
    if ('[' == *encodedType) return [self stringFromType:encodedType inArray:what];
    RAISE_UNSUPPORTED_TYPE(encodedType);
    return nil; /* never reached */
}

(Vorschläge wie man das besser machen kann, bitte gerne an mich! ( z.B. via spamfaenger ät gmx de))

Fehlt nur noch die Erweiterung auf beliebig viele Argumente. Dazu aber morgen mehr. :)

  • Posted: 2008-02-15 22:18 (Updated: 2008-02-16 09:17)
  • Author: dwt
  • Categories: code
  • Comments (0)

Mit C Makros etwas tun, was mit ihnen nicht möglich ist

Das Problem ist also ein Makro zu schreiben, das typsicher und nach Typen überladen ist, eine variable Anzahl von Argumenten erhält und zudem einfach und verständlich ist.

Zugegeben, mir ist noch nicht klar wie ich das umsetzen kann.

Aber, wenn man das Problem nur ein klein wenig vereinfacht, und nur versucht eines oder mehrere Argumente zu unterstützen...

Also zum Beispiel ein LOG() Macro, dass als erstes Argument irgend etwas erhalten kann (für den Anfang, irgend etwas das sich in einen String umwandeln lässt) dann erhält man etwas das sich so verwenden lässt:

LOG(@"fnord");
LOG("fnord");
char *string = "fnord";
LOG(string);
LOG(@"%@", @"fnord");
LOG(@"%s", "fnord");
LOG(@"%d", 10);
LOG("%s", "fnord");
LOG(@"%@", [NSString stringWithFormat:@"%s,%s", "fnord", "fnord"]);

Die Implementierung ist allerdings etwas tricky.

Typinvariante Makros wie MAX(x, y) schreibt man üblicherweise so:

#define MAX(x, y) ({ \
    typeof(x) __x = (x); \
    typeof(y) __Y = (y); \
    (__x < __y) ? __x : __y; \
})

Das bedeutet durch die speziellen klammern ({ ... }) wird das Makro wie eine Funktion behandelt (eine GCC-Extension) und die übergebenen Ausdrücke nur einmal auswertet und in einer Variablen vom korrekten Typ speichert. int m = MAX(i++, ++j); ist damit also kein Problem. Schließlich ist der Wert der letzten Zeile der "Rückgabewert" der Makro-Funktion

Loggen ist aber schon noch ein Problem, da mit diesem Trick, der Typ noch nicht herauszufinden ist. Mein erster Ansatz mit  __builtin_types_compatible_p(typeof(aValue), char *) etc. brachten mich da nicht weiter. Es braucht noch die  @encode() Anweisung von Obj-C. Direkt im Makro mit if (@encode(char *) == @encode(typeof(aValue))) war es dann allerdings auch noch nicht obwohl ich gerne mit  __builtin_choose_expr( aConstant, expressionOne, expressionTwo ) zur Compilezeit alles erledigt hätte.

Nun ja, dann eben zur Laufzeit mit @encode().

#define LOG(aValue) [[Log sharedLog] logObjcType:@encode(typeof(aValue)) value:aValue]

Die erzeugt aus einem Typ nämlich einen C-String - der zur Laufzeit geparst werden kann um daraus herauszulesen wie der void-Pointer auf aValue interpretiert werden muss.

Wie ich das gemacht hab - morgen. :)

  • Posted: 2008-02-15 09:02 (Updated: 2008-02-15 21:19)
  • Author: dwt
  • Categories: code
  • Comments (0)

Macros in C

(Zu "Feuer Frei" von Rammstein)

Makros in C sind ja so eine Sache.

Zum einen kommt man in C an vielen Stellen gar nicht ohne aus, da sie die einzige Möglichkeit sind Ausdrücke OHNE sie zu evaluieren an mehreren stellen zu verwenden. Zum anderen Sind sie rein Textuell, "unhygienisch" und haben keine Ahnung was in ihnen eigentlich passiert.

Das macht vor allem in Objective-C mächtig Schwierigkeiten. Das hier zum Beispiel geht nicht.

#define DO(argument) argument

DO([NSString stringWithFormat:@"%s", "asdf"]);

Der Compiler meckert hier über zu viele Kommas und denkt das ich das Makro mit zwei Argumenten aufrufen will. Gnah.

Warum beschäftigt mich das eigentlich?

Ich möchte gerne Macro's haben, die je nach Typ des Arguments etwas anderes machen. Für Unit-Tests z.B. möchte ich sagen:

- (void) testOverloadedAssert
{
    ASSERT_EQUALS(3, 3);
    ASSERT_EQUALS(@"barf", @"barf");
    ASSERT_EQUALS("bar", "bar");

    // These should fail in a sensible manner
    ASSERT_EQUALS("bar", @"bar");
    ASSERT_EQUALS(3, 3.3);
}

Das ist aber schon ein großes Problem. In C++ könnte man den ersten teil ja noch über überladene Funktionen lösen - das geht in reinem Objective-C aber schon mal nicht. Dazu kommt ja noch der zweite Teil - da kriegt man vielleicht noch Compiler-Fehlermeldungen, wenn der Compiler nicht auto-conversion von Parametern anwirft. :-/

Dazu kommt, das ich C++ nicht mag und schon gar nicht in alle meine Tests eine zwingende Abhängigkeit auf C++ einfügen will.

Will man dann aber noch weiter gehen, wird es endgültig schwierig. Hier ein paar Beispiele:

- (void) testAdvancedAssert
{
    ASSERT_EQUALS(3.3, 3.3, 0.1 /* accuracy */);
    ASSERT_EQUALS(3.3, 3.3, @"important meta information");
    ASSERT_EQUALS(3, 3, @"info contains: %@ in %s:%d",
         @"other info", __PRETTY_FUNCTION__, __LINE__);
}

In reinem C hätte man hier gar keine Möglichkeiten mehr etwas zu machen.

Wie weit ich mit einer Lösung dennoch gekommen bin - morgen. :)

  • Posted: 2008-02-13 21:34 (Updated: 2008-02-14 07:47)
  • Author: dwt
  • Categories: code
  • Comments (0)

Geek-Humor

Schnell noch aus der Kategorie "Geek-Humor".

Für alle die die  Prometheus Seite noch nicht besucht haben.

Großartig.

Fone2Phone

Fone2Phone in Action My first complete piece of work for  Nova Media. I did this after working there for about a month.

 Fone2Phone allows you to have a one stop solution to transferring everything from your cell phone to your macintosh. From there on you can either put it on your iPhone or iPod (Touch), just use it on your System or sync it to a different cell phone.

As far as the technology is concerned Fone2Phone is a subset of our more capable application  FoneLink which allows you to do all this and more. Check it out!

Skewed Lines Screen-saver

Screenshot of the SkewedLines Screensaver Just two days ago I watched the episode  Wie man sich täuschen kann of  Quarks und Co. (Which has a very nice  Video Podcast - by the way)

They had this beautiful illusion - but in an animated form, which I have never seen before.

Well, after two hours, I had a screen-saver running and really like the results.

So, here you go too. :)

God wrote in Lisp-Code!

Supreme Geek-Unterhaltung aus dem Vortrag 50 of 50?.

 download - mp3 (von  Prometheus Music)

Beautiful Code

"Lest mehr Code!" werde ich mir immer als Schlusswort des  Literarischen Code-Quartetts merken.

Und weil man ja auch verdauen muss was man liest, empfiehlt sich natürlich guter Code - an dem man auch noch mehr lernen kann.

Daher war ich begeistert, dass O'Reilly das Buch  Beautiful Code ( blog) herausbrachte. Das geniale daran: Es werden nicht nur gute Programme abgedruckt, sondern Erklärungen, was hervorragende Programmierer daran schön finden und warum!

Und was für Perlen da drin sind.

Besonders haben mir gefallen (ich bin noch nicht durch)

  • Kapitel 1: Regex matcher in C - Brian Kernighan hat Stil! (und pointer :)
  • Kapitel 14: Wie sich LAPACK über die Zeit und die verwendete Hardware veränderte
  • Kapitel 17: Ein Rundgang durch die Layer des Virtuellen Dateisystems von BSD
  • Kapitel 18: Wie Pythons Dictionaries implementiert sind
  • Kapitel 22: Deadlock-Detection und subtile Bugs im Solaris Kernel (faszinierend)

Und so geht es grade weiter.

Gibts auf  Amazon oder einem Tracker in deiner Nähe.

  • Posted: 2008-02-08 05:05 (Updated: 2008-02-08 21:07)
  • Author: dwt
  • Categories: review
  • Comments (0)

Kathy Sierra - Didaktik für Reiche

… und wem es reicht, von Lehrenden ständig für dumm verkauft zu werden.

Endlich mal jemand, der das, was wir aus Computerspielen und Psychologie gelernt haben, zu einem schlüssigen Didaktik-Konzept zusammenbringt und auf ernsthafte Themen anwendet!

Und das beste - sie bringt ihre Theorien und deren Anwendungen in diesem wundervollen Podcast (von der OOPSLA) auch noch auf den Punkt!

Yeah.

 download - mp3

p.s.:  Kathy Sierra hat nicht nur die  Head First-Serie bei O'Reilly mitgestaltet, sondern auch einen  Blog den sie leider aufgegeben hat, nachdem ein paar Idioten sie auf ihrem Blog aufs Korn genommen haben - bis hin zu äusserst graphischen Drohungen. :-(

Hoffentlich fängt wieder zu Bloggen an - und ich bin sicher, dass jede e-mail hilft!

50 of 50

 Guy Steele kennt man ja.  Richard Gabriel schon weniger.

Wenn die beiden aber  zusammen einen Vortrag auf der OOPSLA halten - dann sollte man zuhören.

Richtiges, echtes, Geek-Kabarett.

Wie man eine schöne Animation macht...

Das ist nämlich gar nicht so einfach.

Ich arbeite ja nun seit ein paar Monaten bei  Novamedia - und mein erstes Projekt war, (mit einem 'sportlichen' Zeitplan von etwa 6 Wochen) bis zur  Macworld im Januar 08 das Produkt Fone2Phone fertigzustellen.

Ziel der Aktion war es, ein Produkt zu haben, was bei der Migration von einem Telefon weg hilft. Dazu sollte Fone2Phone alles, was das Telefon an Daten enthält, aus diesem herausholen und in die jeweils zuständigen Apple-Applikationen befördern.

Das ist für sich genommen natürlich recht wenig (wenn auch technisch anspruchsvoll), darum haben wir uns von vornherein das Ziel gesetzt, mit dem Produkt auf der Macworld möglichst viele Preise abzusahnen. (Was auch  geklappt  hat. :)

Aber das ist alles nur Vorrede (und Stolz, schließlich hab ich damit gezeigt, was ich kann). Also auf zum eigentlichen Zweck dieses Posts.

Animation des Übergangs

Die Animation. Damit Fone2Phone wirklich geil aussieht, haben wir tief in die Trickkiste gegriffen ('Wir' ist in diesem Zusammenhang mein Kollege  Andreas).

Denn damit die Animation richtig gut aussieht, überlagern wir drei Elemente.

  1. Eine Animation, die die beiden Views austauscht
  2. Eine variable Geschwindigkeit, das heißt die Animation beginnt langsam, beschleunigt sich dann und wird am Schluss wieder langsam.

Bis hierher wäre ich auch darauf gekommen - aber der eigentliche Geniestreich liegt in dem letzten Element, das da noch oben drauf kommt:

  1. Die Views werden mit dem Hereinschieben eingeblendet / mit dem Herausschieben ausgeblendet.

Dieses letzte Element macht die Animation soo viel besser - obwohl es in der Komposition zuerst bewust überhaupt nicht wahrgenommen wird.

Und das ist die Lektion, die ich heute mitgenommen habe.

  • Posted: 2008-02-04 21:56 (Updated: 2009-10-24 16:26)
  • Author: dwt
  • Categories: software
  • Comments (0)

Vergessene Objective C-Möglichkeiten

Da gibt es doch tatsächlich in Objective C die Möglichkeit, jederzeit eine Klasse unter einem anderen Namen zu importieren.

Nice.

@compatibility_alias MyShortClassName MyVeryLongClassNameThatIDontWantToTypeEveryTime;

Von  Write a Screen Saver Part II

  • Posted: 2008-02-03 21:53 (Updated: 2008-02-03 22:10)
  • Author: dwt
  • Categories: code links
  • Comments (0)

Shell-Scripting aus Python

Ich wollte ja schon länger meine Shell-Scripte eigentlich gerne in Python schreiben - einfach weil mich bash so fürchterlich nervt.

Allerdings ist der call-out zu shell-scripten ziemlich ekelhaft. All die schönen / ekelhaften Dinge die man in der Shell so einfach machen kann, gehen nicht.

Naja, dachte ich. :)

Mit ein bisschen Googeln hab ich nämlich das hier gefunden.

Wunderschön einfach und simpel:

import shell

print shell.prefix
shell.prefix="/usr/bin"
print shell.prefix
shell.wait=False
print "calling true:", shell.true().returncode
shell.wait=True
print "calling true:", shell.true().returncode

shell.prefix="/bin"
print shell.ls("~/").stdout

Nice! Nie wieder Bash bashen.

:)

  • Posted: 2008-02-03 20:43 (Updated: 2008-02-03 20:47)
  • Author: dwt
  • Categories: code
  • Comments (0)

Mehr Transparennz

Mehr Demokratie? = Dieser Gedanke trägt sich schon längere Zeit mit mir herum.

Unter Transparenz ist natürlich viel subsummiert. Dazu gehört natürlich die  Wikipedia. Ich finde aber Transparent-Macher wie  Udo Vetter mit dem "Law Blog" oder  Thomas Knüwer mit "Indiskretion Ehrensache" oder  Garr Reynolds mit "Presentation Zen" im Moment viel spannender.

Diese Leute sind für mich Kondensationskeime für die Transparenz die das Netz rein aufgrund der Tatsache schafft, das es so einfach ist und sich dann auch Leute finden die diese Möglichkeiten nutzen.

Für mich bedeutet das, das ich einen ganz anderen Einblick in den Berufsstand und die Denkweise dieser Menschen erhalten kann. Mir eröffnet sich die Möglichkeit zu verstehen was sie tun und wie sie denken.

Hoch spannend. Und meiner Meinung nach auch hoch politisch.

Andere machen auch Fehler...

Es ist doch immer wieder angenehm, wenn man feststellt das man nicht der einzige Mensch auf der Erde ist der Fehler macht.

Damit dieses Post besser via google zu finden ist, ab hier auf Englisch.

--- snip ---

For anyone trying to develop QT-based apps on leopard, take care. I couldn't find this bug documented anywhere, so I'm writing this up here.

The Leopard CDs Apple shipped with new computers right after leopard came out contain a very old QTKit Version in the 10.4u.sdk of Xcode 3.0.

This means (at least) that you get spurious warnings on building - and we have also found that it makes apps built on this machine (Leopard, Intel) behave very badly on PPC Tiger machines. That is, QuickTime Exports would fail silently. (This is what initally triggered us finding this)

To detect it, have a look at the file: </Developer/SDKs/MacOSX10.4u.sdk/System/Library/Frameworks/QTKit.framework/Versions/A/Headers/QTMovie.h> and look till when the copyright goes. If it is till 2005 -> You have the old version. If it is till 2007 -> You most likely have the correct version.

I don't know if there are other problems with the CD Version of Leopard, so if you are using it, take care and consider installing something different!

Oh, and of course I filed a radar: 5699456

--- snap ---

Ah well. Mal schauen wo ich dieses Post unterbringen kann.

  • Posted: 2008-01-22 10:02 (Updated: 2009-10-24 16:22)
  • Author: dwt
  • Categories: fnord code
  • Comments (0)

Jetzt oder Nie

Herbert Grönemeier ausgerechnet. Wer hätte das gedacht.

Total schräg.

 Jetzt oder Nie

  • Posted: 2008-01-12 17:35
  • Author: dwt
  • Categories: (none)
  • Comments (0)

Descriptiver Code…

Es geht doch nichts über selbstbeschreibenden Code. ;)

    IF_LAST_ERROR
        ERROR_HANDLING

Hat mir dann auch gar nichts genützt die nächsten Zeile zu lesen:

    diglossia* oracle=NULL;
    struct NmGsmCtrlCoreMsg* Msg=NULL;
    
    oracle=((diglossia*)PtrParamG->oracle);

Habt Mitleid mit mir....

Bitte kein C...

Also eines muss man Programmierern lassen, erfinderisch sind sie.

Heute stellt sich mein Verständnis von C wirklich auf die Probe.

Zuerst der Vorlauf, da gibt es einen parameter controller der immer als int übergeben wird - natürlich hartkodiert und ohne jeden kommentar was wofür steht. Ok, das ist jetzt ekelhaft, aaaber.

Dieser int wird dann in einem struct element iType gespeichert. Um herauszufinden was dieser Parameter nun macht habe ich also mal durch den SourceCode gegreppt um herauszufinden was damit passiert und bin dabei auf die viel versprechende Zeile switch(self->iType) gestoßen. Groß war da meine Freude, wenn auch leider nur kurz.

    switch(self->iType)
    {
            RefProg=USBprogressIndicator;
    }

Da stellt sich natürlich die Frage... was macht der Compiler daraus eigentlich? Interpretiert er es als

    switch(self->iType)
    {
        case default:
            RefProg=USBprogressIndicator;
    }

oder doch als:

    switch(self->iType)
    {
            RefProg=USBprogressIndicator;
        case default:
    }

i.e. heißt das eigentlich das der Code darin nicht ausgeführt wird? Und verhält sich das auf anderen Compilern / Compilerversionen genauso?

Ist doch immer wieder schön solche zoten in Sourcecode zu finden. :)

Update

Inzwischen habe ich nachgeprüft was da Sache ist. Meine Vermutung war, dass der Programmierer es ja nur im Code gelassen hätte, wenn es einen Sinn hat. Nun ja, man glaubt ja an das Gute im Menschen.

Ich musste mich dann aber doch eines besseren Belehren:

#include <stdio.h>

int main (int argc, char **argv) {
        int foo = 3;
        switch(foo) {
                printf("gotit\ne\n\n\n");
                return -1; 
        }

        printf("didn't get it\n");
        return 0;
}

Wie man am Beispiel sehen kann (mit etwas wie "gcc -o foo test.c && ./foo" ist es einfach zu zeigen das switch(foo) tatsächlich den gleichen effekt hat wie

#include <stdio.h>

int main (int argc, char **argv) {
        int foo = 3;
#if 0
                printf("gotit\ne\n\n\n");
                return -1; 
#endif

        printf("didn't get it\n");
        return 0;
}

Was ich wirklich herzlich Sinnlos finde.

  • Posted: 2007-12-13 10:09 (Updated: 2007-12-13 21:24)
  • Author: dwt
  • Categories: fnord
  • Comments (0)

Future of Media

Anscheinend gibt es immer mehr Leute die die Zukunft unserer Medien relativ objektiv beurteilen können.

Besonders schön fand ich daher den sehr umfassenden Blick den  Gerd Leonhard auf die Zukunft der Medien wirft.

Hörenswert!

  • Posted: 2007-11-17 13:53 (Updated: 2008-02-13 21:29)
  • Author: dwt
  • Categories: links
  • Comments (0)

War mal wieder später gestern....

  • Posted: 2007-11-15 18:41 (Updated: 2008-02-13 21:29)
  • Author: dwt
  • Categories: links
  • Comments (0)

Überwachung

„... Wer meint nichts zu verbergen zu haben, der übersieht, dass er sich täglich die Freiheit nimmt, im Stillen Entscheidungen zu treffen. Wenn selbst die Entscheidung, bei welchem Bäcker man wie oft seine Brötchen holt plötzlich für den Staat von Interesse sein wird, wird auch dem letzten klar werden, dass er etwas zu verbergen hat...“

Via  Rollmops.

Die klassischen Qualitätsmedien

Ich möchte dringend jeden Leser bitten, ab jetzt keiner DPA-Meldung mehr zu vertrauen.

 Denn was der Stern und  viele andere Blätter da als DPA-Meldung abgedruckt haben, geht wirklich auf keine Kuhhaut:

Protest gegen den "Überwachungswahn"

Unter dem Motto "Freiheit statt Angst: Stoppt den Überwachungswahn" haben rund 50 Bürgerrechtsgruppen, politische Parteien und Vereine einen Protestmarsch durch Berlin organisiert. 2000 Menschen folgten den Aufruf, doch der Marsch wurde abgebrochen.

Rund 2000 Menschen haben am Samstag in Berlin gegen eine Verschärfung von Sicherheitsgesetzen protestiert. Der Demonstrationszug setzte sich am Nachmittag unter dem Motto "Freiheit statt Angst: Stoppt den Überwachungswahn" am Brandenburger Tor in Bewegung, teilte eine Polizeisprecherin mit. Der von rund 20 Bürgerrechtsorganisationen und politischen Gruppen organisierte Protestmarsch wurde nach Veranstalterangaben von der Berliner FDP- Fraktion, der Berliner Linken und dem Grünen-Bundesvorstand unterstützt.

Polizei werden Übergriffe vorgeworfen

Der Protestumzug blieb allerdings nicht friedlich: Acht Festnahmen wegen Verstoßes gegen das Versammlungsgesetz und ein verletzter Polizist waren die vorläufige Bilanz der Ordnungshüter. Die Veranstalter, die der Polizei Übergriffe vorwarfen, brachen die am Brandenburger Tor gestartete Demonstration auf Höhe der Friedrichstraße ab.

Um mal  Netzpolitik.org zu zitieren:

Der kurze Text wimmelt nur so von Fehlern. Es waren mehr als 50 Organisationen, die zur Demonstration aufgerufen haben. In der Einleitung schrieben sie die Zahl auch korrekt. Es waren nach Polizeiangaben 8000 Menschen, was später gegenüber Heise auf 15.000 Menschen ausgeweitet wurde. Und die Veranstalter haben die Demonstration nicht abgebrochen, sondern der “schwarze Block” hat zum Schluss seinen Austritt aus der Demonstration erklärt. Das ist was ganz anderes.

Also bitte. Aus der Tatsache, dass diverse andere Blätter das unverändert und textgleich gebracht haben, schließe ich, dass das entweder die Original-DPA-Meldung war oder dass die Kollegen voneinander abschreiben, ohne die korrekte Quelle zu nennen.

Da ich letzteres dann doch nicht glauben kann, hat es wohl die DPA versaut.

Also Fazit: DPA: Bad, STERN: Bad, Taz:  Good, Netzpolitik.org:  Good

Seufz. Kann man wirklich nur hoffen, dass diese Käseblätter dem Dahinschmelzen der Werbebudgets in den klassischen Medien möglichst schnell zum Opfer fallen.

Worktimer Erweitern

Ich würde ja gerne eine Erweiterung für den Worktimer bauen - z.B. ein Widget, das es erlaubt, einfacher zu tracken, dass man etwas getan hat.

Dazu hab ich mir auch schon was überlegt - und zwar würde ich das in etwa so machen:

How I'd like the worktimer-widget to look.

Links kann man mit Start/Stop einfach sagen, dass man losgelegt hat bzw. gerade fertig geworden ist, und auf der Anzeige rechts soll die Gesamtzeit der letzten Sitzung plus vielleicht noch die Summe dieses Tages und dieser Woche zu sehen sein.

Das Problem
meine eigenen Graphiker-Techniken reichen leider noch nicht ganz aus, um so etwas zu implementieren.
Die Lösung
Da das hier Open Source-Software ist, würde ich mich über eine Mail an spamfaenger [at] gmx.de mit einem Hilfsangebot freuen. :)
  • Posted: 2007-08-24 23:47 (Updated: 2009-10-24 16:26)
  • Author: dwt
  • Categories: software
  • Comments (0)

Worktimer

The Worktimer in action! When I wrote my Diplom Thesis (Master's Thesis) I needed something to track how much time I spent on it each week. Well, what better excuse to play a bit with core-data and cocoa-bindings. :)

In the app you can add new times (the + button). It's pre-filled to the current time, but you can always insert the current time with <Command-T>. You can also always adjust the previous entries by selecting them down in the backlog and adjusting the values.

Also note the neat weekly summary available in the Window Menu (or via <Command-R>).

  • Posted: 2007-08-24 23:29 (Updated: 2007-08-25 10:24)
  • Author: dwt
  • Categories: software
  • Comments (0)

VLC Compilieren

Hab ich eigentlich schon über VLC gelästert? Wieso überrascht mich das im Nachhinein überhaupt nicht mehr, dass die Mac-Oberfläche immer noch so viele Bugs enthält, die eigentlich so einfach zu fixen wären?

Na?

Will ich doch mal aufzählen. Wenn man VLC (auf dem Mac - soweit ich das sehe ist das auf anderen Plattformen aber das gleiche) kompilieren will, dann...

  • Muss man zuerst eine obskure Wiki-Seite im VLC-Wiki finden, die überhaupt beschreibt wie man das macht. Denn: man muss zuerst Fink deaktivieren. Anstatt in ihrem Build-Script einen Check dafür zu haben, steht das aber nur irgendwo auf der Wiki-Seite. Das hat mich schon mal 3 Stunden gekostet.
  • Dann beginnt VLC damit, sich eine komplette Runde der Autotools zu bauen. Mir ist ja nicht klar, was sich die Entwickler dabei gedacht haben, aber offenbar funktioniert ihr Build-System nur mit einer ganz speziellen Version von Autotools und mit nichts anderem. Und damit das ganze Spaßig wird, haben sie sich eine ganz eigene kleine, schlecht funktionierende, buggy Version von Fink implementiert. Große Klasse, Jungs!
  • Damit aber noch nicht genug, denn selbst wenn man das alles zum Kompilieren überreden kann (was einiges an Händchenhalten erfordert) - produziert das Build-Script immer noch keine funktionsfähige binary.

Nun, man könnte jetzt einwenden, dass funktionierende Software sowieso überbewertet ist und all sowas. ABER ich hab nach zwei Tagen nur dem Build-Script beide Händchen halten und am Schluss doch keine funktionierende Software erhalten einfach die Nase voll.

Soll doch jemand anderes deren Bugs fixen.

  • Posted: 2007-08-23 17:05 (Updated: 2007-08-25 10:38)
  • Author: dwt
  • Categories: fnord
  • Comments (0)

!ScreenLight

Screenshot of the Software in Action Ever wondered how useful it would be to always have a Flashlight with you?

Well, stop wondering, because you have! That is, you do if you have a mobile phone with you that has a screen that is perfectly capable of displaying pure white at maximum brightness and is programmable in Java.

There you have it, a ScreenLight!

To install, just send the jar-file to your phone via Bluetooth file transfer (or whatever method you prefer), after that the phone should ask you where you want to install the app (for me that is in "Games" or in "Applications"). Thats it!

Many thanks to prom who showed me how to do this!

  • Posted: 2007-07-24 12:04 (Updated: 2007-08-25 10:38)
  • Author: dwt
  • Categories: software
  • Comments (0)

! Tanguera

Wie soll ich sagen - ich wollte meine Freundin zum Geburtstag ausführen, wir tanzen sehr gerne zusammen und in Berlin findet ausgerechnet zu ihrem Geburtstag eine Tanzshow erster Güte statt.  Tanguera, in der  Staatsoper Berlin, was man als Laie doch als Qualitätssiegel auffasst. ( Die Presse offenbar auch.)

Nun, dieser letzte Punkt ist offenbar leider problematisch. Denn: So gut war die Show nämlich nicht. Genau genommen war sie sogar überhaupt nicht gut. Leider.

Zuerst ein positiver Punkt: Die Tänzer und Tänzerinnen konnten tanzen. Immerhin.

Aber in 80 Minuten Vorstellung gab es:

  • überhaupt keine Variation in den Tänzen, ständig die gleichen (Hebe-) Figuren.
  • kein Gefühl in der Darstellung, ständig nur kühl die gleichen Tänze. Obwohl doch eigentlich Sex, Liebe und Tod ausgedrückt werden sollte. (Die beste Szene war noch, wie sich die drei Freunde auf die Nacht der langen Messer vorbereiten und mit ihren Stühlen Tango tanzen. Aber wieso bitte muss das der Höhepunkt des Ausdrucks sein?)
  • Nur eine Sängerin (!), die auch noch über ein Mikro gesungen hat. Wofür bitteschön hat die ihre Ausbildung gemacht?
  • Alle Musik sonst aus der Dose. Na toll. Spart sicher Kosten, keine Musiker anzustellen.
  • Keine Dia-Projektion mit Übersetzungen der spanischen Texte oder irgend eine andere Hilfe für die Zuschauer. (Obwohl, so war es deutlich einfacher, vollends aus der Handlung auszusteigen.)

Ich könnte noch weiter meckern. Aber ich spare es mir ab hier. Jedenfalls bin ich ob solcher Produktionen nicht überrascht das es den Opernhäusern in Deutschland beständig immer schlechter geht.

Oh doch, eine Sache fand ich gut. Immerhin sind wir, im Gegensatz zu fast allen anderen Gästen, nicht beim Ticketpreis so übel abgezogen worden. Finden wir jedenfalls.

Unsere Empfehlung? Nicht anschauen. Lieber ein  YouTube-Video anschauen, da sieht man sogar fast noch mehr Tango und der schreckliche Rest fällt weg.

Tja, schade um die alten Medien irgendwie.

  • Posted: 2007-07-19 21:42 (Updated: 2007-08-25 10:39)
  • Author: dwt
  • Categories: links
  • Comments (0)

Bisher unveröffentlichte Features von Leopard

 Die detaillierte Beschreibung der WWDC Sessions ist heute online gegangen und man findet darin interessante Details zu bisher unveröffentlichten neuen Features von Leopard.

  • Neue Funktionen für den Package Installer: Offenbar plant Apple das installieren von Programmen nur für einzelne Benutzer einfacher zu machen und Signierte Pakete zu unterstützen. Dazu ist von "Internet Download Packages" und neuen Receipt Tools die Rede. (Von "Creating Custom Installers with Leopards New PackageMaker")
  • Core Text: Apple will offenbar ein neuer Framework für Schriftbehandlung, Rendering und Layout einführen. (Von "Core Text Lab")
  • Neue Leopard Kernel Debugging Tools: Apple verspricht einen "Live Kernel Debugger", neue Konsolenkommandos "trace", "latency", "spindump" und "stackshot". (Von "Fundamentals of Kernel Debugging")
  • Dictionary Development Kit: Offenbar will Apple neue Werkzeuge zur Übersetzung von Programmen bereitstellen. (Von "Input Method & Internationalization Lab")
  • Versionierung in Core Data: Core Data Schemas können Versioniert werden und es gibt offenbar hilfsmittel bei der Migration von früheren Versionen. (Von "Managing Schema Versioning and Data Migration in Your Core Data Application")

Das wars. Nicht viel, aber doch ein kleiner Blick auf die vielen von Steve versprochenen - bisher verschwiegenen - Features.

  • Posted: 2007-04-04 02:19 (Updated: 2009-10-24 16:02)
  • Author: dwt
  • Categories: software
  • Comments (0)

Diplomarbeit

Nach langer, langer Arbeit habe ich jetzt meine Diplomarbeit abgegeben. Puah. Für mich war es neben einer riesigen Anstrengung auch eine sehr befriedigende Tätigkeit, zu sehen das ich in der Lage bin ein Thema so umfassend zu behandeln. Nebenbei habe ich und mein Mitschreiber in der Arbeit auch eine ganze Menge experimentiert und ausprobiert wie sich Wiki-Technologie und  Kollaborative Editoren zum Schreiben von Wissenschaftlichen Arbeiten eignen. Dazu und wie wir dabei auftretende Probleme gelöst haben später mehr. :)

Angefertigt habe ich die Diplomarbeit im  Fachbereich Informatik und Gesellschaft der TU-Berlin mit  Andreas Janson zusammen.

Abstract

„It‘s the end of the world as we know it - and I feel fine.“ - R.E.M.

Filesharing-Technologien ermöglichen es erstmals, alles aufgezeichnete Wissen weltweit zugänglich zu machen, weil es die Kosten des Kopierens von Informationen drastisch verringert. In der bisherigen Debatte um Filesharing wurde diese Chance größtenteils ignoriert und stattdessen wurden angebliche negative Auswirkungen hervorgehoben, die bisher nicht wissenschaftlich belegt werden konnten. Wir betrachten diese Debatte als Informatiker und stellen fest, dass die Auswirkungen von Filesharing auf die Gesellschaft ohne ein Verständnis der zugrundeliegenden Technologien leicht fehlinterpretiert werden können. Schon der zentrale Begriff ‚Filesharing‘ wird in den unterschiedlichsten Bedeutungen verwendet, obwohl er durch die dahinterliegende Technologie eindeutig definiert ist. Aus der von Eigeninteressen geprägten Sichtweise der Inhalteindustrie wird Filesharing vor allem als ein Werkzeug von ‚Piraten‘ gesehen. Aus dieser Sichtweise heraus hat die Musikindustrie seit der Gründung von Napster 1999 zahlreiche Maßnahmen zur Bekämpfung von Internettauschbörsen ergriffen, über die wir hier erstmals einen umfassenden Überblick geben. In ihrer Argumentation unterschlägt sie die Vorteile, die Filesharing-Netzwerke für Verbraucher bieten: Das Internet ist allen anderen bekannten Netzwerken in der Distribution von Inhalten überlegen. Es gefährdert damit nicht nur das bisherige Vertriebsmonopol der vier großen Plattenfirmen - es ermöglicht auch ein neue Produktionsform: die Produktion unter Gleichen. Daraus erwächst ein Demokratiepotential bisher unerreichter Qualität. Gleichzeitig wird ersichtlich, dass die Gesetze zum Schutz geistigen Eigentums, die auf Drängen der Inhalteindustrie erlassen werden, der ursprünglichen Aufgabe von Schutzrechten nicht gerecht werden: Sie fördern die Erstellung von geistigem Eigentum nicht optimal und machen Inhalte schwerer zugänglich. Letztlich bedingt die Filesharing-Technologie auch, dass sich das Tauschen urheberrechtlich geschützter Inhalte nicht unterbinden lässt. Das wäre gesamtgesellschaftlich auch wenig sinnvoll, denn Filesharing ist die technische Umsetzung der Norm des Teilens, die das zentrale Paradigma der Wissensgesellschaft darstellt und deshalb in Zukunft immer weiter an Bedeutung gewinnen wird. Es bleibt daher nur ein logischer Schluss - die Vorteile des Filesharings schnellstmöglich zu nutzen.

  • Posted: 2007-03-18 16:43 (Updated: 2009-10-24 16:20)
  • Author: dwt
  • Categories: projekt
  • Comments (0)

Wenn man Benutzerschnittstellen Misst...

... kommt sowas raus:

Problem Area 3: Mouse precision
The most preoccupying results of these benchmarks concerned mouse precision and efficiency: in these benchmarks (which measure both the time necessary to complete a series of precision tasks and the number of errors, and used the same mouse and mouse-pad for all tests), Windows Vista scored significantly worse than Windows XP. Windows Vista scored a Mouse Precision Error Coefficient of 0.52, compared with 0.40 for Windows XP, and 0.08 (!) for Mac OS X.

Das freut mich als Apple-User natürlich, vor allem aber finde ich es sehr wichtig, das Pfeiffer die Wichtigkeit von Kleinigkeiten sehr schön auf den Punkt bringt:

One of the most important aspects of User Interface Friction is that, while it may seem hardly noticeable, it shapes our overall user experience and can make the difference between a compelling product and an uninspiring one. Differences between two devices or programs may appear almost subliminal, but the user who compares both will notice them nonetheless, even if he or she could not explain why. Conversely, the sum of little, seemingly insignificant improvements add up and will make the difference between an excellent device and a lesser one.

Web 1.0 vs. Web 2.0

* Web 1.0 was about reading, Web 2.0 is about writing

  • Web 1.0 was about companies, Web 2.0 is about communities
  • Web 1.0 was about client-server, Web 2.0 is about peer to peer
  • Web 1.0 was about HTML, Web 2.0 is about XML
  • Web 1.0 was about home pages, Web 2.0 is about blogs
  • Web 1.0 was about portals, Web 2.0 is about RSS
  • Web 1.0 was about taxonomy, Web 2.0 is about tags
  • Web 1.0 was about wires, Web 2.0 is about wireless
  • Web 1.0 was about owning, Web 2.0 is about sharing
  • Web 1.0 was about IPOs, Web 2.0 is about trade sales
  • Web 1.0 was about Netscape, Web 2.0 is about Google
  • Web 1.0 was about web forms, Web 2.0 is about web applications
  • Web 1.0 was about screen scraping, Web 2.0 is about APIs
  • Web 1.0 was about dialup, Web 2.0 is about broadband
  • Web 1.0 was about hardware costs, Web 2.0 is about bandwidth costs

( via Copacetic)

  • Posted: 2007-03-13 09:45
  • Author: dwt
  • Categories: (none)
  • Comments (0)

iTunes ohne DRM? Wieso nicht!

 Sagt sich jedenfalls die FSF.

Gefordert wird unter anderem, dass unabhängige Künstler ihre Musik im iTunes Store auch ohne DRM anbieten können.

Sie wollen die Unterschriftenliste mitsamt einer Jeckenkappe am 1. April bei Apple anliefern, sofern Apple sich bis dahin nicht rührt.

 -> Zur Unterschriftenliste

Was ist ein Hotel?

Zuerst mal eine gute Absteige, vor allem für Wohlhabende Menschen, wozu bekanntlich auch oft Geheimnisträger gehören.

Als kleine Handlungsanweisung gibt es daher als Service vom CCC diesen Vortrag des 23C3:  Gäste-Überwachung in Hotels durch staatliche und private Schnüffler

Sehr Lehrreich, was die diversen Bananenrepubliken (wie Deutschland) so zu bieten haben.

Probleme beim installieren von Wordpress unter Mac OS X

Man sollte beachten das 'localhost' nicht gleich '127.0.0.1' ist. (mysql via  Fink)

Da wären sie nicht drauf gekommen? Tja, ich auch nicht.

Aber wenn man mysql via PHP sagt, das es sich mit der Datenbank auf localhost benutzen soll, dann versucht php die Verbindung via einem Socket in /var/mysql/blah herzustellen (der eben woanders ist, wenn MySQL wo anders installiert ist), während es bei 127.0.0.1 einen TCP/IP Socket verwendet...

Tja, wer hätte gedacht das PHP so intelligent ist.

Ego-Striptease?

In der Diskussion um den  Bundestrojaner finde ich die Frage der definition der Privatsphäre am wichtigsten. (Das ist auch die Abschlussfrage meiner Diplomarbeit, aber dazu später mehr)

 Gerade hat ja ein Gericht in den USA entschieden, das alles was über das Internet transportiert ist, oder auf einem am Internet angeschlossenen PC steht, sowieso nicht privat sein kann.

Das finde ich fürchterlich, aber immerhin erkennt das Gericht korrekt, das die neue Technik auch eine neue Definition des Begriffs 'Privatsphäre' erfordert.

Klar ist, das immer mehr Menschen einen immer mehr Daten über sich in einer Form preisgeben, die mit einfachsten Mitteln via Google ermittelt werden kann. ( Auf dem 23C3 gab es einen schönen Vortrag zu Profiling und diesen Fragen.)

Was wird also aus Privatsphäre? Die Vergangenheit hat jedenfalls klar gezeigt, das man nicht vorhersehen kann welche Daten, die man heute erzeugt, morgen überall frei zugänglich sind. Usenet Posting waren früher "relativ" privat, bis Google die Archive online gestellt hat.  Suchen bei Suchmaschinen waren relativ privat, bis ein Bruchteil der Suchdaten von Yahoo (pseudonymisiert) veröffentlicht wurde. Foren, Mailinglisten, Blogs, del.icio.us, Flickr, studiVZ, Xing, whois - alles verfügbar.

Was mir dabei fehlt ist die Diskussion was denn Privatsphäre ausmacht? Was kann Privatsphäre sein? Wie kann man Privatsphäre für sich reklamieren?

Offensichtlich ist die einfache Antwort: "Ja die leute müssen sich des Problems halt bewust werden, nicht ausreichend, da eben  Regulierung auch in der Architektur der Werkzeuge liegt. Soziale Netzwerke werden Nützlicher wenn man diese Daten preis gibt.

Zudem wissen wir nicht was die Zukunft bringt,  Jamais Cascios Participatory Panopticon ist für mich als Zusammenfassung sehr wahrscheinlich, aber ob das eben Gut ist, oder schlecht? Who knows. Vielleicht wird unsere Gesellschaft dadurch "Ehrlicher", weil man jede Lüge sowieso sofort enttarnen könnte, vielleicht straft unsere Gesellschaft dadurch aber auch abweichenden Meinungen ab.

In jedem Fall hätte eine Diktatur im vergleich zu früher unheimliche neue Mittel, andererseits, vielleicht auch eine Gegenöffentlichkeit die nicht mehr unterdrückbar ist?

Klar ist das Wir als Informatiker hier und jetzt die Aufgabe haben, die Systeme so zu gestalten, das diese Daten nicht einfach für eine Diktatur zur Verfügung stehen bzw. zur Verfügung stehen werden. Für die Zukunft muss die Diskussion geführt werden, was Privatsphäre bedeutet und wie jeder einzelne in die Lage versetzt werden kann diese zu schützen.

Und das ist schon für sich eine fast unlösbare Aufgabe.

Satire

Prophezeiung? = Eigentlich wollte ich mich ja mit  Culture Jamming beschäftigen, bin dabei aber völlig auf einer Kleinigkeit hängen geblieben:

Das amerikanische Satiremagazin "The Onion" hatte 2001, zu Bushs Wahl, den schönen Artikel  Bush: 'Our Long National Nightmare Of Peace And Prosperity Is Finally Over' geschrieben. Der Artikel zieht wie es sich für ein Satiremagazin gehört voll vom Leder.

 Konnte ja keiner Wissen das Bush das direkt als Regierungserklärung verwendet. :( (Jemand hat den Artikel mit Links auf all die tatsächlichen Ereignisse hinterlegt)

Was ist der Iran?

Muss ja nicht stimmen, aber man gewinnt doch  ob der Aktionen der Amerikaner den Eindruck, das sie in den Iran einmarschieren wollen.

Naja, da interessiert man sich natürlich für das Land und siehe da,  der BBC hat eine gute Dokumentation gedreht, die es bei Google Video gibt.

So mag man die öffentlich Rechtlichen Sender doch. :)

Tchernobyl

Man macht sich ja immer keine echte Vorstellung davon wie es dort wirklich ausgesehen haben muss. Ich zum Beispiel dachte (tja so einfältig kann man sein) das der explodierte Reaktor selbstverständlich weit weg ist von allem was da heute immer noch benutzt wird.

 Tja, falsch gedacht. Der Reaktor im NEBENGEBEUDE wurde noch bis ins Jahr 2000 betrieben und überhaupt ist dieses ganze Kraftwerk verflucht klein! Wer da Arbeitet ist praktisch per definition tot. *schauder*  (Ein paar Bilder aus den Krankenhäusern dort.)

Immerhin schön, das man sich aufgrund des Web 2.0 dort schön umsehen kann.... :-/

Was ist Web 2.0?

Das Zentrum für digitale Ethnografie an der Kansas State University hat  dieses Video gemacht. Mir gefällts. :)

Die Autoren bitten die Diskussion  auf ihrer eigenen Seite zu führen.

Publication Industrie pulls a Phillip Morris

Wenn man mit guten Argumenten nicht mehr Weiterkommt, dann muss man eben anfangen zu lügen. Einsichtig, oder?

Die Gemeinschaft der wissenschaftlichen Verlage hat sich daher jetzt entschlossen das es an der Zeit ist "direkter" vorzugehen. Oder wie es Susan Spilka, Wiley's director of corporate communications ausdrückt, man habe zu defensiv über das Problem der freien Informationen geredet und sich zu viele Sorgen darüber gemacht sich präzise auszudrücken.

Oh Jeh.  Immerhin ist es rausgekommen.

Da soll mir noch jemand Sagen, dass Computerspiele nicht Lehrreich sind...

Die Marketingmaschine wurde kräftig gerührt, zu zwei Filmen zum Thema  Wie gewinnt man gewaltlos Konflikte gibts jetzt nämlich auch ein 'Lehr'-Spiel.

Die Idee find ich auf jeden Fall klasse. :)

Leider gibt's die Filme nicht zum Download - dabei sollte solches Lehrmaterial doch nun wirklich jedermann zur Verfügung stehen. Schade eigentlich, das an solchen Stellen nicht z.B. unsere Bundesregierung mal ein bisschen Geld investiert - ich fänd das zumindest gut.

Wunderschöne Fraktale

Xaos Mac Screenshot Endlich gibt es das Wunderbare Gnu Xaos mit einer schönen GUI für den Mac. Es ist der einzige mir bekannte Fraktalrenderer mit dem man in Echtzeit in das Fraktal hineinfliegen kann. (Übrigens auch mit einem Autopiloten....)

Sooooo schön....

 Gleich bei Macupdate. :)

  • Posted: 2007-02-09 16:56 (Updated: 2009-10-24 16:17)
  • Author: dwt
  • Categories: links
  • Comments (0)

Die Qualität der freien Medien

Wenn man die Nachrichten verfolgt, dann wird einem klar das jeden Tag irgendwo auf dieser Welt Krieg ist. Man bemerkt auch das die Chaosmeldungen nie abreißen und die Verluste hoch hoch und noch höher sind.

Dabei verpassen unsere ach so qualitätsgeladenen Medien doch glatt den eigentlichen Punkt dessen was passiert: Die Kriege werden weniger und es sterben immer weniger Menschen dabei.  Behauptet zumindest diese Studie. ( via TedBlog)

Na wenn das kein Grund für einen leisen Optimismus ist?

  • Posted: 2007-02-06 14:58 (Updated: 2007-02-06 14:59)
  • Author: dwt
  • Categories: links
  • Comments (0)

Militärische Logik.....

Vor etwa einem Jahr hab ich mich mit meinem Onkel (Uli) darüber unterhalten wie die USA und ihre Militärs arbeiten. Naja, er hat mich zerpflückt.

Um so mehr freut es mich das viele meiner Punkte  in diesem Text sehr schön aufgenommen werden. :)

Soziale Filter

Ich vertrete ja nun schon länger die Meinung, dass die alten Medien keine Chance gegen die Vielfalt und die Qualität des Internets haben. Begründen lässt sich das meiner Meinung nach damit, dass durch den  Long-Tail effekt so viel mehr Inhalte verfügbar werden, dass da eben auch mehr Inhalte guter Qualität verfügbar sind. Bei diesem Argument fehlt aber natürlich noch, dass diese guten Inhalte zwischen den unzähligen schlechten auch auffindbar sein müssen.

Und das ist die Aufgabe von Sozialen Filtern. :)

Persönlich kann ich mich nicht entscheiden ob ich den Ansatz von reddit oder von digg lieber mag - beide sind jedenfalls fürs erste brauchbar. ( Vergleich der Dienste)

Und was hab ich auch gleich damit gefunden:  Schöne Videos was die Russen mit ihren Kampfjets alles anstellen können (wow) und  was leute alles tun die von Scams so angepisst sind dass sie zurückpissen wollen. (Naja.... zwar ist das Lustig, aber als Selbstjustiz kann ich das natürlich nicht unterstützen).

Überwachungsstaat England

Immer wieder Nett was die Engländer sich so einfallen lassen um noch lückenlosere Überwachung durchzubringen. Jetzt wollen sie  Röntgen-Kameras einsetzen um den Passanten unter die Röcke und BHs (ahem) ich meine natürlich unter die Kleidung zu sehen. Natürlich um dort versteckte Waffen zu finden.

Logo...

 Hier gehts zum Artikel

Filesharing und freie Inhalte

Nachdem die Musikindustrie immer noch nicht einsieht das  Massenklagen gegen die eigenen Käufer letztlich kein Mittel sind diese in 'willig zahlende Käufer' zu verwandeln (Kunden finde ich als Wort dafür schon zu gutwillig) kann ich nur sagen das ich mich immer weiter davon entferne überhaupt Content zu konsumieren der unter solchen restriktiven Lizenzen steht.

Für Video gibt es iTunes oder was ich heute wiederentdeckt habe Projekte wie den  Democracy Player.

So. Jetzt geh mir zum Teufel Industrie.

p.s.: Freie inhalte gibts ja auch in der Forschung. Leider hat noch nicht jeder Wissenschaftler die Möglichkeit frei nach den Open Access Prinzipien zu veröffentlichen. Das ist vor allem bedenklich, da die Veröffentlichungsindustrie die um die Wissenschaften gewachsen ist  monopolartige Strukturen angenommen hat.

Gott sei dank gibt es aber  eine Petition großer Wissenschafatsverbände in Deutschland durch den  DFG vertreten die sich für eine gesetzliche Grundlage für Wissenschaftler einsetzen das diese ihre Papers nach 6 Monaten per Open Access Veröffentlich können.

 Unbedingt unterschreiben.

Demokratie und Zukunft

Demokratie scheint ja (leider nicht nur in Deutschland) überhaupt keine Zukunft zu haben. Zu sehen sind immer nur noch immer stärkere Bewegungen hin zum  Überwachungsstaat.

Aber, es tut sich doch zumindest etwas, z.B. gab es heute einen Artikel in Telepolis der klar macht was bei einem vernünftigen Einsatz neuer Technologien in der Politik heute eigentlich möglich wäre.

  • Parteien sind eigentlich ein Auslaufmodell, weil sich jeder Wähler für ein Komplettpaket an politischen Maßnahmen und Ideologien entscheiden muss, womit er immer zumindest teilweise gegen seine eigenen Interessen handeln muss.
  • Vollständig repräsentative Demokratien sind aus der notwendigkeit geboren schnell Entscheidungen treffen zu müssen, Informationen aber sehr langsam 'reisen'.

Das sind alles Dinge die so nicht mehr stimmen - Informationen sind schnell. In einer Sekunde reisen sie Vielmahls um die Welt. (Ja ok, wären wir in einer Intergalaktischen Demokratie, dann wäre das was anderes, aber....)

 Diesen Entwurf sollte man sich mal auf der Zunge zergehen lassen!

  • Posted: 2007-01-24 11:21
  • Author: dwt
  • Categories: (none)
  • Comments (0)

iTunes style progress-bar

korrigierter filename Just as an exercise I ripped the progress bar rendering code out of MPlayer and generalized it, fixing some 10 to 15 bugs in the process. Though I couldn't get it back into the MPlayer source (yet!) its already going into other software, most notably  Senuti. So if you need such a progressbar, have phun!

As I'm still gearing up on my graphics programming, there is still the unesthetic choice in there to use pictures for some of the interface elements. So, free after Wil Shipley thats a no no. :) If you (the reader) care and could send me a patch, that would be greatly appreciated.

Error: Failed to load processor AddComment
No macro or processor named 'AddComment' found

  • Posted: 2006-07-12 10:02 (Updated: 2006-10-15 11:01)
  • Author: dwt
  • Categories: (none)
  • Comments (0)

Technisch Präsentieren

In meiner  Freizeit (Notiz an selbst: Ich hab zu viel Zeit) bereite ich gerade einen  Javakurs für frische Informatiker vor, genauer solche die gerade mit dem zweiten Semester anfangen.

Dafür interessiere ich mich jetzt natürlich in der guten Präsentation dieses, doch eher "technischen" Themas.

Hervorragend gefallen hat mir da der Didaktische Ansatz von  Head First Java, und ein schon Jahre-Alten Papers von  Jay H. Lehr: Let There Be Stoning.

Error: Failed to load processor AddComment
No macro or processor named 'AddComment' found

  • Posted: 2006-03-21 20:14 (Updated: 2006-10-15 11:01)
  • Author: dwt
  • Categories: (none)
  • Comments (0)

Aspekt-Orientiertes Programmieren

Tja, da denkt man jahrelang, das AOP halt ein ganz nützliches Tool zum Loggen ist,  da schreibt doch endlich mal jemand wofür das so alles gut ist und man fängt an sich über Meta-Programierung und den Ursprung von AOP -  dem Meta-Objekt-Protokoll - Gedanken zu machen.

Error: Failed to load processor AddComment
No macro or processor named 'AddComment' found

  • Posted: 2006-03-11 16:55 (Updated: 2006-10-15 11:02)
  • Author: dwt
  • Categories: (none)
  • Comments (0)

Funktionen als voll berechtigte Datentypen

Funktionale Sprachen erhalten ihre Eleganz dadurch, dass sie die Programmierung mit Funktionen als Argumente und Rückgabewerte erlauben. Schön erklärt wird das im  SICP. Tatsächlich kann das so weit gehen, dass zum Beispiel in Lisp  gar kein Unterschied mehr zwischen Funktionen und beliebigen Daten gemacht wird. Aber das ist zugegebenermaßen extrem.

Für die Kürze nennt man diese Art zu programmieren auch gerne: "Higher-Order-Programmierung" und die entsprechenden Funktionen "Higher-Order-Funktionen".

In der Imperativen Programmierung werden Funktionen als Argumente oder Rückgabetypen eher selten verwendet. In C gerade noch beim Standard-Algorithmus Binary-Search

void *
bsearch(const void *key, const void *base, size_t nmemb, size_t size,
         int (*compare) (const void *, const void *));

bei dem die compare-Funktion genau so eine Higher-Order-Funktion ist. Danach ist es aber erstmal lange zappenduster, was Higher-Order-Programmierung angeht. (Hervorragende Programmierer nutzten dieses Design-Pattern aber schon immer - wenn es auch selten explizit genannt wurde)

So kam es dann auch, dass manche objektorientierten Sprachen Objekte wie Knöpfe, Textfelder etc. hatten, die man ableiten konnte, um ihr Verhalten zu verändern. Java etwa erlaubt das noch heute:

// Java
class OKButtonForThatSpecificDialog extends JButton {
    public void doClick() {
        System.out.println("Yay, I was clicked");
    }
}

Zwei Probleme ergeben sich aus dieser Art zu programmieren:

  • Erstens: jede Menge duplizierter Code, der größtenteils identisch ist. Damit erlebt man einen Alptraum, sobald man auch nur daran denkt, etwas Grundlegenderes an dem Programm zu ändern.
  • Zweitens ist der Code, der tatsächlich die Kontrolle über das Programm ausführt, so in viele Dateien oder zumindest Klassen verstreut, also mitnichten an einer Stelle vereint und übersichtlich.

Beide Probleme kann man mit dem oben beschriebenen Mechanismus der Higher-Order-Funktionen elegant lösen - und tatsächlich wird das auch gemacht. In  Inversion of Controll (IOC)-Frameworks etwa. Hier ruft man nicht mehr eine Funktion auf, um ein Ergebnis zu bekommen, sondern konfiguriert den Framework (Knöpfe, Textfelder, etc.) mit eigenen (Higher-Order)-Funktionen, die dieser aufruft, sobald ein Ergebnis oder Ereignis vorliegt.

Absolut typisch für dieses Muster sind alle mir bekannten aktuell verwendeten GUI-Toolkits, die immer so funktionieren, dass man z.B. einen Knopf erzeugt, um danach mit einer (Higher-Order)-Funktion zu konfigurieren, was denn passieren soll, wenn auf ihn geklickt wird.

// Java
JButton button = new JButton("Titel");
button.addActionListener(aClickResponder);
// Obj-C
[aButton setTarget: self];
[aButton setAction: @selector(respondToClick:)];

Aber dieses Muster ist noch viel weiter verwendbar - in Objective-C gibt es eine Möglichkeit, auf alle Elemente eines Containers eine Methode doSomethingWithEachElement: anzuwenden, die ein Argument - das jeweilige Element - erhält.

// Obj-C
[aList makeObjectsPerformSelector:@selector(doSomethingWithEachElement:)];

Äquivalent läuft das in den GUI-Toolkits von Java, Cocoa, Gnome, KDE, WxWidgets...

Fortgeschrittenere Sprachen und Toolkits verwenden dieses Design-Pattern auch noch an vielen weiteren Stellen. Besonders hervorzuheben ist dabei in letzter Zeit Ruby, wo nach diesem Muster nicht nur Iteration, sondern auch das Bearbeiten jeder Zeile in einer Datei, das Senden von Daten über einen Socket, ... verläuft.

Am extremsten ist aber vielleicht die Sprache Smalltalk, wo es überhaupt keine normalen Kontrollstrukturen im Sinne von C/Java mehr gibt und diese Aufgabe komplett durch Higher-Order-Funktionen erledigt wird. Hier gibt es beispielsweise ein Boolean Objekt, das eine Methode #ifTrue:ifFalse: besitzt. Diese Methode bekommt dann zwei Callbacks übergeben und führt je nachdem, ob es das True- oder das False-Boolean ist, polymorph den jeweils anderen Callback aus. - Analog werden Schleifen, Exception-Handling... einfach alle Kontrollstrukturen definiert.

Das nette daran: Damit kann man innerhalb der Sprache selber Kontrollstrukturen definieren. Schick, nicht?

Umsetzung

Um mit Higher-Order-Funktionen in Java / Obj-C zu programmieren, kann man z.B. so vorgehen:

 // Obj-C
 - (void) setAction: (SEL) aSelector forTarget: aTarget {
    action = aSelector;
    target = aTarget;
 }

 - (void) trigger {
    if ([target respondsToSelector: action]) {
        [target performSelector: action];
    }
 }
 // Java
 void setActionListener(ActionListener listener) {
    this.listener = listener;
 }

 void trigger() {
    listener.actionPerformed(null);
 }

Das wars - so einfach geht das.

TODO: Auf  http://libsigc.sourceforge.net/libsigc2/docs/manual/html/ch02.html verweisen und vergleichen wie Callbacks mit sowas und (beste C++ Callback Bibliothek) gehen. Vergleichen wie echte Lambdas das leichter machen können.

Error: Failed to load processor AddComment
No macro or processor named 'AddComment' found

  • Posted: 2006-02-22 23:34 (Updated: 2006-10-15 10:58)
  • Author: dwt
  • Categories: (none)
  • Comments (0)

Neue Religionen...

...sind sicherlich heute sehr selten.

 Tja, denkt man. Leider.

Wo ich gerade beim Thema sind... Jeder sollte  sein Softwarepatent des Monats wählen!

Error: Failed to load processor AddComment
No macro or processor named 'AddComment' found

  • Posted: 2006-02-22 14:57 (Updated: 2006-10-15 11:02)
  • Author: dwt
  • Categories: (none)
  • Comments (0)

How to fold a shirt

Hausahltsanleitung....

Error: Failed to load processor AddComment
No macro or processor named 'AddComment' found

  • Posted: 2006-02-20 15:47 (Updated: 2006-10-15 11:02)
  • Author: dwt
  • Categories: (none)
  • Comments (0)

Unterdokumentierte Design Patterns

Eine Frage die mich schon länger beschäftigt, ist das Finden von Design Patterns in Funktionalen Sprachen. Lange Zeit schien es mir so, als gäbe es da gar nichts, auch viele Programmierer, die in diesen Sprachen arbeiten, konnten mit dem Begriff nichts anfangen. Dabei gibt es meiner Meinung nach eine Menge, das man von funktionalen Sprachen lernen kann - und einiges, das schon gelernt wurde.

Einige Design Patterns, die ich seitdem gefunden habe, sind:

  • Funktionen? als voll berechtigte Datentypen, d.h. man kann sie als Argument oder Rückgabewert in der Programmiersprache verwenden
  • Die Verwendung von Lambda-Ausdrücken (anonymen Funktionen)
    • Für Iteration, als Callback, für Fehlerbehandlung, Kontrollfluss...
  • Higher Order Funktionen - Funktionen als Argument und Rückgabewert von Funktionen
  • Currying zum teilweisen Anwenden von Funktionen (vor allem in Zusammenhang mit anonymen Funktionen interessant)
  • Funktionen zur Kombination von Funktionen zu größeren Einheiten (sehr schön z.B. in Parsern)
  •  Monaden, zum sicheren Einbetten von Seiteneffekten in puren funktionalen Sprachen
  •  Arrows, für sichere Nebenläufigkeit in puren funktionalen Sprachen
  • Unendliche Listen als Fassung von Reihen von Zahlen / Ereignissen. (Aktionen des Benutzers, Zufallszahlen, stetig genauer werdende Berechnungen einer Zahl...)
  • Continuations: Ein Konstrukt mit dem sich z.B. Exceptions und Coroutinen implementieren lassen
  • Coroutinen: Am einfachsten als eine Art Ultraleicht-Thread zu verstehen

Einige dieser Design Patterns werden auch in anderen Sprachen intensiv genutzt. Die Lambda-Abstraktion zum Beispiel spielt eine zentrale Rolle in Java, wenn man dort GUIs baut, da sie der ideale Callback sind. Also im Beispiel:

JButton button = new JButton("Titel");
button.addActionListener(new ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent e) {
        // this is a lambda
    }
}

Gibt es noch mehr dieser Design Patterns? Funktionale Sprachen werden doch von jeder Menge Menschen benutzt...

Sind die irgendwo dokumentiert? Wenn nicht, dann muss ich mich wohl ranhalten und mein Verständnis selber aufschreiben.

Außerdem haben hochintegrierte Sprachen wie Lisp, Scheme, Smalltalk und Ruby noch ein weiteres Pattern, da sie sich besonders gut (oder überhaupt?) dazu eignen, Domänenspezifischen Subsprachen (DSL), also Sprachen die direkt in der Implementierungssprache eingebettet sind, zu formulieren. In Lisp bzw. Scheme ist das sogar die bevorzugte Vorgehensweise!

Mir ist allerdings noch nicht klar, welches Kriterium eine Sprache in die Lage versetzt, diese Integrierten DSLs besonders gut umzusetzen. Bisher dachte ich immer, dass dazu eine in ihrer Übersimplifizierung geniale Sprachdefinition - wie in Lisp und Smalltalk - notwendig ist, aber gerade das Beispiel von Ruby scheint dem zu widersprechen.

Error: Failed to load processor AddComment
No macro or processor named 'AddComment' found

  • Posted: 2006-02-06 08:44 (Updated: 2006-10-15 11:03)
  • Author: dwt
  • Categories: (none)
  • Comments (0)

Preisfrage

Man hat 8 Billiard-Kugeln, von denen man weiß das eine schwerer ist als die Anderen. Desweiteren hat man eine Balkenwage mit der man zwei mal Wiegen, also zwei Gewichte vergleichen, darf.

Lässt sich unter diesen Vorraussetzungen herausfinden welche Kugel die schwerere ist?

Viel spaß beim Raten. :)

Oh, and by the way:  TCPA ist immer noch doof:  Erklärender Film

Error: Failed to load processor AddComment
No macro or processor named 'AddComment' found

  • Posted: 2006-02-04 17:05 (Updated: 2006-10-15 11:03)
  • Author: dwt
  • Categories: (none)
  • Comments (0)

Ober- und Unterton- oder Kehlgesang

Was es alles gibt! Ich bin fasziniert wozu die Menschliche Stimme so alles in der Lage ist. Obertongesänge kannte ich auch schon länger, aber die zweite Variante, Untertongesänge, wie sie hauptsächlich in  Tuva vorkommt war mir neu.

Viel sagen will ich dazu eigentlich gar nicht, das muss man mal gehört haben:

Weitere Informationen gibt's bei der  Wikipedia,  Oberton.org und auch bei  Khomeei.com der das ganze auch schön in Spektrogrammen zeigen kann.

Notiz an selbst: Bei gelegenheit mal den Film  Ghengis Blues anschauen.

Nachnotiz an selbst: Zum Lernen  hier,  hier (unten) und  hier lang.

Error: Failed to load processor AddComment
No macro or processor named 'AddComment' found

  • Posted: 2006-01-29 13:17 (Updated: 2006-10-15 11:03)
  • Author: dwt
  • Categories: (none)
  • Comments (0)

Präsentieren wie die Meister

Error: Macro Image(wiki:BlogEntries/2006-01-16:powerfull_and_promiscuous.jpg, right, 400) failed
Attachment 'wiki:BlogEntries/2006-01-16: powerfull_and_promiscuous.jpg' does not exist.
Wieder mal ist ein Wochenende dafür drauf gegangen mich selbst über Präsentationstechniken fortzubilden.

Einen Riesigen Einfluss auf mich hat dabei  Guy Reynolds mit seinem Blog  Presentation Zen. Wie soll ich sagen - der Hammer! Einige der Präsentationstechniken die er vorstellt, sind einfach ein Must Read.

Das ist zumindest ein sehr inspirierender Anfang, von da aus weitersurfend findet man noch viele Beispiele.

Ich bin Beeindruckt.

Wer für das alles keine Zeit hat, der sollte zumindest  diese 10 Gebote befolgen!

Error: Failed to load processor AddComment
No macro or processor named 'AddComment' found

  • Posted: 2006-01-16 11:30 (Updated: 2006-10-15 11:03)
  • Author: dwt
  • Categories: (none)
  • Comments (0)

GAPMINDER

Die Entwicklung unserer Welt, in Zahlen, ist eine komplizierte und unverständliche Materie.

Denkste.

 Gapminder nutzt moderen Visualisierungstechniken konsequent aus um klarzumachen,  wie sich unsere Welt in den letzten ~40 Jahren entwickelt hat. (via  tedblog)

Dazu auch:  Warum wir uns *jetzt* nicht um die globale Erwärmung kümmern sollten.

Error: Failed to load processor AddComment
No macro or processor named 'AddComment' found

  • Posted: 2005-12-18 23:37 (Updated: 2006-10-15 11:04)
  • Author: dwt
  • Categories: (none)
  • Comments (0)

Gute Reden

Einerseits  ernsthaft,  lustig andererseits.

  • Als Nobelpreisträger darf man eben den Mund aufmachen und es wird einem hoffentlich zugehört. Hoffentlich. Der Nobelpreisträger der Literatur jedenfalls hat beschlossen über Amerikanische Politik zu sprechen.  Und ich finde hervorragend!

Error: Failed to load processor AddComment
No macro or processor named 'AddComment' found

  • Posted: 2005-12-18 16:38 (Updated: 2006-10-15 11:04)
  • Author: dwt
  • Categories: (none)
  • Comments (0)

Oblique Strategies 1.2

screenshot of the oblique strategies I just released a new version of the  Oblique Strategies from Brian Eno and Peter Schmidt.

They still are the "One hundred worthwile dilemmas to think about" that I love and use occasionally.

This updated version gives you:

  • Updated Tiger Compatibility to prevent a drawing glitch with newer Webcore versions
  • A Show Next Strategy menu item

Many thanks to Shayne White of  Curvedspace fame who made the  first version of this app. (Please note, there is also a dashbord widget that displays the strategies from  Guy D2).

Error: Failed to load processor AddComment
No macro or processor named 'AddComment' found

  • Posted: 2005-12-17 19:56 (Updated: 2006-10-15 11:04)
  • Author: dwt
  • Categories: (none)
  • Comments (0)

Mein Vortrag "Soziale Innovation in der Informationsgesellschaft"

So, nochmal die Ankündigung, diesmal mit  mp3. (Und mit herzlichem Dank an Ria für die Nachbearbeitung!)

Hier nochmal die Ankündigung

Anlässlich der Tagung  Tatort Zukunft - klären, stärken, handeln in  Bad Boll habe ich einen Vortrag gehalten, der die Zentrale Neuerung der Informationsgesellschaft gegenüber allem was vorher war vermitteln sollte. Da die Beteiligten alle sehr begeistert waren, hat es wohl durchaus geklappt. :)  Folien -  Folien mit Notitzen -  Vortrag (mp3)

Error: Failed to load processor AddComment
No macro or processor named 'AddComment' found

  • Posted: 2005-12-06 19:37 (Updated: 2006-10-15 11:05)
  • Author: dwt
  • Categories: (none)
  • Comments (0)

Geistiges Eigentum

In der Reihe "Venture Campus" gab es gestern eine Vorlesung über Patente und insbesondere Softwarepatente.

Was soll ich sagen: KOTZ

Anders kann man das wirklich nicht bezeichnen was der Schluss aus dieser Veranstaltung war.

Also einerseits: Ja klar, Software ist nicht Patentierbar, sondern nur unter bestimmten Voraussetzungen.

Aber andererseits, ist Software natürlich Patentierbar, wenn diese Voraussetzungen eingehalten werden:

  • sie Installiert werden muss
  • sie den Computer attraktiver für den Benutzer macht
  • sie Programme beschleunigt oder mit weniger Speicher auskommen lässt
  • sie notwendig ist für die Ausgabe von Signalen und Daten
  • sie mit externen Geräten Interagiert (z.B. einem Bildschirm!)

Ich meine... was bitte ist denn da effektiv noch ausgeschlossen?

Dabei kommt noch dazu das Patente für die schnelllebige IT-Branche oft einfach zu langsam sind - man bräuchte für effektiven Schutz von Ideen oft etwas das nicht erst nach 18 Monaten erteilt wird, sondern gleich.

Andererseits eignen sich Patente natürlich hervorragend für "U-Boot"-Aktionen. Also das man einen kommenden Standard mit einem / einigen Patenten "vermint" und diese dann zuerst in Japan anmeldet. Dort darf man sie nämlich bis zu 2,5 Jahren geheim halten und muss selbst dann nur ein kurzes englisches Summary abgeben... Ach ja, und dann kann man noch dank dem internationalen PCT-Abkommen dieses patent auf alle ein Weltweites Patent ausweiten. Natürlich mit dem gleichen Registrierdatum wie das Japanische.

Oder aber man gründet einen Patentpool, also eine Verwertungsgesellschaft die nur Patente anderer Firmen aufkauft (aus Insolvenzen z.B. und damit dann andere Firmen um die Früchte ihrer Arbeit "erleichtert". Vorsichtig ausgedrückt.

Und das schöne dabei: diese Systemspieler sind gerade so  richtig im  Kommen.

Suuper. Man verliert doch wirklich die Lust in einem Gebiet wie der Informatik zu arbeiten wo wirklich alles und sei es noch so trivial Patentiert ist und man auf jeden Fall mit jedem Programm unmassen von Patenten verletzt.

Error: Failed to load processor AddComment
No macro or processor named 'AddComment' found

  • Posted: 2005-12-03 16:25 (Updated: 2006-10-15 11:05)
  • Author: dwt
  • Categories: (none)
  • Comments (0)

Kochen mit dem Römertopf

Error: Macro Image(wiki:BlogEntries/2005-11-24:romertopf.jpg, right) failed
Attachment 'wiki:BlogEntries/2005-11-24: romertopf.jpg' does not exist.
Hmmmm... Sehr lecker.

Das Rezept ist wirklich furchtbar einfach:

  • 350 g Reis
  • 500 ml (Instant) Brühe
  • 500 g Hackfleisch
  • 500 g Paprika
  • Salz, Pfeffer, Chilli nach Bedarf

Den Römertopf wässern und den Reis und die Brühe hineingeben. Dann das Hackfleisch mit den gewürfelten Paprikas vermischen, würzen und auf den Reis einfach obenauf legen.

Danach das ganze eine Stunde bei 200° C im Ofen schmoren lassen.

Wow - in 3 Minuten gemacht.

Einziger Wermutstropfen: Etwa die hälfte der Reiskörner wurde bei mir nicht richtig weich - und zwar gerade die die völlig von der Brühe bedeckt und unter dem Fleisch auch garantiert nach unten gedrückt waren. Da muss ich nochmal nachforschen.

Quelle:  chefkoch.de

Error: Failed to load processor AddComment
No macro or processor named 'AddComment' found

  • Posted: 2005-11-24 21:10 (Updated: 2006-10-15 11:05)
  • Author: dwt
  • Categories: (none)
  • Comments (0)

Firma Gründen

Gerade höre ich in der Universität die Veranstaltung  Venture Campus. An sich ein tolles Konzept - aber mit der Zeit wundert man sich schon ob das ganze System der deutschen Rechtslage nicht den einzigen Zweck verfolgt es möglichst schwierig zu machen das man ein Unternehmen gründet.

Alleine die ganzen Fußangeln die man gestellt bekommt wenn man versucht Geld von Investoren zu bekommen:

  • Karibikregelungen: jeder Vertrag mit Venture Kapitalisten enthält einen Default in dem festgelegt ist das sie jederzeit den Firmengründer aus der Firma "kanten" können. Ohne Grund.
  • Drag Along: Wann immer der Kapitalgeber will muss die Firma verkauft werden - oft sogar mit ihnen als Verhandlungsführer.
  • Due Dilligence: Wenn die Verhandlung schief geht (mit dem Kapitalgeber), muss man die Kosten für die Verhandlung voll selbst übernehmen. Oh, und natürlich setzt der Kapitalgeber fest was die genauen Kosten waren...
  • Catch Up: Alle Verträge enthalten Klauseln dass der Kapitalgeber zuerst bedient wird wenn nach einigen Jahren (meist etwa 5) die Abrechnung statt findet. Logischerweise stehen dann da sofort sachen drinnen die dem Geldgeber ermöglichen das dreifache seiner Einlage zu erhalten. Lustigerweise führt das dann immer dazu das der Geldgeber für ein viertel Einsatz sofort die Hälfte des Firmenwertes erhält. Oder sogar noch mehr...

*Kopfschüttel* Da fragt man sich wirklich was das für ein Land ist in dem wir hier leben... Ich mein, ist das gewollt das man keine Firmen gründet? Das man kein Riesiko eingeht? Im moment hab ich jedenfalls erst mal echt die Lust verloren eine Firma mit Fremdkapital zu gründen.

Was können Unternehmen von Open Source lernen?

 Paul Graham ist da der Meinung, dass Menschen härter und besser arbeiten, wenn sie etwas tun was sie gern tun.

Klingt trivial, aber die Unterscheidung zwischen "Professionell" und "Amateur" ist doch sehr tief in unserem Denken verankert. Dementsprechend werten wir Amateure auch gleich so als könnten sie per se alles schlechter - schließlich werden sie meist nicht dafür bezahlt!

Trotzdem sieht man in der Open Source- und der Blog-Welt immer mehr das das nicht stimmt. Für jeden Artikel den ich in einer Zeitung lese, lese ich ein Vielfaches an Artikeln von Irgendjemand. Und genauso für Software. Für jede Software die ich verwende, verwende ich ein Vielfaches an Software das Open Source ist.

Nun bin ich natürlich kaum repräsentativ - aber jeder der deswegen, oder weil es auch Software und Blogs gibt die nicht so gut sind, die Open Source-, genau wie die Blog-Gemeinde abtut, verpasst den Punkt:

Es geht mit dem Internet schließlich nicht mehr darum das es viele "Anbieter" gibt die nicht so gut sind, sondern darum das es auch ein Paar gibt die exorbitant gut sind - und die können andere Menschen mit dem Internet endlich erreichen.

Well, genaueres hört man  im Vortrag von Paul Graham.

Error: Failed to load processor AddComment
No macro or processor named 'AddComment' found

  • Posted: 2005-11-23 18:07 (Updated: 2006-10-15 11:06)
  • Author: dwt
  • Categories: (none)
  • Comments (0)

Material zum Vortrag "Soziale Innovation in der Informationsgesellschaft"

Error: Macro Image(wiki:BlogEntries/2005-11-22:Tatort_Zukunft_Robert_Jungk.jpg, right) failed
Attachment 'wiki:BlogEntries/2005-11-22: Tatort_Zukunft_Robert_Jungk.jpg' does not exist.
Anlässlich der Tagung  Tatort Zukunft - klären, stärken, handeln in  Bad Boll habe ich einen Vortrag gehalten, der die Zentrale Neuerung der Informationsgesellschaft gegenüber allem was vorher war vermitteln sollte. Da die Beteiligten alle sehr begeistert waren, hat es wohl durchaus geklappt. :)  Folien -  Folien mit Notitzen

Was noch fehlt ist das mp3 von dem Vortrag, das liefere ich nach, sobald die Freundin meines Mitbewohners mit der Aufarbeitung fertig ist, sprich - man auch die Kommentare der Teilnehmer gut ohne Kopfhörer verstehen kann.

Cocoa Development Blogs

Im  CocoaDevBulletinBoard wurde Vorgeschlagen einen gemeinsamen Blog für all things Cocoa Development einzurichten. Die Idee finde ich zwar gut, aber das die Umsetzung funktioniert glaube ich nicht.

Daher bin ich absolut für den Gegenvorschlag von  Gus Muller: Einfach jedes Posting das dazu gehört bei del.icio.us mit dem tag cocoadevblog markieren.

Yup!

 Hier gehts zu den del.icio.us Einträgen

Error: Failed to load processor AddComment
No macro or processor named 'AddComment' found

  • Posted: 2005-11-22 10:25 (Updated: 2006-10-15 11:06)
  • Author: dwt
  • Categories: (none)
  • Comments (0)

Singularität

Ein Klasse Vortrag den ich heute gehört habe von  Vernon Vinge über die  Singularität. Hammer. Ich persönlich glaube nicht daran das so ein Zustand in absehbarer Zeit möglich ist - dafür habe ich schon zu viele Bugs in Software gesehen. Aber der Gedanke ist trotzdem Faszinierend.

 Zum Vortrag

Error: Failed to load processor AddComment
No macro or processor named 'AddComment' found

  • Posted: 2005-11-21 10:39 (Updated: 2006-10-15 11:06)
  • Author: dwt
  • Categories: (none)
  • Comments (0)

Wein und Schokolade

Error: Macro Image(wiki:BlogEntries/2005-11-20:DomoriStyle.jpg, right) failed
Attachment 'wiki:BlogEntries/2005-11-20: DomoriStyle.jpg' does not exist.
Hmmm...... Heute war ich mit meiner Freundin auf einer  Wein- und  Schokoladenprobe. Ich bin immer noch ganz Platt von dem was wir alles gekostet und gelernt haben. Das fing ja bei so trivialen Sachen wie der Frage wie man Schokolade am besten genießt an.

Wie? Na klar, am besten so, dass man die Schokolade im Mund erst ein wenig anschmelzen lässt und sie dann oben am hinteren Gaumen "festklebt". Ach ja, und dann immer wieder beim genießen Luft in den Mund holen, damit die Schokolade ihren Geschmack voll entfalten kann. Neben Luft darf man natürlich immer mal wieder auch ein schlückchen Rotwein hineinwandern lassen.

Puah... Und das war bloß ein Punkt. Logisch das mit der Luft ist beim Wein natürlich das gleiche - und vor allem war der gar nicht so teuer. Die meisten Flaschen die wir getrunken haben waren unter 10 € - also eigentlich sehr erschwinglich.

Aber Wein und Schokolade sind offenbar sehr gute Cousinen. Vor allem Rotweine, eher schwere lassen sich eben hervorragend mit dunklen Schokoladen kombinieren. Am besten natürlich mit solchen von  Domori. :)

Aber auch die selbstkomponierten Schokoladen von Estrella, teils speziell zu den Weinen zusammengeschmeckt waren erste Klasse. Die Weinachtlichen Taler.... Zimt, Quittenmus, Kardamon..... wundervoll.

Naja und Nebenbei hab ich jede Menge Ideen abgreifen können was ich meinen Verwandten schenken könnte und wie ich in Zukunft superleckere Trinkschokoladen herstellen kann. Darüber aber ein anderes Mal. :)

Error: Failed to load processor AddComment
No macro or processor named 'AddComment' found

  • Posted: 2005-11-20 21:25 (Updated: 2006-10-15 11:06)
  • Author: dwt
  • Categories: (none)
  • Comments (0)

Yeehaw, ein neuer Blog

Meine neue Webseite geht an den Start. Viel Spaß beim neuen Layout und dem Mehr an Inhalt. :)

Gleich zum Start habe ich jede Menge meiner Veröffentlichungen auf MyPublishings aufgelistet. Viel Spaß beim Lesen!

Error: Failed to load processor AddComment
No macro or processor named 'AddComment' found

  • Posted: 2005-10-24 20:23 (Updated: 2006-10-15 11:07)
  • Author: dwt
  • Categories: (none)
  • Comments (0)