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. :)
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. :)
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).
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...
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 denOpen 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.
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.
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!
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.
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.
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.
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:
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?
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.
...sind sicherlich heute sehr selten.
Wo ich gerade beim Thema sind... Jeder sollte sein Softwarepatent des Monats wählen!