Unsere Obsession mit der Shell

written by Martin Häcker on

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

written by Martin Häcker on

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.

[source:/open-source/adding-blocks-as-methods/trunk/AttachBlocksAsMethods.m So sieht dass dann aus]

Die schönsten Testsuiten

written by Martin Häcker on

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

written by Martin Häcker on

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

written by Martin Häcker on

Well, I just finished some major reworking of that jQuery plugin, so now it has [browser:/open-source/jquery-edit-in-place/trunk/spec/unit/spec.js 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?

written by Martin Häcker on

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

written by Martin Häcker on

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

written by Martin Häcker on

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

written by Martin Häcker on

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

written by Martin Häcker on

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 = operatoren in Python so spezifiziert, dass sie ihre left-hand-variable in place modifizieren wenn diese mutable sind.

:-(