Der Deutsche Rollstuhl-Sportverband hat neuerdings eine Android-App, welche ich in meiner Rolle als Frontend-Developer bei w3design. entwickeln durfte. Die App wird zeitnah außerdem auch für das iPhone erscheinen.

Was daran jedoch besonders interessant ist — abgesehen vom Erscheinen der App selbst —, ist die Tatsache, dass ich sowohl von Java, als auch von Objective-C nicht den blassesten Schimmer habe. Vielmehr habe ich mich beim Entwickeln der App auf meine HTML-, CSS- und JavaScript-Kenntnisse verlassen. Möglich ist das durch PhoneGap, ein Framework, das Web-Apps in native Apps umwandelt und dabei ein paar sinnvolle Hardware-APIs zur Verfügung stellt.

Für die App selbst, habe ich auf Backbone.js gesetzt, da es mir gute Möglichkeiten bot, einerseits die Fülle an unterschiedlichen Daten zu verarbeiten, und andererseits ein sehr umfangreichen “One-Pager” zu bauen, welcher aus einer index.html besteht und alle Unterseiten client-seitig rendert.

Ich kann Phonegap jedenfalls nur empfehlen und möchte noch auf LungoJS hinweisen, welches bei kleineren Apps sicher gut mit Phonegap Hand in Hand geht.

Derzeit bin ich mit dem Bau einer Web-App beschäftigt, die initial einen Haufen Daten asynchron laden soll. Dafür könnte ich zwar ganz einfach ein paar $.ajax-Funktionen nacheinander aufrufen, doch hat diese Methode ihre Nachteile:

  1. Es bestehen Abhängigkeiteen zwischen den zu ladenden Daten, so dass sicher gestellt sein muss, dass die Daten vom Typ A fertig geladen sind, bevor das Laden der Daten vom Typ B startet bzw. starten kann.
  2. Der Fortschritt des Ladevorgangs soll visualisiert werden, heißt, ist ein Ladevorgang abgeschlossen und es beginnt der nächste, soll ein Ladebalken vorwärts schreiten.

Es wird ersichtlich, dass es nicht damit getan ist, die AJAX-Calls hintereinander aufzurufen. Vielmehr braucht es eine ordnende Instanz, die dafür sorgt, dass die Aufrufe sauber von einander getrennt ablaufen und zwischendurch Callback-Funktionen aufgerufen werden können. Um das zu erreichen, greife ich auf das Pub-Sub-Pattern von Addy Osmani zurück und kombiniere es mit einer InitialDataloader-Funktion. Die AJAX-Funktionalitäten hole ich mir von jQuery.

Im folgenden das Pub-Sub-Pattern:

var mediator = (function () {

  function subscribe(channel, fn) {

    if ( !mediator.channels[channel] ) {
      mediator.channels[channel] = [];
    }

    mediator.channels[channel].push({
      context : this,
      callback : fn
    });

    return this;

  }

  function publish(channel, context) {

    var i = 0,
      len,
      args,
      subscription;

    if ( !mediator.channels[channel] ) {
      return false;
    }

    args = Array.prototype.slice.call(arguments, 2);
    len = mediator.channels[channel].length;

    for ( ; i<len; i += 1 ) {
      subscription = mediator.channels[channel][i];
      subscription.callback.apply((context || subscription.context), args);
    }

    return this;

  }

  return {
    channels : {},
    publish : publish,
    subscribe : subscribe,
    installTo : function (obj) {
      obj.subscribe = subscribe;
      obj.publish = publish;
    }
  }

})();

Auf das Pub-Sub-Pattern möchte ich gar nicht weiter eingehen. Lediglich der Hinweis, dass ich die Publish-Funktion um die Möglichkeit ergänzt habe, einen eigenen Kontext zu übergeben.

Kommen wir als nächstes zur InitialDataloader-Funktion:

var InitialDataloader = function (args) {
  this.args = args;
  this.result = [];

  this.init();
};

InitialDataloader.prototype.init = function () {

  var i = 0,
    len = this.args.length;

  if ( !len ) {
    return;
  }

  for ( ; i<len; i+=1 ) {
    mediator.subscribe(this.args[i], this.load);
  }

  mediator.publish(this.args[0], this, {path : this.args[0], next : 1});

};

InitialDataloader.prototype.load = function (obj) {

  var that = this,
    deferred = $.ajax({url : obj.path});

  deferred.success(function (resp) {
    that.result.push('Data' + obj.next + ' loaded');
  });

  deferred.then( function (resp) {
    if ( obj.next === that.args.length ) {
      console.log(that.result);
    } else {
      mediator.publish(that.args[obj.next], that, {path : that.args[obj.next], next : obj.next+1});
    }
  });

};

in der Konstruktor-Funktion werden die Argumente entgegen genommen und der Prozess via der init-Funktion gestartet. Das args-Argument stellt dabei einen Array dar, der die Pfade zu den Daten enthält.

In der init-Funktion wiederum wird für jeden Pfad des args-Array eine Funktion im Pub-Sub-Pattern angemeldet. Anschließend wird das erste Element des Pub-Sub-Patterns "veröffentlicht", sprich die load-Funktion mit dem ersten Pfad aufgerufen und der Zähler zum nächsten Element des Pfad-Arrays mit übergeben.

Innerhalb der load-Funktion wird ein AJAX-Call auf den übergebenen Pfad gemacht und an ein deferred-Objekt übergeben. Dies wird anschließend genutzt, um eine Callback-Funktion zu starten, wenn der Ladevorgang abgeschlossen ist, und anschließend entweder das nächste Element des Pfad-Array im Pub-Sub-System zu "veröffentlichen" oder — wenn alle AJAX-Calls gemacht sind — eine finale Funktion aufzurufen (console.log(that.result);).

Anschließend noch der Aufruf der Funktion:

var initialDataLoad = new InitialDataloader([
  'http://apple.com/',
  'https://twitter.com/',
  'http://www.spiegel.de/',
  'http://www.flickr.com/'
]);

Die Adressen sind willkürlich gewählt.

Wenn man den Code in ein Skript packt und im Browser laufen lässt, sieht man in der Konsole nacheinander die AJAX-Calls und abschließend die Ausgabe des this.result-Array, der die einzelnen, zu ladenden Elemente mitgezählt hat.

Das war es auch schon. Sollte es Fragen oder Anregungen, nutzt bitte die Kommentar-Funktion. Ich freue mich immer über Feedback!


AK Madagaskar Filmtrailer auf Vimeo

Vor etwas mehr als einem Jahr sind einige Pfadfinderinnen und Pfadfinder vom AK Madagaskar des VCP Land Niedersachsen nach Madagaskar gereist um das Land kennen zu lernen und den Fortschritt des dort betreuten Projekts zu begutachten.

Des weiteren wurde der Plan gefasst, im Zuge der Reise einen Dokumentarfilm sowie eine Fotoausstellung zum Thema "Kindheit und Jugend in Madagaskar" zu erstellen. Beides — Film und Ausstellung — nähern sich nun langsam der Fertigstellung. Obiger Trailer gibt schon einmal einen Vorgeschmack auf das, was kommen wird.

Google stellt seinen neuen Service “Music” mit einer ziemlich beeindruckenden Tour vor. Diese ist multimedial, gefällig im Design und insgesamt sehr kurzweilig. Die einzelnen Bereiche der Tour werden durch Tonspuren repräsentiert, die quirlig über den Bildschirm flitzen und sich sukzessive zu einem Song ergänzen.

Ist man mit der Tour fertig, ist auch der Song vollständig und kann kostenlos heruntergeladen werden. Das ist ein ziemlich guter Call-to-Action und katapultiert den Besucher direkt in das Google-Music-System. Die erste Hemmschwelle, den Service auszuprobieren, könnte also schnell abgebaut sein. Allerdings funktioniert das nicht, wenn man nach dem Klicken des Download-Buttons folgende Seite angezeigt bekommt:

Nun muss man Google zugute halten, dass der Service noch brandneu ist und es daher nicht verwundern sollte, wenn er nur nach und nach über die US-amerikanischen Landesgrenzen hinaus erweitert wird. Aber ein bißchen ernüchternd war das nach der Präsentation zuvor schon …

(via @73inches)

Letzte Nacht verstarb Steve Jobs — Gründer von u.a. Apple Inc. — mit 56 Jahren an Krebs.

Mein Verhältnis zur Firma Apple ist zwar seit längerem recht ambivalent — den in Funktion und Design überragenden Produkten steht ein oftmals zweifelhaftes Geschäftsgebaren gegenüber. Auch die Schar größtenteils unreflektierter Apple-Jünger erzeugt manches mal ein Stirnrunzeln meinerseits. Doch das alles ändert nichts daran, dass Steve Jobs schon zu Lebzeiten als Unternehmer eine Legende war.

Sein beständiger Antrieb, Dinge voran zu treiben und weiter zu entwickeln, die konstante Suche nach Innovationen und das damit einhergehende regelmäßige, kritische Hinterfragen des Status Quo gepaart mit der Kompromisslosigkeit, mit der er die Dinge anging. Selbst Misserfolge waren keine Rückschläge, sondern nur weitere Teilstrecken auf dem Weg nach vorn.

Dies alles bietet Inspiration nicht nur für Unternehmer, sondern jeden Menschen, der das Leben nicht als statische Einheit zwischen Beruf, Reihenhaus und Kegelklub seht, welche es zu konservieren gilt. Und man entschuldige mir das Strapazieren überkommener Stereotype an dieser Stelle.

Wie dem auch sei, der langen Rede kurzer Sinn: RIP Steve Jobs.

Wer seine Website auf Servern von 1und1 betreibt, sollte sich kurz die Zeit nehmen und einen Blick auf seine 404-Fehlerseite werfen. Wie Thomas Stadler vom Internet-Law-Blog nun herausgefunden hat, scheint 1und1 diese nämlich für das Schalten von Werbung in Form von Sedo-Domainparking-Seiten zu nutzen. 1und1 würde damit nicht nur die inhaltliche Authentizität und Integrität der Seiten — so sie denn gegeben ist — unterminieren, sondern sich auch in fragwürdiger Art und Weise auf dem Rücken der jeweiligen Website-Betreiber bereichern.

Thomas Stadler erklärt in seinem Artikel jedenfalls, wie man diese Praktik unterbindet. Darüber hinaus bringt er eine anwaltliche Unterlassungsaufforderung an 1und1 auf den Weg. Das ist fair von ihm.

Gestern, am 31. August 2011, hat der Stadtjugendring Hannover e.V. eine Informationsveranstaltung für Erstwähler ausgerichtet, um sie auf die anstehenden Kommunalwahlen am 11. September 2011 einzustimmen. Dafür wurde im Vorfeld ein Fragenkatalog erarbeitet und an die jugendpolitischen Sprecher der im Rat der Landeshauptstadt vertretenen Parteien versandt.

Die Fragen bezogen sich auf das Thema Jugendarbeit und gestalteten sich wie folgt:

  1. Wie wollt ihr in den nächsten Jahren Jugendverbandsarbeit unterstützen?

  2. Erhöhung der Pauschalmittel, wenn Jugendorganisationen mit Migrationshintergrund in den Ring aufgenommen würden?

  3. Ein besonderes Projekt?

  4. Gleichberechtigte Förderung der Hauptamtlichenstellen?

  5. Einbeziehung von Menschen mit besonderem Förderungsbedarf?

  6. Einbeziehung von Eltern in die Förderung?

Zusätzlich gab es zu jeder Frage einen erläuternden Satz.

Das Feedback der Aktion war denn auch recht ansehnlich; die jugendpolitischen Sprecher von CDU, Die Grünen, Die Linke und der SPD haben sich die Zeit genommen und alle Fragen hinreichend beantwortet.

Einzig die FDP wollte nicht so recht "mitspielen". Ihr jugendpolitischer Sprecher Dr. Nils Tilsen hat sich — aus welchen Gründen auch immer — nicht mit der Beantwortung der Fragen belastet, sondern kurzerhand folgendes Schreiben aufgesetzt:

"… ich teile Ihnen mit, dass ich mich außerstande sehe, Ihren Fragenkatalog abzuarbeiten.

Die Fragen sind teilweise so ins Detail gehend, dass es für mich einen erheblichen Zeitaufwand bedeuten würde, diese fachgerecht zu beantworten.

Ich finde es zwar von Ihnen taktisch geschickt, hier Kommunalpolitiker für die nächste Wahlperiode auf Ihre Probleme hinzuweisen und jetzt schon Unterstützung schriftlich einzufordern, aber auf einen solchen Deal lasse ich mich nicht ein.

Ich möchte Sie auf die Position der FDP-Ratsfraktion zu den letzten Haushaltsberatungen hinweisen, dass wir die freiwilligen sozialen Leistungen der Stadt, aufgrund der prekären Haushaltslage, pauschal kürzen wollen. Daher gehen Sie bitte davon aus, dass auch die Vertreter der FDP in der nächsten Wahlperiode einen möglichst ausgeglichenen Haushalt als die beste Lösung besonders für die jungen Menschen unserer Stadt als Prämisse ansehen.

Daher kann ich Ihnen nur anraten, dass Sie selber, durch Umschichtung in Ihren eigenen Strukturen, die von Ihnen selbst gesteckten Ziele erreichen müssen.

Ich bitte um Ihr Verständnis.
Mit freundlichen Grüßen! Dr. med. Nils Tilsen"

Das nenne ich mal ein "herzliches" Schreiben. Inwiefern der Mitarbeiter für Öffentlichkeitsarbeit und PR im Urlaub war oder ein derartiger Umgang mit den Anspruchsgruppen bei der FDP Hannover zum Standard gehört, lässt sich nur spekulieren.

Als langjähriger Ehrenamtlicher der Jugendverbandsarbeit des VCP kann ich mich allerdings über ein solches Verhalten nur wundern. In Zeiten zunehmender Kinderarmut, fortschreitender Zerklüftung der Gesellschaft und steigender Jugendkriminalität zu behaupten, ein ausgeglichener Haushalt wäre die beste Lösung für junge Menschen ist in höchstem Maße zynisch.

Weiterhin den Ruf nach Unterstützung als niederes Belästigen herabzustufen ohne sich ernsthaft mit der Materie auseinandersetzen zu wollen, ist in meinen Augen beängstigend. Ich weiß nicht, welches Verständnis von Politik dem zugrunde liegt. Ich würde allerdings vermuten wollen, dass es zum Aufgabenbereich eines jugendpolitischen Sprechers gehört, sich um jugendpolitische Belange zu kümmern.

Dazu gehört auch, dass man sich mit Vertretern der Jugendarbeit auseinandersetzt und diesen nicht einfach auf den Weg mit gibt, sie sollen sich selber um ihren Kram kümmern und eben ihre Strukturen anpassen. Zwar sind Einrichtungen der Jugendarbeit in der Regel keine straff organisierten Wirtschaftsbetriebe. Allerdings ist es fraglich, inwiefern sie das sein müssen. Unabhängig davon ist Ignoranz gegenüber den Sorgen und Nöten dieser Einrichtungen ganz sicher nicht das adäquate Mittel.

Deshalb zum Abschluss die Frage an Herrn Nils Tilsen: Was haben sie sich bei diesem Schreiben gedacht?

Ich weiß nicht, wie oft ich mich schon darüber beschwert habe, dass es den Klassiker "Transport Tycoon Deluxe" nicht mehr gibt und scheinbar vergleichbare Spiele heutzutage nicht mehr entwickelt habe. In meiner Jugend habe ich einen gewissen Teil meiner Zeit in dieses Spiel investiert und neben "Civilization", "Sim City 2000" und "Die Siedler" ist es definitiv einer meiner Alltime-Favorites. Auch wenn ich sonst kein großer Gamer bin.

Was jedoch komplett an mir vorüber gegangen ist, ist die Tatsache, dass "Transport Tycoon Deluxe" seit 2004 als Open-Source-Projekt existiert und für Mac OS X, Linus und Windows erhältlich ist. Das ganze firmiert unter der Bezeichnung OpenTTD. Wenn das kein Grund zur Freude ist. Ich kann jedem, der sich für Simulationen und Strategiespiele interessiert und bisher nichts mit TTD zu tun hatte, nur empfehlen, das Spiel mal anzutesten.

Die Grafik ist schwer 90'er, aber das sollte in Zeiten wie diesen, wo Menschen in "Blockbuster"-Games mit ausgeprägter Pixelgrafik quantenphysikalische Experimente unter Verwendung digitaler Hühnern nachstellen, kein Problem sein, denke ich …

Link: OpenTTD dans les webs

Download

Check out Backboned v2!!

Um mir gelegentlich etwas Zerstreuung vom Lernen zu geben, habe ich einen lange gehegten Plan in die Tat umgesetzt: Ein AJAX-betriebenes WordPress-Theme mit Backbone.js zu bauen. Und zwar keine auf "Graceful Degradation" setzende Kompromisslösung. Alle Inhalte werden asynchron geladen und sind per Hashbang URIs ansteuerbar. Ein Blick in den Quellcode offenbart, was ich meine: Ein JSON-Objekt mit allen grundlegenden Daten, eine Handvoll jQuery-Templates und das HTML-Grundgerüst. Das war es an statischem Content - die Darstellung des Inhalts geschieht über Backbone.js.

Damit Suchmaschinen nicht außen vor bleiben und man sich nicht die Mühe machen muss, einen "Headless Browser" à la HtmlUnit auf seinem Server zum laufen bringen zu müssen, werden grundsätzlich alle Inhalte als GET-Anfrage mit dem Parameter _escaped_fragment_ abgehandelt - die Ausgabe variiert dann je nachdem zwischen statischem HTML oder einem nackten JSON-Objekt. So ist sichergestellt, dass die Inhalte trotzdem indiziert werden können. Die einzigen, die in die Röhre schauen, sind Besucher ohne JavaScript.

Um diesen Workaround zu realisieren, war jedoch ein hohes Maß an Improvisation vonnöten. Mit WordPress-Bordmitteln habe ich es nicht geschafft, das Frontend-seitige URL-Routing von Backbone.js server-seitig abzubilden und entsprechend zu bearbeiten. Ich habe deshalb auf ein simples MVC-Pattern zurück gegriffen und in das eigentliche Theme eine Art Child-Theme integriert. Das ist insgesamt kein Ansatz der mir - besonders in meiner Umsetzung - gefällt. Des weiteren muss man für einen störungsfreien Betrieb des Themes das URL-Rewriting in den WordPress-Einstellungen deaktivieren.

Darüber hinaus bleibt anzumerken, dass das Theme insgesamt eher rudimentär ist. Ich würde von einem Produktiveinsatz abraten. Allerdings bin ich grundsätzlich von der Idee des Themes überzeugt und freue mich natürlich, wenn jemand sich ebenfalls dafür begeistern kann und daran weiterarbeitet. Gerne auch in Kollaboration mit mir. Zu tun gibt es unter anderem noch:

  1. die grundsätzliche Verbesserung des PHP-Codes (sicherer machen, besser in das WordPress-Environment integrieren, …)
  2. den Funktionsumfang erhöhen (Neueste Kommentare, Tags, Suchfunktion, Sidebar-Widgets(?), …)
  3. das JavaScript straffen (Performance, geschmeidigere GUI-Abläufe, …)

… um ein paar Aspekte zu nennen.

Ansonsten freue ich mich wie immer über Anregungen und Verbesserungsvorschläge - gerade bei einem Vorhaben dieser Größenordnung hat man als Entwickler nicht wirklich einen umfassenden Überblick.

PS: Wahrscheinlich werde ich das Teil zeitnah bei GitHub reinladen. Muss mich da aber erst noch anschlauen.

Update: Okay, die Geschichte ist jetzt auch auf GitHub - https://github.com/herschel666/Backboned. Viel Spaß.

Kleinere Beiträge zum Thema "Worauf man beim JavaScript schreiben achten sollte" gibt es mittlerweile ja wie Sand am Meer im Interweb. Zusätzlich hat Douglas Crockford mit seinem Buch "JavaScript: The Good Parts" eine umfassende Sammlung geschaffen, hinsichtlich der Fallstricke und Annehmlichkeiten, die JavaScript bietet.

Wer allerdings den Kauf des Buches scheut und die Mühen, die das Finden der vielen kleinen, guten Beiträge mit sich bringt, vermeiden möchte, dem sei der JavaScript Garden ans Herz gelegt. Dort hat Ivo Wetzel eine ansehnliche und stetig wachsende Dokumentation der "most quirky parts of the JavaScript programming language" geschaffen.

Ich habe den Garten bisher lediglich kurz überflogen, daher gibt es die Empfehlung hier nur mit Vorbehalt. Ich bin aber zuversichtlich, dass da ein Quell an nützlichen Informationen angelegt wurde. Also guckt mal vorbei.

Gefunden bei bb-applications