Notes on Ingress

1. We are flipping bits on Google’s servers, but we are only allowed to do so if our phones report that we are currently at a given location. That’s all it is. But that’s all it takes to create a powerful illusion – or perhaps I shouldn’t call it an illusion, because that would be a term of the physical world. It’s the blending of virtual reality and physical reality, such that I can almost see the links and the fields stretching over the buildings in my neighborhood. I am running around frantically from portal to portal, trying to make it in time before the checkpoint. I’m hooked.

2. The fact that we can only make certain game moves while we are at a given physical location, and that we cannot tamper with the location-reporting mechanism in our phones, is a game rule, just as any other game rule, albeit a technically enforced one. Perhaps in all games where the players are not physically in the same location, and don’t know each other personally, the rules need to be enforced by technical means.

3. Of course there is spoofing. It wrecks the game. Not much to be said about it.

4. Pretty much the only thing which Google doesn’t allow us to use is computers. The only way to interact with the game is the Scanner app (which is visually nice but not very practical) and a really pathetic display of the game state on ingress.com, literally just a toy map. Even the attempt to augment that map and turn it into a more precise and practical tool is considered illegal and barely tolerated.

5. A great game would allow arbitrary API access to the game state, while still enforcing move legality (the position-reporting bit. I’m sure that can be done). It would allow players to use all computing power and UI design ideas they can come up with to enhance their game.

6. There is no need to worry that this would only benefit one team, because that team happens to have much better programs than the other. There is no way half the world could keep something secret from the other half of the world.

7. The Enlightened are the Resistance. Probably due to popular movie culture, or because of a basic human instinct, far more players choose the Resistance as their faction than the Enlightened. Which means there is, practically everywhere, a crushing dominance of the Resistance. Which, in turn, means that if you want the experience of being a rebel and an underdog, of having to use your wits and creativity to stand up against a much more powerful opponent that seems to dominate the entire world: choose the Enlightened.

8. One of the more fascinating aspects of Ingress is that the goal of the game is not clear. Is it leveling up? Creating farms? Recruiting new players? Having fun? There has been a recent push by Niantic to establish MU – the size of the fields that a faction creates and maintains – as the goal, but there is little agreement among the players that this actually is it. Which doesn’t seem to curb people’s enthusiasm and even passion to play the game.

How I’m using the Five-Star System for Books

In an attempt to make my rating of books more systematic, here’s how I’ve been using, and intend to further use, the five-star system.

***** A book that makes deep and lasting contributions to fundamental questions which are relevant to me. This book will henceforth be inseparable from my thinking, and I will return to it often. Alternatively, a book which, if I had never read another book before, would get me to start writing.

**** A strong book that has been significantly beneficial for me to read. I will return to it once in a while and continue to be influenced by it.

*** A so-so book. Nothing particularly outstanding, but no fundamental shortcomings either. I am likely not going to return to this book in my thinking and might forget about it before too long.

** A book that made no positive contributions to my thinking and has fundamental shortcomings, but I finished it nonetheless.

* A book that was so unbearable to read that I did not finish it.

These are personal criteria and that’s intentional. If I stumbled upon an objectively outstanding book that happened to be irrelevant to me, I would give it a low rating. Usually that doesn’t happen though, as my decision which books to read will likely filter out those books in the first place.

My Current Position

The most important feature of now-deceased Google Latitude, for me, was the ability to publish your real-time location on your own web site, also known as the “public location badge”. I had set this up under a private URL which I only gave to a couple of friends. Actually, and totally unexpected for me, this turned into the most intimate link between me and my parents that had existed in decades. And I was not alone: this thread brought up experiences from a surprising number of people who had found surprisingly intimate and, shall I say, human uses of Latitude.

This is no more. It was given the axe by Google like many other services, and supposedly replaced by an integration with Google+ that is, as of this writing, not even close to the features that Latitude had. I searched high and low but there is no service in sight that could fill the gap.

So I decided to roll my own. I created a simple mash-up of my Foursquare feed and the Google Maps API, which displays my last few check-ins nicely laid out on a map with a timeline on the left. (I’m actually surprised that Foursquare doesn’t offer a feature like this.)

map of foursquare checkins

The one downside of this compared to Latitude is that it’s not real-time, always-on, since it shows only my check-ins. I mitigated this by setting up automatic check-ins at the places where I most frequently show up: home and work. (The Android app FsIntents lets you do that easily; iOS solutions also exist.)

Compared to Latitude, my solution also has a few very nice upsides going for it:

  • It shows semantic locations – in other words, it gives an idea of what I’m doing, rather than just where I am.
  • It shows history, rather than just a single position as the location badge did.
  • It is a real map, rather than just a static image. It is zoomable and scrollable, satellite-switchable, and even street view is in there.

It’s implemented as a simple php script, named pub4sq.php, which can be downloaded from github. Instructions how to customize it for your own feed are in the file. I’ll also take the opportunity and make the map of my own feed public: You can henceforth find my reasonably current position under drmirror.net/pos.

Das alte Feuerwerk

Dass wir’s auf den Pier I schaffen würden, sogar noch um kurz vor acht, hätte ich nicht für möglich gehalten. Und es war nicht mal besonders voll – eine Gasse in der Mitte des Piers wurde wie selbstverständlich frei gelassen, während links und rechts davon die Leute ihr Picknick auf den Steinfliesen aufgeschlagen hatten, mitunter Klappstühle aufgestellt, Fotostative am Geländer des Piers montiert. Ja, die Klappstühle: einer der Gegenstände, deren Mitbringen auf den Leuchttafeln am Eingang des Riverside Parks untersagt war. Genau wie Alkohol, oder große Rucksäcke. In Wirklichkeit schien sich niemand darum zu kümmern. Als wären die Verbote nur dazu da, die Menge der betreffenden Gegenstände ein bißchen statistisch einzuschränken.

Als wir ankamen, flog gerade eine Hubschrauberstaffel mit »NYPD« auf den platten Bäuchen eine Parade den Hudson herauf und herunter. Später, da war die Sonne gerade im Begriff unterzugehen, nochmal ein einzelner Hubschrauber, sehr tief, so dass ich, als er sich entfernte, die leichten Korrekturbewegungen sehen konnte, mit denen der Pilot die Maschine stabil hielt.

Die Polizeiboote mit ihren lautlos blau blinkenden Lichtern auf dem Hudson – irgendeinen Grund muss es wohl geben, dachte ich, warum die maritime Polizei mit nur einer Farbe auskommt, während die landgebundene diese rot-blau rotierenden Pulsare hat. (Ja, ich glaube, ich hab’s: weil Rot auf dem Wasser für die Backbord-Positionsleuchten reserviert ist. Ob ich das nachschauen sollte?)

Wir mussten lange warten: über eineinhalb Stunden. Ulla, die sich mit Disa auf die Steinfliesen setzte und sie beschäftigte, einfach so, unermüdlich. Die Papierzeitung lesend, die sie mitgebracht hatte (Ulla, die Expertin und Archivarin der kostenlosen Subway-Morgenzeitungen). Fotos mit ihr auf dem Telefon angucken (Disas ganzes bisheriges Leben umfassend). Verstecken hinter der am Wagen hängenden Handtasche. Ich stehe etwas unbeteiligt daneben, schaue stumm, aber doch irgendwie wichtig auf den Fluß hinaus und zu den Trump-Türmen herüber. Wann immer ich mich Disa zuwende, ist es nur ein kurzes Lächeln, ein Über-den-Kopf-Streichen, ein Bewegen meines Kopfs auf den ihren zu, bis sich unsere Nasenspitzen berühren. Oder ich nehme sie hoch, halte sie mit ausgestreckten Armen waagerecht über mir, so dass sie die ganze Umgebung sehen kann und juchzt »Jag flyger! Jag flyger!« – aber es sind doch immer nur Momente, zehn Sekunden vielleicht, bis ich nicht mehr weiß, was tun, Disa absetze (was sie mir nie übel nimmt) und wieder wichtig auf den Fluß und zu den Türmen hinüber schaue.

Kommt Langeweile auf? Kaum. Da so viele Menschen hier sind, ist offensichtlich, dass ganz bestimmt irgendetwas passieren wird, und wenn ich neben Disa in die Hocke gehe und versichere, dass gleich wirklich das große, große Feuerwerk anfangen wird, verändert sich ihr Blick und geht staunend ins Leere. Neben uns in der Menge werden schon Kinder auf die Schultern genommen, aber nach einer Viertelstunde weiteren Wartens verschwinden sie wieder zwischen den Ausgewachsenen. Ich warte. Ich werde sie bei den ersten Raketen hochnehmen, nicht früher.

Sie hält sich an meinem Gesicht fest. Ihre Finger sind so nah an meinen Augen, dass ich mir Sorgen mache, ob wohl mein Lidschlag-Reflex schnell genug wäre, wenn sie plötzlich etwas höher langte.

Was sind das für Ahs und Ohs? Sind sie echt, oder lernt sie von uns, wie man auf Begeisterung schaltet, wenn der dafür vorgesehene Moment kommt?

Das alte Feuerwerk. Ist es vorstellbar, dass man uns, die wir Lasershows und 3D-IMAX kennen, etwas bieten könnte, das uns fünfundzwanzig Minuten lang nicht aus dem Ah und Oh kommen läßt? Gab es je eine Zeit, in der es den Menschen so ging? Ist es die Zeit meiner Tochter?

Einige Strukturen und Sequenzen überraschen mich, einige sind wirklich wunderschön. Das riesige, weiße Gespinst, wie eine eisstarrende Trauerweide. Die viele Sekunden lang senkrecht aufsteigenden Feuerschweife, die aussehen wie Cape Canaveral. Crescendos und Diminuendos. Vermutlich müßte ich Biographien von Feuerwerkern lesen: Ob es Künstler gibt, denen kein anderes Mittel des Ausdrucks gegeben ist, als Feuerwerke zu inszenieren? Sie hätten wenig Zeit, ihrem Publikum etwas mitzuteilen. (Welchem Publikum?)

Wir vermuten einige Male, jetzt müsse es aber gleich vorbei sein. An der Spitze des Piers setzen bei einem der letzten Höhepunkte die Rufe ein: U-S-A! U-S-A! U-S-A! Meine fünfzehn Kilogramm schwere Tochter eine halbe Stunde lang auf den Schultern zu tragen, ist verblüffend anstrengend. Als ich sie absetze, spüre ich die Stauchung meiner so etwa in der Mitte des Lebens angekommenen Wirbelsäule.

Die Menge drückt sich vom Pier zurück, unter den Pfeilern der Stadtautobahn durch und den Fußweg schräg den Hügel hinauf zum Riverside Drive. Es geht langsam: bei einer Panik würde das eher schlecht funktionieren. Ein zwei Meter großer Soldat im Tarnanzug mit Pilotenbrille hält während des ganzen Rückwegs ein USA-Fähnchen hoch und strahlt dabei verzückt. Lächeln hat er für alle genug.

Ausnahmezustand: Sechzig Jahre 17. Juni

Der 17. Juni 1953 – Tag des Arbeiteraufstands in der DDR – jährt sich in diesen Tagen zum sechzigsten Mal. Aus diesem Anlaß hier ein Kapitel aus Reinhard Kettners Roman »Das grüne Licht der Passagen«, veröffentlicht mit freundlicher Genehmigung des Autors. Ich will nicht verschweigen, dass ich an der Buchwerdung dieses Romans selber mitarbeiten durfte und mich daher über seine Verbreitung fast so sehr freue, als wär’s mein eigener. Apropos Verbreitung: Wie ich aus gut unterrichteter Quelle weiß, haben wir heute und morgen, am 17. Juni 2013, Ausnahmezustand und der Roman ist für kurze Zeit kostenlos.

Der 17. Juni. Beginn der eurasischen Wirren. Tag der Illusionen. Tag der Panzer: letztes, unschlagbares Argument. Ich hatte mich den Janottabrüdern angeschlossen. Wir liefen sofort nach Schulschluss in Richtung Unter den Linden. Vor der Uni­ver­si­tätsbibliothek, hatte es geheißen, habe ein T-34 einen Demonstranten überrollt. Ich wollte unbedingt den Toten sehn oder wenigstens den Blutfleck. Wir fanden beides nicht und wurden mitgerissen von der hin- und herwogenden Menschenmenge, die jedesmal, wenn ein Panzer anrollte, panisch in Hausein­gänge und Nebenstraßen wallte und zurückflutete, sobald der Panzer passiert hatte. Dann flogen Steine, Pfiffe gellten, und manchmal sprang aus der Menge ein besonders Mutiger von hinten auf den Panzer auf und versuchte die Antenne abzubrechen oder hämmerte mit einem Stein grotesk auf den Turm ein. Irgendwann verlor ich die Janottabrüder. Ich suchte eine Weile, ließ mich treiben und landete schließlich am Potsdamer Platz. Ich hatte jedes Zeitgefühl verloren. Ich sah das brennende Columbushaus. Ich warf mich zu Boden, wenn auf einem der unentwegt vor- und zurückpreschenden Panzer das MG lostac­kerte. Ich hörte jemanden sagen: Platzpatronen! und sah, dass er seinen eigenen Worten nicht recht traute und sich plattlegte. Die Panzer schossen in Richtung Sektorengrenze, wo sich Massen von Schaulustigen eingefunden hatten. Niemand fiel um. Als ich mich das dritte oder vierte Mal hingeworfen hatte, und drüben noch immer alle aufrecht standen, hatte ich das unbezwingliche Gefühl, die Soldaten hinter den Sehschlitzen würden sich halbtot lachen über uns. Ich erhob mich und erklärte den Aufstand für meine Person als beendet. Heimwärts kam ich an einem geöffneten Tante-Emma-Laden vorbei. Ich legte alles Geld auf den Tisch, das ich bei mir hatte: Was bekomm ich dafür? Markenfrei! – Ich hab noch drei Makkaronipäckchen! – Gut, sagte ich. Und zuhaus sagte ich: Für alle Fälle! Wer weiß, wann es wieder was gibt! Mutter lächelte milde: Das ist doch alles nur Lärm! Aber du könntest Großvater nach Hause lotsen! Ich kenne die Herrn Ältesten! Die verquasseln glatt die Sperrstunde!

Ich könnte nicht sagen, was mich bewog, zuerst zum Hoffenster des Albrechtskellers zu schleichen, wie wir das früher getan hatten: Klauke, die Janottabrüder und ich. Ich kann nur sagen, dass ich mich hinterher besser fühlte. Der Albrechtskeller befand sich ein paar hundert Schritte entfernt von unserer Wohnung. Auf halbem Weg, mit halluzinativer Deutlichkeit, hatte ich plötzlich den Westen in der Nase. Seifen, Zigaretten, Parfüms, Schokolade, Kleider, Mäntel, Stoffe. Alles roch feiner dort. Sogar die Scheißhäuser, wie Klaus Janotta zu behaupten pflegte, was kein Wunder wäre bei den wohl­riechenden Sachen, die die Leute fräßen! – So urplötzlich waren die Gerüche da, dass ich stehn blieb und wie ein Pferd flämte. Der Westen in der Reinhardtstraße. Kein 5:1 mehr. Kein Schmuggeln über die Sektorengrenze. Kein Aufriss wegen Bürstenhaarschnitt oder Jeans. Aber jedes Ausatmen, ach, jedes Ausatmen sag­te mir: Vorbei, vorbei!

Ich schreibe dieser Enttäuschung das unverblasste Vergnügen an meiner Ohren­zeugenschaft zu. Ich rieche den Mix aus Bierdunst und unparfümierten Nachkriegstabak. Ich höre die gereizte Stimme des Janottagroßvaters: Schwei­ne! Alles Schweine! Amerikaner! Engländer! Franzosen! Alles Schweine! – Aber das hieße aan Krieg, Haanrich! Aan großes Elend! – Ach was, Krieg! Und wenn! Muss ja nicht auf deutschen Boden…! – Heinrich! lässt sich Großvater vernehmen. Heinrich! Das sind doch keine Verrückten! Denen sitzt ihr eigenes Hemd…! – Wisst ihr, was aan Russe mir mal gesagt hat? – Das sind ja nun die Oberschweine! – Sperr aanen Deutschen in aane Konserve, hat er gesagt, und er kommt mit aanem Panzer wieder raus! Sie haben aan Schiss vor uns! Alle wie sie da haaßen! Sie haben aan Schiss! – Ach, Jakob! Herjemine! Der Stalin müsste sich ja umdrehn im Grab! – Also, wenn schon, heisert Großvater, dann im Mausoleum! – Na, wenn’s dir Freude macht, Willem! Jedenfalls, wenn der Stalin Schiss hatte vor was, dann vor den Amerikanern. Und wenn die, Willem…! – Die werd’n aber nich! Die husten uns was! – Waal sie aan Schiss haben! – Quatsch! Weil sie nich blöd sind! Weil sie ihr eignes Süppchen… Weil ihr Gerede… wer sind wir denn? Taube Nuss am Faulbaum der Geschichte! Haufen Schutt und Asche! Wer sollte dafür seinen Kopf…? – Himmelherrgottverflucht! bellt der Janottagroßvater. Himmelherrgottverflucht! Dann eben Generalstreik! Oder­ Hungerstreik! Wenn ein ganzes Volk sich weigert…! – Ge­ne­ral­streik? Mit Deutschen? Dass ich nicht lache, Heinrich! Die hab’m schon ihren Kaiser verkauft! – Herrschaften! lässt sich die ruhige Stimme von Kaulitz vernehmen. Herrschaften, wir haben Ausnahmezustand! Also, etwas Mäßi­gung, bitte! – Worüber machst du dir Sorgen, Kauli? Sind wir mehr als drei Personen? Ist das ein öffentlicher Platz hier? – Sind wir aane Kundgebung vielleicht? – Herr­schaften, ihr habt nur euren Kopf zu verlieren, ich meine Lizenz! Also Themenwechsel oder Fenster zu! Im Hof wohnt einer von der Polente! – Na, bleibt nur Weiber oder Wetter, Kauli? Kannst dir’s aussuchen! – Meinjeh, die Herrn Kirchenältesten…! Dann das Geräusch schließender Fensterflügel.

Irgendwas neues, Junge? fragte mich Großvater auf dem Nachhauseweg. Nicht, dass ich wüsste! Die russischen Panzer rolln und rolln, und Amerika wird nicht so blöd sein, wegen Deutschland ‘n lausigen Krieg anzufangen! – Komisch, sagte Großvater, genau das hab ich auch grad gesagt! Und weißte, was der Janottaheinrich gemeint hat? – Keine Ahnung! – Dann eben Generalstreik! – Generalstreik? Mann, wo lebt der denn? Doch nicht mit Deutschen! Großvater strahlte: Genau das hab ich auch gesagt!

Vier Tage später, am Sonntag, waren die Janottabrüder und ich mit Fahrrädern unterwegs. Manchmal zu dritt nebeneinander. Wir hatten uns nichts gedacht dabei, auf keinen Fall provozieren wollen. Wir hatten den Toniwagen einfach zu spät gesehn. Statt einer gebührenpflichtigen Verwarnung, erging die Aufforderung an uns, dem Wa­­gen zu folgen. Er hielt vor einem Polizeirevier in der Glinkastraße. Wortlos führte man uns in einen kahlen Hinterraum, dessen Fenster bis oben vergittert waren. Eine Wolke ätzenden Pissegeruchs schlug uns entgegen. Sie entströmte den Hosen von ein paar Männern, die reglos an der Wand standen. Stellt euch dazu! Gesicht zur Wand! Los, los! – Der Mann, neben den ich mich stellte, nickte fast unmerklich mit dem Kopf. Ich suchte Blickkontakt zu den Janottabrüdern, aber sofort kam das Kommando: Augen zur Wand! – Gehorsam starrte ich auf die rissige Ölfarbschicht vor mir. Stille. Nur das schwere Atmen der Männer war zu hörn und das Geräusch, wenn einer der beiden Aufpasser den Gummiknüppel in die Hand klatschen ließ. Es verriet, wo der Stockmann sich gerade aufhielt: am Anfang der Reihe, in der Mitte oder direkt hinter uns. Er schien zu schleichen oder zu schweben. Manchmal hatte ich das Gefühl, einen kalten Hauch zu spüren, bevor es leise, fast nachdenklich hinter mir platschte. Seine Stimme traf mich unvorbereitet: Umdrehn, ihr drei! – Nacheinander tippte er uns leichthin mit dem Knüppel an, als wären wir Käfer, die sich tot gestellt haben: Drei Um­stürz­ler, wie? Ich hör nichts, Freunde! – Sind doch noch fast Kinder! sagte der Mann, der mir zu­ge­nickt hatte. – Was denn! Was denn! Hier spricht nur einer! Die proletarische Staatsmacht! Also, Schnauze! Er wandte sich uns wieder zu: Ich hör noch immer nichts! – Nein! sagte Henri Janotta. – Was, nein? – Wir sind keine! – Was, keine? – Keine Umstürzler! – Ach! Und zu dritt mit’m Fahrrad nebenein­and­er? Obwohl Ausnahmezustand? Ich nenn das Angriff auf die Ordnung! Umsturz! Provokation! Hat bombig Spaß gemacht, Scheiben einzuschmeißen, wie? – Was für Scheiben? fragte Klaus Janotta unschuldig. – Nu, kommt, kommt! Stellt euch nicht dämlicher, als ihr seid! – Wir hatten Schule! sagte Henri. – Ach! Und danach? Immer schön mitmarschiert mit dem Mob! Arbeiterfeindliche Parolen gegrölt! Stimmt doch, oder? – Klaus Janotta stieß mich heimlich an. Ich verstand sofort, was er woll­te. Ein paar Wochen zuvor, anlässlich von Stalins Tod, hatte ich gewettet mit ihm, dass es mir gelingen würde, dicke Tränen rollen zu lassen. Und wirklich, als wir beim Fahnenappell im Geviert auf dem Schulhof standen, kullerten und kullerten sie. Wie hast du das gemacht, Mann? Zwiebeln! Hab mir saftige geraspelte Zwiebeln vorgestellt! – Was denn? Was denn? Jetzt wird auch noch losgeheult! Fehlt nur noch…! – Wir konnten gar nich mitmarschiern, schniefte ich, wir durften nich raus! Mutter hat uns…! – Seid wohl noch traurig drüber, was? – Nein, sagte ich. – Nein, sagten die Janottabrüder. – Menschens­kinder, um eure Zukunft geht’s doch! Solltet eurer Mutter dankbar sein! Vernünftige Frau das! Und jetzt ab nach Hause! Aber die Räder werd’n geschoben, klar? Ich hör nichts, Freunde! – Ja, murmelten wir. – Na, also!

Ja, das sei schlau gewesen! sagte Meister Lamprecht und nickte mir im Spiegel zu. Das sei sehr schlau gewesen von mir! Man könne den Mächtigen nur begegnen, wenn man mächtiger sei oder listig! Aber was den Hintergrund des siebzehnten betreffe – er beugte sich über mein Ohr und raunte, dieweil sein schnackernder Haar­schnei­deapparat die Rolle einer Wasserspülung übernahm – was den be­treffe, da sage er nur ein Wort: Geheimbünde. Die Bruderschaften. Die Großlogen der Freimaurer. Die Odd Fellows… Sie zögen an den Fäden, nach welchen getanzt werde. Sie seien die wirklichen Herren der Welt. Manchmal im verborgenen, manchmal ganz legal. Aber da seien sie stets. Den Eingeweihten durch gehei­me Zeichen und Losungen erkennbar. Ob mir schon aufgefallen sei, dass wildfremde Menschen sich manchmal anblickten, ein kurzer Blitz des Erkennens aufzucke und sogleich wieder größte Fremdheit herrsche? Ich schüttelte den Kopf. Dann werde es Zeit! Hundertlei Arten von Blicken gebe es: den verliebten, den freundschaftlichen, den interessierten, den ab­gestumpften, den ent­zückten, den erstaunten, den unsteten, den brennenden, den zugewandten, den abschätzenden, den vernichtenden – und diesen einen! Diesen Blick der Blicke! Diesen Blitz bruderschaftlichen Erkennens! Was auch geschehe auf dieser Welt, raunte er, ich könne sicher sein, es habe seinen Beginn und sein Ende im Zentrum dieser blickstiftenden Mächte! Kennen Sie denn einen, der so…? Aber woher denn! Auserwählte seien das! Nach Prinzipien, die völlig im Dunkeln blieben. Zudem verpflichtet zum absoluten Schweigen! Nein, nein! Kennte er einen, er wäre wohl längst kein Frisör mehr! Aber woher wissen Sie dann…? Nun, etwas sickere immer durch! Den Rest freilich könne man nur vermuten und erahnen! Manchmal, raunte er, manchmal frage er sich zum Beispiel, ob nicht Hitler ein Odd Fellow gewesen sei? Auserwählt, um Deutschland klein- und England und Amerika großzumachen? Na, und der siebzehnte Juni­!­ Viel­leicht sei der nichts anderes als das Resultat rivalisieren­der Bruderschaften, wo eine der andern habe Licht ans Fahrrad machen wollen? Oder eine längst gestiftete Weltloge, bestrebt aufzusteigen wie ein Phönix aus der Asche, habe versucht das herrschende Patt… jedenfalls, raunte er, ich könne sicher sein, es sei um mehr gegangen an diesem Tag, als um Spitzbart und ein paar Nor­men.

The Cost of Creating Objects in Java: A Quick Sanity Check

Experienced Java programmers are often careful not to create unnecessary objects. This is not about the overall object structure of an application, but about tight, inner loops, where careless programming can easily lead to huge numbers of objects being created and then thrown away in a very short time.

I got my fingers burned with this in the early days of Java, version 1.1 or 1.2, when I had to read a few million records from a text file and put them into an in-memory data structure. The loop went something like this:

while (true) {
  String line = input.readLine();
  if (line == null) break;
  StringTokenizer tok = new StringTokenizer (line, "");
  String s1 = tok.nextToken();
  String s2 = tok.nextToken();
  ...
}

You can see how each line is returned as a new String object, then a StringTokenizer is created for each line, and the individual tokens are returned as new, individual String objects again. For a few million input lines, that’s x-times-a-few-million temporary objects. On that ancient 1.1 or 1.2 JVM, the program would simply not finish, because those millions of objects flooded the heap and the garbage collector couldn’t keep up with it. So I rewrote my code to use a single byte array buffer and simply avoid the creation of objects whereever possible. Bam! it finished in a few seconds.

Things have changed a lot since then. The garbage collectors in a modern Java 6 or Java 7 VM are so good that they can easily deal with millions of temporary objects thrown at them. Still… you would think that creating an object, which means talking to heap management and getting some storage reserved, initializing it, etc. is not exactly a trivial operation, certainly more expensive than a method call or an integer increment? When optimizing a tight, inner loop, perhaps it might still be a good idea to avoid creating too many temporary objects…?

I looked around on the net and came across this entry on stackexchange where an innocent programmer asked pretty much the same question (“people told me I should avoid creating objects — really?”), to which he received an energetic, sarcastic lecture by another programmer to settle the issue once and for all:

Your colleague has no idea what they are talking about. Your most expensive operation would be listening to them, they wasted your time mis-directing you to information at least a decade out of date as well as you having to spend time posting here and researching the Internet for the truth.

Hopefully they are just ignorantly regurgitating something they heard or read from a decade ago and don’t know any better. I would take anything else they say as suspect as well, this should be a well known fallacy by anyone that keeps up to date either way.

[...]

Object creation in Java due to its memory allocation strategies is faster than C++ in most cases and for all practical purposes compared to everything else in the JVM can be considered “free”.

And another programmer went on:

Actually, due to the memory management strategies that the Java language (or any other managed language) makes possible, object creation is little more than incrementing a pointer in a block of memory called the young generation. It’s much faster than C, where a search for free memory has to be done.

Now that sounds intriguing (and a bit intimidating, I almost did not dare to even think about the question anymore after that lecture). Object creation is just a pointer increment nowadays?

I decided to do a quick sanity check — not an exhaustive, scientific study — based on what I happened to be working on at the moment. This comes from h3270, a web-to-host adapter I have been involved with for a number of years. The task at hand was to convert a hexadecimal representation of a UTF-8 character into a Java char (UTF-16). For example, the string “61″ would be converted to the character ‘a’, and “e282ac” to the euro sign ‘€’. This conversion would have to be done for each character on a terminal screen, altogether several thousand times per screen — so here’s our tight loop.

A naive approach is to create a byte array from the hex string and then to create a string from the byte array using the UTF-8 charset, from which we take the first (and only) character and return it (the function value() used below simply converts a hex digit into a number from 0 to 15):

public char decodeChar1 (String source) throws UnsupportedEncodingException {
  byte[] b = new byte[source.length() / 2];
  for (int i=0; i<b.length; i++) {
    int val = value(source.charAt(i*2)) * 16 + value(source.charAt(i*2+1) );
    b[i] = (byte)val;
  }
  return new String(b, "UTF-8").charAt(0);
}

This code creates two objects per call: the byte array b and the result string from which we return only the first character. If object creation were essentially free nowadays that would be fine, but it happens that Java offers a different API precisely to avoid creating these objects. Here’s another solution using a CharsetDecoder and re-usable buffers:

private CharsetDecoder charsetDecoder = Charset.forName("UTF-8").newDecoder();
private ByteBuffer codeBuffer = ByteBuffer.allocate(6); // max utf8 encoding length for a single character
private CharBuffer charBuffer = CharBuffer.allocate(1);

public char decodeChar2 (String source) {
  codeBuffer.clear();
  for (int i=0; i<source.length(); i+=2) {
    int val = value(source.charAt(i)) * 16 + value(source.charAt(i+1));
    codeBuffer.put((byte)val);
  }
  codeBuffer.rewind();
  charBuffer.clear();
  charsetDecoder.reset();
  charsetDecoder.decode(codeBuffer, charBuffer, true);
  charsetDecoder.flush (charBuffer);
  return charBuffer.get(0);
}

This code looks more complicated (and it is), but it avoids all object creations inside the method. (And if you walk through the library code you realize that actually both versions use the same API and the only meaningful difference is that the second version does not create any objects while decoding.)

Here are the running times for 10 million iterations on a 2 GHz Linux laptop under Java 1.4 and Java 6:

Java 1.4

Java 6

decodeChar1

9.5 s

2.8 s

decodeChar2

3.3 s

1.4 s

That is a factor of 2-3 between the version that creates objects and the version that doesn’t. We also see that the JVM has indeed become much better between Java 1.4 and 6, but it remains a fact that object creation is a non-trivial operation, certainly not comparable to a pointer increment or even a method call. A rough back-of-the-envelope calculation puts it somewhere in the 100 nanosecond range for this example, which is one or two orders of magnitude more than a pointer increment on a 2 GHz processor. (These numbers are consistent with what other people report for an object creation in Java, at least to the order of magnitude.)

In conclusion, it follows that:

  1. Yes, object creation has a non-trivial, measurable cost in Java, and avoiding object creation is therefore a reasonable optimization technique for tight, inner loops.

  2. This has hopefully been clear all along: For the large-scale structure of an object-oriented program, this is completely irrelevant. At the macroscopic level, structure is much more important than a few nanoseconds, and therefore objects should be used to the fullest degree everywhere, except in those tiny spots where nanosecond-level optimization really is relevant.

Nail me to the Past: Publishing and Updating your Tweet Archive

I have recently published my tweet archive here on this site (drmirror.net/tweets) and it has turned out to be one of the most useful online tools I’ve discovered in quite a while. Because I usually tweet about everything I find interesting, the archive is an excellent means (and sometimes the only means) to re-discover something I’ve come across in the past.

I have also promised I would update my tweet archive regularly (you can download a fresh one from Twitter once a week). When I tried this today for the first time, I realized the caching of Javascript pages can get in the way. Since the archive is implemented entirely in Javascript, browsers will not by themselves pick up the new version of the archive, not even if you restart the browser or hold shift while clicking the reload button. (Users would have to actually clear their entire browser cache to pick up the new archive version.)

The most elegant solution to this problem seems to be Google’s mod_pagespeed Apache module. It sits as an output filter in your web server and performs all sorts of optimizations on the content that it serves, including auto-versioning of Javascript modules. This way, you can simply upload and unpack a new version of your tweet archive on the server, and mod_pagespeed will magically make sure that updated Javascript modules will be renamed to force reloading of them by the client. It actually seems to work completely by itself, without any configuration of mod_pagespeed required. (At one point, when I tried going back and forth between versions of my tweet archive, it seemed the served content got out of sync, but I could fix that by clearing the mod_pagespeed cache under /var/cache/mod_pagespeed.)

Digitale Intimität

Seit etwa zwei Jahren lese ich fast ausschließlich digital. Ich habe dabei das eigenartige Gefühl, dass das Lesen intimer geworden ist, und insofern auch intensiver als in den Jahrzehnten vorher, in denen ich Papierbücher gelesen habe.

Es ist jetzt kein Gegenstand mehr da, der den Text verkörpern würde. Nur noch der Text selbst, der sich, aus dem Nichts kommend, flüchtig auf dem Display materialisiert. Es bleibt nur das von ihm, was in meinen Kopf gelangt.

The ultimate brainfuck.

Solange man einen Text mit einem physischen Gegenstand identifiziert, kann man ihn sich vom Leib halten. Zum Beispiel, indem man ihn ins Regal stellt. Das ist ähnlich wie das Aufschreiben von Terminen — in dem Moment, in dem man sie einem Notizbuch anvertraut, wird die eigene Erinnerung an sie einen deutlichen Grad schwächer.

Natürlich »gibt« es den digitalen Text auch außerhalb meines Kopfs. Es gibt ihn sogar in einer deutlich verfügbareren, mithin allgegenwärtigeren Weise als ein Papierbuch, nämlich im Netz, also jederzeit, an jedem Ort und mit jedem Gerät abrufbar. Dennoch — da lassen sich ein paar hunderttausend Jahre Menschheitsgeschichte wohl nicht so schnell abschütteln — ist ein physischer Artefakt auf eine völlig andere Art anwesend als das digitale Gewaber, das wir so gerade mit den Zehenspitzen zu betreten beginnen.

Die Intimität wird auch nicht dadurch aufgehoben, dass der systematische, erschließende Zugriff auf den Text ein paar deutliche Verbesserungen erfahren hat. In einem Papierbuch etwas anzustreichen, erschien mir immer barbarisch. Okay, in einem Taschenbuch vielleicht weniger, aber Taschenbücher sind ja für sich selbst schon barbarisch. Als digitaler Leser hingegen kann ich Passagen markieren und diese Markierungen rühren den Text selber nicht an, sie sind nur ein Layer, eine Schicht, die ich darüberlegen und bei Bedarf auch ausblenden kann. Und ich kann mir diese markierten Passagen in einer eigenen Auflistung anzeigen lassen, was sich als eine gute Technik erwiesen hat, etwas Gelesenes noch einmal Revue passieren zu lassen und sich so erneut gegenwärtig zu machen.

Um in der digitalen Intimität bestehen zu können, scheint mir außerdem ein digitales Bücherregal unabdingbar. Während es kaum dazu taugt, die Bücher durch bloßes Anschauen oder gar daran Riechen zu verehren, hilft es doch in einer deutlich funktionaleren, unbestechlicheren Weise dabei, einen Überblick über die eigenen Lesegewohnheiten und das erschlossene Terrain zu behalten.

Vielleicht sollten wir uns fragen, ob wir die Liebe zum Lesen nicht mit der Liebe zu den Büchern verwechselt haben, wie Dan Coxon kürzlich vermutete. Zuzutrauen wäre es uns. Wir haben so eine unausrottbare Schwäche, gute Dinge durch andere Dinge zu ersetzen, die etwas beeindruckender aussehen und dafür etwas weniger gut sind.

Ich bin, abschließend, froh, das Wort E-Book in diesem Text kein einziges Mal verwendet zu haben. Ich kann’s nämlich, ehrlich gesagt, nicht mehr hören. Können wir bitte einfach weiterlesen?

Housewarming

Nachdem Posterous in den nächsten Stunden abgeschaltet wird — eine Plattform, die ich nie besonders mochte, aber die mir vor ein paar Jahren immerhin über die Schwelle geholfen hat, mit dem Bloggen anzufangen — bin ich nun in die eigenen vier Wände umgezogen. Herzlich willkommen bei drmirror.net. Es ist alles noch etwas unordentlich hier, so als würden noch ein paar Umzugskisten herumstehen, aber die Texte der vergangenen Jahre sind alle da, und das wichtigste: Ihr seid hier.

Ein Glas Sekt müssen wir virtuell aufmachen (sic), aber was ich Euch anbieten kann, sind die Einträge aus diesem Blog, die mir bislang als die wichtigsten erscheinen, und die der eine oder andere vielleicht zum ersten Mal oder wiederlesen möchte. Meine Top 3:

Mein offener Brief an Michael Krüger vom letzten Sommer war der bislang weitreichendste Eintrag in diesem Blog, aber das war ein Brief und der war einer besonderen Situation geschuldet, darum gehört er nicht in die Liste dieser Top 3.

Ich gelobe außerdem, dass ich nicht lange in dieser Retrozität schwelgen werde. Es sind schon einige neue Sachen in Vorbereitung. Bitte justiert Eure Links und RSS-Empfangsgeräte.

Wie Nordkorea bei Nacht

Die Seite tweetping.net, die seit ein paar Tagen begeistert im Netz herumgereicht wird, bringt es an den Tag: Im Twitterlicht sieht Deutschland aus wie Nordkorea bei Nacht.

46

Tweetping zeigt, weltweit und in Echtzeit, eine Stichprobe aller Tweets an, die einen Geotag, also eine geografische Absendeadresse haben. Das haben Tweets nicht automatisch, man muß es ausdrücklich in den eigenen Twittereinstellungen aktivieren. Nur etwa ein Prozent aller weltweit versandten Tweets haben so einen Geotag.

Das Ganze ist grafisch wunderbar umgesetzt, und so macht das Zuschauen regelrecht süchtig. Man kann der Ostküste der USA beim Aufwachen zusehen, ein paar Stunden später die ersten, vereinzelten Tweets aus Alaska beobachten, die europäischen Großstädte der Lage nach erraten, und in Australien leuchten Brisbane, Sydney und Melbourne als kleine Funzeln am Rand eines großen, dunklen Kontinents.

38

Und Deutschland? Hm. Wer nach Mitteleuropa schaut, hat unweigerlich das Gefühl, dass hier irgendetwas komisch ist. Man muß schon ziemlich lange und sehr genau hingucken, um gelegentlich einen Tweet in Berlin, Hamburg oder Frankfurt aufblitzen zu sehen, während nebenan Großbritannien oder die Beneluxstaaten glühen, dass es fast die Pixel aus dem Bildschirm brennt. Das ganze erinnert frappierend an die Satellitenaufnahmen von Nordkorea bei Nacht, die einen dunkel ausgeschnittenen Fleck gleich über den gleißenden Lichtern von Seoul und unterhalb der chinesischen Provinzstädte im Norden zeigen. Eine politische Realität in optische Wellenlängen übersetzt.

08-north-korea-satellite-photo1

(Es sei mir ferne, mich hier über Nordkorea lustig zu machen; ich empfehle stattdessen sehr das erschütternde, aber auch wunderbare Buch von Barbara Demick, Nothing to Envy: Ordinary Lives in North Korea.)

Was sagt das Twitterlicht über Deutschland? Dass die drittgrößte viertgrößte Volkswirtschaft der Welt auf der Twitter-Landkarte so auffällig fehlt, muß systematische Gründe haben. Irgendetwas spezifisch Deutsches ist hier am Werk. Die allgemeine Twitterskepsis in Deutschland kann es alleine nicht sein; zwar ist es richtig, dass in Großbritannien etwa dreimal mehr aktive Twitternutzer sind als in Deutschland, aber der Intensitätsunterschied auf der Landkarte ist überproportional größer.

Nein, die Deutschen mögen offensichtlich das Geotagging nicht. Gehtniemandwasanvonwoichtwittere.

Das Argument, die Funktion sei zu tief in den Twittereinstellungen versteckt, so dass niemand darauf komme, zieht nicht. Denn das gilt für alle anderen Länder genauso. Die Karte von Tweetping zeigt nur den sehr kleinen Anteil (etwa 1%)  von Twitternutzern, die diese Einstellung ausfindig gemacht und bewußt aktiviert haben. Und solche Leute fehlen in Deutschland fast völlig, anders als zum Beispiel in Indonesien, wo Twittern mit Geotag fast schon zum guten Ton zu gehören scheint.

Ja, es ist wohl die international beispiellose Angst um die Privatsphäre, die in Deutschland offenbar so tief im Bewußtsein verankert ist, dass sie selbst in der technikaffinen Bevölkerungsgruppe der Twitternutzer offen zutage tritt.

Warum sind die Deutschen so? Ist es noch immer Hitler und der Zweite Weltkrieg, den wir da auf dem Bildschirm sehen? Es bedürfte mehr als dieses Blogartikels, um dieser Frage nachzugehen. Eins aber scheint sicher: Das wird sich so schnell auch nicht ändern. Ich will darum auch an niemanden appellieren oder zu irgendetwas aufrufen, sondern lediglich vier Gründe nennen, warum ich Geotagging für eine gute Sache halte.

  1. Der Ort, von wo eine Nachricht gesendet wird, ist ein wesentlicher Bestandteil dieser Nachricht, seine Angabe eine Art Unterton, der die Nachricht verortet und zur physischen Welt in Beziehung setzt. Briefeschreiber ahnten das noch, wenn sie schrieben: »Berlin, den 14.1.1962«.
  2. Twitter ist immer auch Menschheitsarchiv. Wer in den öffentlichen Raum, den Twitter darstellt, hineinspricht, macht eine öffentliche Äußerung, die unter verschiedensten Gesichtspunkten interessant sein und ausgewertet werden kann, von Epidemologie zu Linguistik zu Soziologie; Kriterien also, die der Absender beim Vor-Sich-Hintwittern aller Wahrscheinlichkeit nach überhaupt nicht im Blick hat. Geotagging ist eine entscheidende Information für solche Analysen; wer nicht geotaggt, beraubt die Wissenschaft einer wesentlichen Information.
  3. Das Argument »Aber es steht doch in meinem Profil« ist geschenkt. Ich seh’ schon, du hast keine Lust.
  4. Es sieht auf Tweetping schöner aus.

Und um Deutschland vielleicht noch einen winzigen Vorteil zu verschaffen gegenüber anderen Ländern, die sowas nicht haben, hier noch eine Anleitung, wie man das Geotagging aktiviert.

  1. Auf der Twitter-Hauptseite auf das Zahnrad oben rechts klicken, »Settings« auswählen (heißt bei deutschem Browser vermutlich »Einstellungen«).
    59
  2. Auf der Einstellungsseite findet sich im unteren Drittel die Option »Add a location to my tweets«.
    19
  3. Damit ist das Geotagging erst einmal grundsätzlich verfügbar. Es kann/muß aber für jeden einzelnen Tweet ausdrücklich eingeschaltet werden. In der Browser-Oberfläche gibt es dafür eine Schaltfläche mit einem Location-Symbol unter dem Tweeteingabefeld.
    34
  4. Damit in der Liste unter dem Tweeteingabefeld überhaupt Orte angezeigt werden können, kann es nötig sein, dem eigenen Browser zu erlauben, dem Twitter-Server den eigenen Standort mitzuteilen. Dazu erscheint beim ersten Auswählen der Funktion wahrscheinlich ein entsprechender Hinweis des Browsers, mit der Bitte, es zu bestätigen.
  5. Mobile Twitterclients für’s Smartphone haben in der Regel auch irgendein Location-Symbol im Tweeteingabefenster. Dieses Symbol muß man aktivieren. Ein mobiler Client wird dann in der Regel die genaueste, ihm verfügbare Position als Absendeort des Tweets angeben, während in der Web-Oberfläche nur eine städte-genaue Position ermittelt und dem Tweet mitgegeben wird.
    Screenshot_2013-02-01-08-58-44
  6. In der Web-Oberfläche wird bei einem empfangenen Tweet normalerweise nur dann ein Location-Symbol eingeblendet, wenn der Tweet per Smartphone eine genaue Koordinate erhalten hat. Falls der Tweet per Browser grob verortet wurde, sieht man diese Angabe nur dann, wenn man den Tweet »aufklappt«.