Hackety hack hack

Atypisches Nutzerverhalten mit Rat und Tat.

Hackerspaces im Landtag NRW

Am 15. Januar war ich eingeladen, zusammen mit Mic “nomaster” Szillat etwas zum Thema “Hackerspaces als neuer Kulturraum” zu erzählen und zwar im Ausschuss für Kultur und Medien des Landtags von Nordrhein-Westfalen. Auf die Tagesordnung des Ausschusses gesetzt wurde der Punkt von der Piratenfraktion im Landtag, darum bemüht hatte sich insbesondere Lukas “maltis” Lamla.

Unsere Präsentation vor dem Ausschuss ist als Google-Doc einzusehen.

So einen Programmpunkt in einem Landtagsausschuss gab es nicht zum ersten Mal, 2012 stellten Lars Weiler aka Pylon und Frank Rieger bereits Hackerspaces im Kulturausschuss des Abgeordnetenhauses von Berlin vor. Pylon hatte zu der Anhörung auch gebloggt.

Geplant und durchgeführt war die Präsentation als erster Aufschlag, um die Abgeordneten mit dem Thema vertraut zu machen. Dafür war es erfolgreich, so zumindest meine Wahrnehmung. Aus allen Parteien gab es ehrliches Interesse. Die Frage eines Abgeordneten der FDP, ob Hackerspaces als eine Art “anarchistische Volkshochschule” zu verstehen seien fand ich besonders originell und aufschlussreich. Insgesamt zeigte sich wohlwollendes Nicken in der Runde, besonders bei Themen, die bei der Durchschnittsbevölkerung noch als Science-Fiction verstanden werden (3D-Drucker) oder wenn es Anknüpfungspunkte zur Lebensrealität der Abgeordneten gab (Foodhacking, Theater in Hackerspaces). Aus dem Ministerium gab es nach der Präsentation Feedback und Interessensbekundungen.

Und jetzt? Jetzt gilt es, politische Ideen und vielleicht sogar ein actionable Item in Form eines Antrags aus dem zu machen, was in der Hackerspace-Bewegung an Ideen vorhanden ist. Hackerspaces sind sicher nicht so einfach zu fördern wie das Stadttheater um die Ecke, ihre extrem lockere (aber international vernetzte) Struktur, ohne “Bundesverband der Hackerspaces, Landeskammer NRW” macht es nicht einfach, einen Dialog zu führen — andererseits ist diese Struktur aber auch gerade die Stärke der Bewegung. Eine experimentelle Annäherung an Förderungsstrukturen für lose vernetzte Akteure im Bereich der elektronischen Kunst wurde bereits in Wien versucht. Netznetz Mana dient nach dem epischen Scheitern aufgrund von Ego-Inkompatibilitäten und eingestellter Förderung aber vielleicht eher als schlechtes Beispiel, aus dem wir lernen können…

Die Forschung zum Thema Kulturförderung von Hackerspaces hat gerade erst begonnen. Vermutlich ist das Katzenhüten hier eine Herausforderung, mit dem die Förderung der freiesten aller freien Theatergruppen nicht mal im Ansatz verglichen werden kann.

Mein Internet ist leer! Was könnte ich sonst noch lesen?

Zum Glück gibt es im Internet mehr als genug Links. Zum Lesen bleibt immer etwas. Es gäbe diesen Artikel darüber, warum sich die Elite im Silicon Valley neuerdings für das Bedingungslose Grundeinkommen interessiert:„Basic income, it turns out, is in the peculiar class of political notions that can warm Leninist and libertarian hearts alike. Though it’s an essentially low-tech proposal, it appeals to Silicon Valley’s longing for simple, elegant algorithms to solve everything. Supporters list the possible results: It can end poverty and inequality with hardly any bureaucracy. With more money and less work to do, we might even spew less climate-disrupting carbon.

Dann ist da noch ein Fanzine für Sci-Fi mit afrikanischer Perspektive: omenana aus Nigeria.

Dieser Text von Martin Fowler (der mit dem Refactoring) ist auch sehr lesenswert: DiversityMediocrityIllusion. „A common argument against pushing for greater diversity is that it will lower standards, raising the spectre of a diverse but mediocre group. To understand why this is an illusionary concern, I like to consider a little thought experiment.

Oder die Seite von afriLeaks: „afriLeaks allows you to leak confidential documents of public interest. We’ve designed a system that helps you to share these materials while protecting your own identity, making it very hard to identify you as the source of the leak. AfriLeaks is run by an alliance of African news organisations that are committed to speaking truth to power. You will be able to send us documents and select which of our member organisations should investigate it. This site also helps you to stay in touch and answer further questions without revealing your name or contact information.

Interessant ist auch dieses Experiment zu Urban Gardening und den Commons, über Schafe in der Stadt: Stadtschnuggen.

Vielleicht habt ihr ja schon den Artikel von Cory Doctorow gelesen „How Laws Restricting Tech Actually Expose Us to Greater Harm“ oder die New Clues von den Autoren des Cluetrain Manifesto. Wenn nicht, könnt ihr das nachholen.

Es gibt aber auch Lesestoff zur Urheberrechtsproblematik in der Modebranche: „The Piracy Paradox: Innovation and Intellectual Property in Fashion Design“. Und aus Polen stammt eine Textsammlung mit Zukunftsvisionen zum Immaterialgüterrecht: „Right to Culture: Future Scenarios“.

Bei so viel Stoff zum Lesen ist es ganz gut, dass die Zukunft zumindest in einem Bereich hoffnungsvoll aussieht: „Live for ever: Scientists say they’ll soon extend life ‘well beyond 120’“.

Einhegungen fallen nicht vom Himmel

Aaron Swartz starb heute vor zwei Jahren. Das Internet ohne Einhegungen auf Grundlage der Allmende war bereits schon dabei, parzelliert und eingezäunt zu werden.

Information is power. But like all power, there are those who want to keep it for themselves. The world’s entire scientific and cultural heritage, published over centuries in books and journals, is increasingly being digitized and locked up by a handful of private corporations. Want to read the papers featuring the most famous results of the sciences? You’ll need to send enormous amounts to publishers like Reed Elsevier.

There are those struggling to change this. The Open Access Movement has fought valiantly to ensure that scientists do not sign their copyrights away but instead ensure their work is published on the Internet, under terms that allow anyone to access it. But even under the best scenarios, their work will only apply to things published in the future. Everything up until now will have been lost.

That is too high a price to pay. Forcing academics to pay money to read the work of their colleagues? Scanning entire libraries but only allowing the folks at Google to read them? Providing scientific articles to those at elite universities in the First World, but not to children in the Global South? It’s outrageous and unacceptable.

Einhegungen, die aus einer Gemeinwirtschaft Privatbesitz schaffen, finden nicht über Nacht statt. In England begann die Transformation der Landwirtschaft im 16. Jahrhundert und war im 19. Jahrhundert abgeschlossen. Der Höhepunkt der Einhegungen lag zwischen 1760 und 1832, danach waren in Großbritannien die mittelalterlichen Strukturen so gut wie verschwunden, es gab das Konzept des gemeinwirtschaftlichen Landbesitzes nicht mehr.

Am Ende der Transformation war die Idee von Land, dass sich nicht in Privatbesitz befand, bereits so aus dem Bewusstsein verschwunden, dass der bloße Gedanke, über Privatgrundstücke könnten etwa Eisenbahnlinien geführt werden, von Liberalen als “Diebstahl” bezeichnet wurde.

George Orwell, der in einer Reihe von Kommentaren für die linksgerichtete Tribune in den 1940er Jahren davon schrieb, sah sich durch einen Kommentator eben dieses Vorwurfs ausgesetzt: Privateigentum an Land für die Allgemeinheit zu nutzen ist Diebstahl.

Daran zu erinnern, wie Landbesitz überhaupt zustande gekommen war, dass es kein vom Himmel gefallenes Naturrecht ist, sondern tatsächlich in einem Transformationsprozess mit Gewalt der Allmende entrissen wurde, war 1944 schon beinahe eine revolutionäre Aussage. Der englische Landadel hatte das Land der Gemeinwirtschaft schlicht unter sich aufgeteilt, mit keiner anderen Legitimation, als der, dass sie zur Durchsetzung ihrer Interessen Gewalt und Staat benutzen konnten. Die Grundlage der Agrarrevolution in England und Wales, die Verarmung der Landbevölkerung und die Freisetzung von Arbeitskräften für die Industrielle Revolution hatte keine andere Legitimation als die, dass die Interessengruppen des Landadels es einfach getan hatten.

If giving the land of England back to the people of England is theft, I am quite happy to call it theft. In his zeal to defend private property, my correspondent does not stop to consider how the so-called owners of the land got hold of it. They simply seized it by force, afterwards hiring lawyers to provide them with title-deeds. In the case of the enclosure of the common lands, which was going on from about 1600 to 1850, the landgrabbers did not even have the excuse of being foreign conquerors; they were quite frankly taking the heritage of their own countrymen, upon no sort of pretext except that they had the power to do so.

Erst sehr viel später setzte das Bewusstsein dafür ein, dass Wirtschaften mit Gemeingut nachhaltiger möglich ist. Elinor Ostrom, die 2009 als erste Frau den Alfred-Nobel-Gedächtnispreis für Wirtschaftswissenschaften für ihre Arbeiten zur Gemeinwirtschaft bekam, befasste sich mit der Frage, wie sich Menschen organisieren, um gemeinschaftlich komplexe Probleme zu lösen. Sie analysierte, wie institutionelle Regeln sich auf Handlungen von Individuen auswirken, die bestimmten Anreizen ausgesetzt sind, Entscheidungen treffen (müssen), und sich zudem noch gegenseitig beeinflussen, und sie zeigte praktikable, gerechte und effiziente Lösungen für diese Probleme auf.

In Brasilien oder Indien entstanden soziale Bewegungen, die sich der revolutionären Erkenntnis widmeten, dass Gemeingut eben nicht von Natur aus eingezäunt werden muss, sondern gemeinsam verwaltet und bewirtschaftet werden kann. Dabei geht es nicht mal um utopische Forderungen wie die Abschaffung von Privateigentum — dieses bleibt neben der Allmende bestehen. Es geht darum, gleichberechtigt einen Raum zu schaffen, in dem kollaborativ, verantwortungsvoll und gemeinsam an der Grundlage des gemeinsamen Überlebens gearbeitet wird und die Schaffung von Einhegungen für das, was vorher nicht eingehegt war, nicht zu ohne Argumente zu akzeptieren.

Dem Internet und der Wissensallmende drohen Einhegungen, die von Landadeligen des 12. Jahrhunderts schrittweise vorgenommen werden, mit keinem anderen Argument als dem, dass es ihnen möglich ist. In Deutschland wurden Hecken und Grenzsteine etwa ab 2004 beim sogenannten Zweiten Korb der Urheberrechtsreform gesetzt, durch den die Rechte der Nutzerinnen und Nutzer eingeschränkt wurden und das Recht auf Privatkopie entstellt wurde. Das Leistungsschutzrecht für Presseverleger ist eine Einhegung der Wiesen und Felder der Allmende im Internet mit keinem anderen Argument als dem, dass es eben mit Lobbyarbeit von Verlagen wie der Axel Springer SE möglich ist, diese als Gesetz durchzusetzen.

Es gibt keinen naturgegebenen Grund dafür, die Allmende zu zerstückeln und einzuhegen, wenn wir sie auch gemeinsam beackern können. Wir können mit Elinor Ostrom wirtschaftswissenschaftlich zeigen, dass Zusammenarbeit möglich und nachhaltig ist und moralisch ist das Argument “Ich kann es euch wegnehmen, weil ich es euch weggnehmen kann” einem kulturoptimistischem gemeinschaftlichen Wirtschaften nicht überlegen.

Im schlimmsten Fall sind Einhegungen tödlich. Am zweiten Todestag von Aaron Swartz lohnt es sich daran zu erinnern, dass durch Einhegungen der Wissensallmende einem großen Talent die Luft zum Atmen genommen wurde. So wie für den Suizid von Alan Turing die menschenverachtenden homophoben Gesetze der damaligen Zeit und die, die sie geschaffen haben, politisch verantwortlich sind, ist der Wahnsinn der Urheberrechtsextremisten verantwortlich für Aarons Tod. Copyright kills. An den Händen der Urheberrechtsextremisten klebt sein Blut.

Vollkommen subjektive Auswahl — was ich mir auf dem #31c3 ansehen werde (wenn ich dazu komme)

Der 31. Chaos Communication Congress naht. Das Programm ist prall gefüllt mit wirklich hervorragenden Vorträgen und anderen Events. Aus Erfahrung kann ich sagen, dass es trotzdem schwierig ist, den Congress zum Anhören von Vorträgen zu planen, dafür passiert an allen Ecken einfach zuviel. Spätestens am zweiten Tag schmeisst man das sorgsam ausgearbeitete Programm über den Haufen und bleibt in einer Ecke kleben, wo verrückte Menschen gerade an etwas arbeiten, was unbeschreiblich ist und trotzdem hat man einen Congress erlebt, der unvergleichlich ist. Vielleicht ist es wichtiger, sich mit der Checkliste der mitzubringenden Sachen zu beschäftigen, als mit dem Programm. Da Vorträge aufgezeichnet werden, kann man sie später ja noch nachschauen — allerdings könnte das gleich zum nächsten Trugschluss werden: Wenn die “schau ich mir lieber in der Aufzeichnung an”-Liste zu lang wird, ist es dann auch wieder Dezember 2015, bis man sie durch hat.

That being said: Eine kleine Auswahl von Vorträgen, die ich in Erwägung ziehe, folgt. Große, für viele sozial wichtige Veranstaltungen (Jahresrückblicke etc.) habe ich erstmal nicht aufgeführt.

Tag 1

Die Keynote von Alec Empire versuche ich mir mal anzusehen. Wird bestimmt hyperreal und noisy. Von Alec Empire stammte schon die Musik zum Trailer vom letzten Jahr.

Dann gehe ich in Saal 2, zu Trustworthy secure modular operating system engineering von hannes und David. Hannes träumt seit ein paar Jahrzehnten vom Ausstieg aus der Unix-Technologie weltweit und jetzt sieht es so aus, als könnte es was werden, mit einem Betriebsystem, dass die Schwächen von C hinter sich lässt, indem es konsequent in OCaml implementiert wird. Diesmal ist es kein wilder Traum, sondern tatsächlich etwas, was u.a. mit Unterstützung der Uni in Cambridge echten Wumms erzeigen könnte.

Danach folgt das Zentrum für politische Schönheit: Mit Kunst die Gesellschaft hacken, also die mit den Mauerkreuzen an der EU-Aussengrenze und der Belohnung von 25.000€ für die Verhaftung der Eigentümerfamilie der Firma Krauss-Maffei Wegmann.

Parallel dazu findet ein Vortrag statt, den ich dadurch erst später sehen kann: Let’s build our own personalized open textile production line. Schade, denn Open Source auf andere Bereiche der Ökonomie übertragen ist ein richtig spannendes Thema.

Ganz, ganz dick im Kalender steht bei mit der Vortrag zu Jugend hackt, nicht nur, weil ich in den letzten beiden Jahren das Projekt als Mentor mitbegleitet haben, sondern auch, weil ich alle Vortragenden total toll finde.

Später am Abend werde ich vielleicht bei Crypto Tales from the Trenches reinschauen, wo u.a. Laura Poitras davon berichtet, wie sie sich als Journalistin im direkten Kontakt mit Edward Snowden vor Ausspähung versuchte zu schützen. Anschliessend wird ihr Film CITIZENFOUR gezeigt.

Tag 2

Vermutlich werde ich in Programming with dependent types in Idris gehen, weil ich eine Schwäche für Forschung im Bereich Programmiersprachen habe (und wir das Thema im Curry-Buch auch kurz anscheiden). Allerdings läuft parallel Security Analysis of Estonia’s Internet Voting System. Hm, mal sehen.

Klar ist dann allerdings Das Transparenzportal Hamburg. Mit dem Hamburger Transparenzgesetz hatte ich ja auch schon Erfahrungen gemacht.

Später dann: Fernvale: An Open Hardware and Software Platform, Based on the (nominally) Closed-Source MT6260 SoC, was ich hauptsächlich auf dem Zettel habe, weil der Open-Hardware-Aktivist bunnie vorträgt und ich sein Projekt zum offenen Laptop so spannend finde.

Tag 3

An Tag 3 tritt das c-atre auf, was ich mir an dem Tag zwischen Lampenfieber und Rumgerenne überhaupt ansehen kann, wird sich zeigen. Unser Stück zu Urheberrecht und Zeitreisen The Time is Right gibt es am Abend, davor ist aber noch reichlich Programm.

Correcting copywrongs von meiner Lieblings-Abgeordneten im EU-Parlament ist gesetzt. Wird der Hammer.

“Exploit” in theater klingt nicht uninteressant und hat auch was mit Theater zu tun, wenn es klappt, dann schau ich mir das vielleicht an.

IFG – Mit freundlichen Grüßen, völlig angemessen in Saal 1, könnte ein Knüller werden. Letzter Jahr startete nach dem Congress-Vortrag von Stefan Wehrmeyer die Debatte um das Zensurheberrecht. Ich erwarte eine ähnliche Bombe dieses Jahr :)

Dann ist Theater. Parallel zu unserer Aufführung gibt es einen Vortrag zu Computer und Informatik in Nordkorea, den ich dann wohl als Aufzeichnung sehen werde.

Tag 4

The rise and fall of Internet voting in Norway klingt interessant, wenn ich um die Uhrzeit schon aufnahmefähig bin.

Attribution revolution ist für mich auch beruflich ein Must. Mal sehen, ob sich Ideen aus dem Vortrag für ein Projekt bei uns nutzen lassen.

Dann habe ich noch das Closing Event auf dem Zettel. Und natürlich Party.

Wird das alles klappen? Ich fürchte nicht. Aber aufgeregt bin ich schon beim Durchsehen des Programms…

Links, frische (und halbfrische) Links!

Was gibt es hier zu sehen? Mediawiki APIs hacken

Chantek ist ein besonderer Orang-Utan. Im Yerkes Regional Primate Research Center geboren lernte er innerhalb eines Forschungsprojektes mittels der amerikanischen Gebärdensprache (ASL) mit Menschen zu kommunizieren und gesprochenes Englisch zu verstehen, Grundlagen des Umgangs mit Geld und Spiele. Mit fünfeinhalb Jahren wurde ihm der Stand eines etwa zweijährigen Kindes attestiert, wobei er in einigen Bereichen (z. B. Sprachverständnis und Werkzeugnutzung) die Fertigkeiten eines vierjährigen Kindes aufwies. Über Chantek gibt es in der Wikipedia noch mehr zu lesen, als ich hier zitiert und zusammengefasst habe.

Chantek ist aber auch der Name eines Hacks, der auf dem Mediawiki Hackathon 2014 in Amsterdam von Hay Kranen gebastelt wurde. Auf Niederländisch heisst “Api” auch Affe. Eine API, die menschliche Sprache (zumindest ein bisschen) versteht, ist gut geeignet, um nach dem sprechenden Affen Chantek benannt zu werden.

Über die Mediawiki API habe ich im letzten Blogbeitrag bereits eine umfassende Einführung geschrieben. Chantek vereinfacht diese API auf besonders schlanke Weise und macht die Unterhaltung ein bisschen angenehmer. Um Properties bei Wikidata abzufragen und Titel darzustellen, brauche ich bei der klassischen Mediawiki API zu Wikidata typischerweise mehrere API-Calls. Bei Chantek kann ich zum Beispiel sagen, dass mich nur Abfrageergebnisse auf Deutsch interessieren und ich bekomme die Werte dann auch mit ihrer deutschen Bezeichnung zurück.

Über die Grenzen der Same-Origin-Policy hinweg mit CORS

Chantek ist eine Python-Anwendung, die die CORS-Spezifikation implementiert, um JavaScript-Anwendungen in Web-Anwendungen zu ermöglichen, Daten auszulesen und darzustellen. Normalerweise gibt es bei JavaScript im Browser die Same-Origin-Policy, die verhindert, dass Daten aus beliebigen (und damit potenziell unsicheren) Quellen einfach so nachgeladen werden können: Clientseitiges JavaScript kann nur auf Daten der Domain zugreifen, woher auch das JavaScript selbst geladen wurde. Bei API-Calls stellt sich diese Maßnahme als gelinde gesagt schwierig dar. Um diese Beschränkung zu umgehen, gibt es zum Beispiel JSONP, das aber selbst nicht unproblematisch ist. CORS ist eine Möglichkeit, die Grenzen der Same-Origin-Policy zu überschreiten, die auch Authentifizierung und feinere Sicherheitsabstufungen beinhaltet und vom W3C spezifiziert wurde.

Leider ist CORS nicht in allen Browsern vorhanden. Wie man browserunhabhängig prüft, ob CORS zur Verfügung steht (bei den meisten modernen Browsern ist das der Fall), zeigt etwa dieses Tutorial von Monsur Hossain und der darin benutzte Code:

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
function createCORSRequest(method, url) {
  var xhr = new XMLHttpRequest();
  if ("withCredentials" in xhr) {
    // Check if the XMLHttpRequest object has a "withCredentials" property.
    // "withCredentials" only exists on XMLHTTPRequest2 objects.
    xhr.open(method, url, true);
  } else if (typeof XDomainRequest != "undefined") {
    // Otherwise, check if XDomainRequest.
    // XDomainRequest only exists in IE, and is IE's way of making CORS requests.
    xhr = new XDomainRequest();
    xhr.open(method, url);
  } else {
    // Otherwise, CORS is not supported by the browser.
    xhr = null;
  }
  return xhr;
}

Zeig mir meine Umgebung, Wikidata!

Mit Chantek (und CORS) wollte ich eine JavaScript-Webanwendung schreiben, die mir anzeigt, was es in Wikidata um mich herum an geogetaggten Wisssensgegenständen gibt. In Berlin (zumindest innerhalb des S-Bahn-Rings) ist das einiges — viele interessante Orte sinde nur ein paar Hundert Meter weit entfernt und haben einen Wikipedia-Artikel. Auf dem Land müsste ich meine Anwendung vermutlich ein bisschen erweitern: ein Radius von 500m ist nicht besonders üppig für manche Gegenden. Auch, dass ich Wissensgegenstände nur auf Deutsch suche und Artikel in der deutschsprachigen Wikipedia dazu anzeige, könnte eine überarbeitete Version meiner Anwendung als Parameter änderbar machen.

Als kleiner, schneller Hack zwischendurch, aufgespielt auf einen Webserver, hat mir meine Anwendung aber durchaus Spaß bereitet. Mit dem Mobiltelefon kann ich so schauen, was Wikidata für meine Umgebung anzeigt.

Ein API-Call, um Dinge im meiner Umgebung zu finden, kann mit Chantek etwa so aussehen:

 
http://chantek.bykr.org/wikidata/query?q=around[625,52.205,0.119,15]

Hiermit frage ich Chantek (über die WikidataQuery-API) nach Wikidata-Wissensgegenständen im Umkreis von 15km um Cambridge in England: der erste Parameter (625) bezieht sich auf den Planeten, für den die Koordinaten gelten (Erde), die nächsten zwei sind die Koordinaten von Cambridge und mit 15 gebe ich den Radius an. Auch Brüche sind bei der Angabe des Radius möglich, 0.5 ist also 500m.

Jetzt fehlen mir nur noch meine aktuellen Koordinaten. Moderne Browser unterstützen das HTML5-Feature Geolocation, mit der JavaScript-Bibliothek Modernizr kann ich überprüfen, ob dieses Feature vorhanden ist. Da es Privatsphärenbedenken bei der Abfrage von Geokoordinaten gibt, muss der Browser bei der ersten Abfrage der Koordinaten des Standorts von einer neuen Seite die Benutzerin oder den Benutzer fragen, ob das so in Ordnung ist. Wenn zugestimmt wird, können wir die Koordinaten benutzen, eine Abfrage starten und bekommen eine Liste von Wikidata-Items zurück. Tatsächlich erzeugen wir zuerst einen CORS-Request und als Callback-Funktion geht es gleich in die nächste Abfrage, denn wir wollen ja für jedes Element der Liste einen Titel und eine Wikipedia-Seite haben. Das könnte zum Beispiel so aussehen:

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
function locate_me() {
    // Check if we can do HTML5 geolocation
    if (Modernizr.geolocation) {
       navigator.geolocation.getCurrentPosition(function (position) {
          var lat = position.coords.latitude;
          var lon = position.coords.longitude;
          var chantek = "http://chantek.bykr.org/wikidata/";
          // Query data around me
          var query = "query?q=around[625," + lat + "," + lon + "," + "0.5]&callback=?";
          var query_xhr = createCORSRequest('GET', chantek+query);
          if (!query_xhr) {
            throw new Error('CORS not supported');
          }
          query_xhr.onload = function(){
            var response = query_xhr.responseText;
            var data = $.parseJSON(response).response;
            $.each(data, function(index, value) {
              // Call queried entities and display them
              var entity = "entity?q=Q"+ value + "&lang=de&callback=?";
              var entity_xhr = createCORSRequest('GET', chantek+entity);
              entity_xhr.onload = function(){
                var response = entity_xhr.responseText;
                var data = $.parseJSON(response).response;
                $("#location-list").append(
                    "<li>" +
                    "<big>" +
                    "<a href=" + "\"" +
                    data[Object.keys(data)[0]].sitelinks.de.url +
                    "\">"+
                    data[Object.keys(data)[0]].labels +
                    "</a>" +
                    "</big>" +
                    "</li>"
                );
              };
              entity_xhr.onerror = function() {
                throw new Error('Error making the request');
              };
              entity_xhr.send();
            });
          };
          query_xhr.onerror = function() {
            throw new Error('Error making the request');
          };
          query_xhr.send();
    });
  } else {
      throw new Error('Geolocation not supported');
  }
}

Der fertige Hack

Mit ein bisschen UI und HTML drumherum habe ich diesen kleinen Hack unter http://www.johl.io/aroundme-wikidata/ ins Netz gestellt. Ich wünsche viel Spaß!

In der Nähe des U-Bahnhofs Eberswalder Straße in Berlin sieht das auf meinem Mobiltelefon etwa so aus:

Die Cola oder das Cola? Mediawiki APIs hacken

Die Web-API von Mediawiki (und damit von den meisten Wikimedia-Projekten) ist zwar nicht gerade versteckt, aber meiner Meinung nach viel zu unbekannt. In loser Folge werde ich ein paar Hacks mit APIs für verschiedene Projekte vorstellen, auch um dazu anzuregen, selbst mit der Infrastruktur zu spielen.

Die Web-API von Mediawiki

Mediawiki hat eine RESTful Web-API. Leider ist API im Mediawiki-Umfeld ein mehrfach belegtes Wort, so dass es auch eine API gibt, um eigene Erweiterungen in PHP zu schreiben; diese API meine ich in dem Fall nicht, sondern die Schnittstelle, mit der sich Daten und Inhalte per HTTP aus Mediawiki holen lassen.

Zunächst gibt es da einen Endpunkt. Bei den Wikimedia-Projekten liegt dieser unter /w/api.php, bei dem unten benutzten Wiktionary also unter https://de.wiktionary.org/w/api.php. Praktischerweise ist der Endpunkt für die API-Calls auch gleich eine URL zur Dokumentation. Einfach den Endpunkt im Browser eingeben es erscheint eine Seite, auf der die möglichen Calls verzeichnet sind und auch mit Beispielen erklärt werden.

Ein vollständiger API-Call könnte etwa so aussehen:

https://de.wiktionary.org/w/api.php?format=json&action=query&prop=revisions&rvprop=content&titles=Cola

Schauen wir uns den API-Call mal genauer an und zerlegen ihn in seine Einzelteile.

Das Format für die Serialisierung

format=json

Hiermit sagen wir dem Wikimedia-Web-Service, dass wir den Rückgabewert gern als JSON formatiert bekommen wollen. Alternativ können wir zur Anzeige im Webbrowser das auch schön formatiert mit dem Aufruf format=jsonfm bekommen – das ist manchmal für das Debugging übersichtlicher und hilfreicher. Die API unterstützt noch andere Ausgabeformate wie WDDX, XML, YAML und eine native PHP-Serialisierung, aber möglicherweise werde diese in Zukunft nicht mehr bedient. JSON wird stark präferiert und sollte wenn immer möglich benutzt werden.

Die Action

action=query

Die “Action”, also sozusagen das Verb, ist der eigentliche Befehl, der aufgerufen wird. Es gibt etliche solche Actions, die in der Mediawiki-API dokumentiert sind, Extensions können noch weitere Actions hinzufügen, die Actions zu Wikidata etwa beginnen mit “wb” für Wikibase. Hier benutzen wir queryzur Abfrage von Daten.

Die Action query ist selbst wieder umfangreich dokumentiert, wir schauen uns hier ein paar beispielhafte Parameter an.

Action-spezifische Parameter

titles=Cola

Wir fragen hier die API nach den Daten einer Wiki-Seite mit dem Titel “Cola”. In der Abfrage werden Titel URL-kodiert, wenn der Titel also ein Leerzeichen enthält, wird dieses zu %20. Wenn mehrere Seiten gleichzeitig abgefragt werden können (und sollten) sie kombiniert werden, um nicht durch mehrere Abfragen hintereinander die Netzwerklast unnötig zu erhöhen: titles=PageA|PageB|PageC

prop=revisions

Mit diesem Parameter können wir eine Revision der Seite angeben. Wenn wir keine weiteren Informationen zur Revision angeben bekommen wir die aktuelle Version der Seite.

rvprop=content

Mit diesem Parameter sagen wir der API, dass wir den Inhalt der Seite haben wollen. Hätten wir stattdessen zum Beispiel rvprop=content|user angegen, bekämen wir den Inhalt un den Benutzer, der die letzte Änderung vorgenommen hat.

Es gibt über die API und mögliche Parameter und Actions noch viel mehr zu sagen, aber als Beispiel reicht das erstmal. Die Dokumentation zur API ist noch viel umfangreicher. Ein guter Einstiegspunkt ist die Dokumentation auf Mediawiki, die ich hier teilweise übersetzt habe.

Eine gute Einführung in die API gibt es auch als Video:

Artikel von Substantiven mit migrationsschatten.py abfragen

Als erstes Beispiel für eine Spielerei mit der API geht es um Zweifelsfragen der deutschen Sprache. Eine sehr gute Freundin von mir, beneidenswert bilingual aufgewachsen mit Deutsch und Englisch als Muttersprache, erzählte mir vor einiger Zeit davon, dass sie dann doch manchmal überrascht sei, welches grammatikalische Geschlecht und damit welchen Artikel ein Wort im Deutschen hat: Der Knoblauch? Ernsthaft?”. Wie gesagt, es handelt sich bei ihr um eine Muttersprachlerin, aber diesen Einwand wischte sie schnell beiseite mit “Ach, das ist eben mein Migrationsschatten”.

Das Problem ist aber häufig genug, um sich hinzusetzen und ein kleines Programm zu schreiben, das Wiktionary nach dem korrekten Artikel befragt. Heisst es “der Laptop” oder “das Laptop”? Und was war mit der Werbung einer österreichischen Energydrink-Marke, die von “das Cola” sprach? Ist das korrekt?

Das Progrämmchen ist ein bisschen älter, aber ich habe es seitdem ein bisschen poliert und umgeschrieben. Die Freundin mit der Frage nach den Artikeln benutzt es nach eigener Aussage regelmäßig. Im Original ist es als gist auf Github verfügbar, aber gehen wir das Programm doch mal der Reihe nach durch:

 
 
 
 
 
from __future__ import print_function
import json
import re
import sys
import urllib2

Es beginnt mit ein paar Imports. Das Programm ist für Python 2.7 geschrieben, eine Portierung nach Python3 lasse ich mal als Aufgabe für die Leserin oder den Leser (urllib2 und json bräuchten dafür Liebe, die über die automatische Portierung mit 2to3 hinausgeht).

 
 
 
if len(sys.argv) < 2:
    sys.exit('Abfrage mit: %s Substantiv' % sys.argv[0])
substantiv = sys.argv[1]

Wenn kein Substantiv angegeben ist, ist die ganze Sache auch schon vorbei, ansonsten nehmen wir an, dass der erste Kommandozeilenparameter das gesuchte Substantiv ist.

 
 
 
 
 
 
 
 
 
 
 
 
try:
    r = urllib2.urlopen(
        'http://de.wiktionary.org/w/api.php?' +
        'format=json' +
        '&action=query' +
        '&prop=revisions' +
        '&rvprop=content' +
        '&titles=' +
        substantiv
        ).read()
except urllib2.URLError, e:
    sys.exit('Problem beim Zugriff auf Wiktionary.')

Wir basteln uns die API-Anfrage zusammen. Oben ist erklärt, wieso die Abfrage so aussieht, wie sie aussieht. Wenn die Abfrage über das Internet nicht klappen sollte, brechen wir hier ab.

 
 
 
 
 
 
 
content = json.loads(r)
page = content['query']['pages'][content['query']['pages'].keys()[0]]
if 'revisions' not in page.keys():
        sys.exit(
            'Substantiv nicht im deutschsprachigen Wiktionary verzeichnet.'
        )
wikitext = (page['revisions'][0]['*'])

Der Seiteninhalt wird als JSON eingelesen und in eine Python-Datenstruktur hineingeschlürft. Wenn es keine Seite mit dem Titel gibt, der gewünscht ist, brechen wir ab. Python kennt schließlich keine Autovivication bei Collections, also passen wir auf wie ein Luchs, dass wir nicht auf eine Struktur zugreifen, für die es keinen Key gibt.

 
 
 
 
 
 
 
 
match = re.search(
    '===\s?,\s?' +
    '' +
    '(,\s?(,\s?)?)*' +
    '\s?===',
    wikitext)
if match is None:
    sys.exit('Kein Substantiv!')

Es folgt eine epische regular expression, mit der der Wikitext geparst wird. Leider wird im Wiktionary nicht ganz durchgängig dasselbe Pattern für die Angabe des grammatischen Geschlechts genutzt. Aber irgendwie sowas wie “m” oder “mf” oder “m,f,n” steht hinter einer Template-Variable, die ein Substantiv bezeichnet. Wenn nicht mal dieses Pattern gefunden wird, ist der Suchstring wohl kein Substantiv und wir verabschieden uns aus dem Programm.

 
 
genera = filter(lambda x: re.match('^[mfn]$', x),
                filter(lambda x: x is not None, match.groups()))

Wir filtern aus den capturing brackets alles heraus, was nicht “m”, “f”, oder “n” ist. Ich finde da eine Lösung mit zwei Filtern (und anonymen Lambda-Funktionen) am elegantesten, aber das ist natürlich Geschmackssache.

 
 
 
 
m = ["der " + substantiv for genus in genera if genus == "m"]
f = ["die " + substantiv for genus in genera if genus == "f"]
n = ["das " + substantiv for genus in genera if genus == "n"]
artikel = m + f + n

Mit ein paar list comprehensions bauen wir uns drei Listen mit den gefilterten Ergebnissen, die wir dann zu einer flachen Ergebnisliste vereinigen (artikel). Natürlich kann ein Substantiv mehr als ein grammtisches Geschlecht und damit mehr als einen gültigen Artikel haben.

Warum basteln wir uns eine Liste? Nun, darum:

 
map(print, artikel)

Lieber ein gedingenes map auf eine Liste als eine for-Schleife. Da wir print als Funktion benutzen können (wir haben extra from __future__ import print_function benutzt), können wir diese Funktion auf alle möglichen Ergebnis-Strings anwenden.

Was gibt dieses Programm jetzt aus? Nun, schauen wir mal:

 
 
python migrationsschatten.py Knoblauch
der Knoblauch

oder auch:

 
 
 
python migrationsschatten.py Ketchup
der Ketchup
das Ketchup

oder gar:

 
 
 
 
python migrationsschatten.py Joghurt
der Joghurt
die Joghurt
das Joghurt

Und was ist mit der Frage aus der Überschrift?

 
 
 
python migrationsschatten.py Cola
die Cola
das Cola

So seltsam das für bundesdeutsche Sprecherinnen und Sprecher klingen mag, das Cola ist okay, sagt Wiktionary. Es handelt sich um einen Austriazismus.

Leiwand!

Wie bereits gesagt, das vollständige Programm findet sich hier.

Links, Links, Links