DBus mit Python

DBus ist der Quasi-Standard für Interprozesskommunikation zwischen Applikationen und System unter Linux. Möchte man, dass eine Applikation eine Systembenachrichtigung anzeigt oder Informationen von einem Dämon wie dem NetworkManager lädt, muss man auf DBus zurückgreifen. Es existieren mehrere Python-Wrapper für DBus, die Dokumentation ist jedoch wie so oft lückenhaft und nicht selten veraltet. Ich präsentiere hier meinen Ansatz ohne den Anspruch zu erheben, dass dies der beste Ansatz ist. Zumindest wird aber mein Beispiel anderen Einsteigern helfen und die hinzugefügten Links sollten die Zeit für die Suche nach nutzbarer Doku verkürzen.

Eine Einführung in das Konzept und die Begrifflichkeiten gibt es beim KDE-Projekt. Eine Übersicht verfügbarer Implementierungen gibt es hier. Nicht weniger als fünf Implementierungen für Python stehen zur Verfügung, aber für viele davon ist keine nutzbare Dokumentation vorhanden.

In meinem Beispiel gibt es einen Dämon im Userspace, der für einen Client Services zur Verfügung stellt. Die Services sollen letztendlich als HTTPS-Requests übers Internet abgewickelt werden (was im Beispiel nicht umgesetzt wird), sodass wir davon ausgehen müssen, dass sie relativ lange dauern. Der Client soll also den Dämon per DBus-Message nach Informationen fragen können, die dieser dann irgendwann später liefert. Währenddessen soll der Client nicht blockieren, damit während des laufenden Requests weiter Usereingaben möglich sind.

Ich habe mich für dbus-python entschieden, da diese Implementierung sowohl Python2 als auch Python3 unterstützt und eine einigermaßen brauchbare Doku besitzt. Das Tutorial dort baut auf Python2 auf, ich habe jedoch die Beispiele nach Python3 portiert. Da die Original-Beispiele im Tutorial nicht verlinkt sind, kann man einige Schritte mit der Beschreibung allein kaum nachvollziehen. Glücklicherweise konnte ich die Beispiele funden:

Mein Anwendungsfall entspricht recht genau dem Service-Beispiel mit dem Async-Client. Wer also lieber Python2 nutzen möchte sollte sich lieber direkt an der Vorlage orientieren. Wer wie ich Python3 einsetzen will, findet mit meiner Anpassung ein funktionierendes Beispiel.

Der Dämon

     #!/usr/bin/env python3
     import dbus
     from dbus.service import BusName
     from dbus.mainloop.glib import DBusGMainLoop
     from gi.repository import GObject


     class DemoException(dbus.DBusException):
         _dbus_error_name = 'de.pinyto.daemonException'


     class BackofficeInterface(dbus.service.Object):

         @dbus.service.method("de.pinyto.daemon.backoffice",
                              in_signature='s', out_signature='as')
         def HelloWorld(self, hello_message):
             print(str(hello_message))
             return ["Hello", " from example-service.py", "with unique name",
                     session_bus.get_unique_name()]

         @dbus.service.method("de.pinyto.daemon.backoffice",
                              in_signature='', out_signature='')
         def RaiseException(self):
             raise DemoException('The RaiseException method does what you might '
                                 'expect')

         @dbus.service.method("de.pinyto.daemon.backoffice",
                              in_signature='', out_signature='(ss)')
         def GetTuple(self):
             return ("Hello Tuple", " from pinytod.py")

         @dbus.service.method("de.pinyto.daemon.backoffice",
                              in_signature='', out_signature='a{ss}')
         def GetDict(self):
             return {"first": "Hello Dict", "second": " from pinytod.py"}

         @dbus.service.method("de.pinyto.daemon.backoffice",
                              in_signature='', out_signature='')
         def Exit(self):
             mainloop.quit()


     if __name__ == '__main__':
         DBusGMainLoop(set_as_default=True)

         session_bus = dbus.SessionBus()
         name = dbus.service.BusName("de.pinyto.daemon", session_bus)
         backoffice_interface = BackofficeInterface(session_bus, '/Backoffice')

         mainloop = GObject.MainLoop()
         print("Pinyto daemon is running.")
         mainloop.run()

Um zu erklären, was hier passiert beginnen wir mit der Initialisierung nach

     if __name__ == '__main__':

Da der Dämon mit asynchronen Requests hantieren muss und dabei nicht blockieren soll, muss eine MainLoop eingerichtet werden. Diese checkt auf resourcenschonende Art nach Neuigkeiten und koordiniert die richtige Ausführung. Es ergibt keinen Sinn mehr als eine MainLoop zu haben, weshalb man der DBus Schnittstelle mitteilen kann, dass die Glib MainLoop die wir benutzen der Default sein soll. Prinzipiell sollte glib-python mit verschiedenen MainLoops funktionieren, ich konnte jedoch nur zur GLib MainLoop ein funktionierendes Beispiel finden.

Bevor die MainLoop gestartet werden kann, müssen aber noch einige Dinge initialisiert werden. Zunächst brauchen wir einen Bus. DBus bietet immer zwei Standard-Busse, den SystemBus und den SessionBus. Der SystemBus dient zur Kommunikation mit Systemdiensten wie dem NetworkManager, der SessionBus zur Kommunikation von Programmen eines angemeldeten Benutzers untereinander. Da sowohl der Dämon als auch der Client in der Session des Users laufen sollen wird eine Referenz zum SessionBus geladen.

Bei diesem Bus muss sich der Dämon nun mit einem DBus-konformen Namen anmelden. Konvention sind umgekehrte Domainnamen mit dem Programmnamen hinter dem letzten Punkt. Hier also "de.pinyto.daemon". Ist der Name auf diese Weise registriert, leifert DBus interessierten Clients die Information, dass hier etwas erreichbar ist.

Unterhalb des Namens, der den Dämon identifiziert kann dieser verschiedene Dienste unter verschiedenen Pfaden anbieten. Im Beispiel ist es ein einzelner Dienst, definiert in der Klasse BackofficeInterface, der unter dem Pfad "/Backoffice" erreichbar gemacht wird.

Die Klasse BackofficeInterface wird zum DBus-Interface (Die Dienste heißen bei DBus "Interface"), indem sie von dbus.service.Object erbt. Damit ihre Methoden über das Interface aufgerufen werden können, müssen sie mit @dbus.service.method dekoriert werden. Im Decoratior wird jeweils nochmal ein Name des Service angegeben ("do.pinyto.daemon.backoffice") und die Signatur für Eingebe- und Ausgabeparameter angegeben. Dies ist nötig, da DBus im Gegensatz zu Python statisch typisiert ist. Eine Tabelle mit den verfügbaren Typen findet sich im Tutorial. Die Methoden selbst enthalten normalen Python-Code, der natürlich die passenden Typen zurückgeben muss.

Nach der Initialisierung des Interface kann ein mainloop-Objekt erzeigt werden und die MainLoop mit mainloop.run() gestartet werden.

Mit diesem Code kann der Dämon gesartet werden und läuft dann unendlich oder bis er mit der Exit-Methode gestoppt wird. Während der Dämon läuft, antwortet er auf Requests, die per DBus hereinkommen.

Der Client

     import sys
     import traceback

     from gi.repository import GObject

     import dbus
     import dbus.mainloop.glib


     # Callbacks for asynchronous calls
     def handle_hello_reply(r):
         global hello_replied
         hello_replied = True

         print(str(r))

         if hello_replied and raise_replied:
             loop.quit()


     def handle_hello_error(e):
         global failed
         global hello_replied
         hello_replied = True
         failed = True

         print("HelloWorld raised an exception! That's not meant to happen...")
         print("\t" + str(e))

         if hello_replied and raise_replied:
             loop.quit()


     def handle_raise_reply():
         global failed
         global raise_replied
         raise_replied = True
         failed = True

         print("RaiseException returned normally! That's not meant to happen...")

         if hello_replied and raise_replied:
             loop.quit()


     def handle_raise_error(e):
         global raise_replied
         raise_replied = True

         print("RaiseException raised an exception as expected:")
         print("\t" + str(e))

         if hello_replied and raise_replied:
             loop.quit()


     def make_calls():
         # To make an async call, use the reply_handler and error_handler kwargs
         remote_object.HelloWorld("Hello from dbus_test.py!",
                                  dbus_interface='de.pinyto.daemon.backoffice',
                                  reply_handler=handle_hello_reply,
                                  error_handler=handle_hello_error)

         # Interface objects also support async calls
         iface = dbus.Interface(remote_object, 'de.pinyto.daemon.backoffice')

         iface.RaiseException(reply_handler=handle_raise_reply,
                              error_handler=handle_raise_error)

         return False

     if __name__ == '__main__':
         dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)

         bus = dbus.SessionBus()
         try:
             remote_object = bus.get_object("de.pinyto.daemon",
                                            "/Backoffice")
         except dbus.DBusException:
             traceback.print_exc()
             sys.exit(1)

         # Make the method call after a short delay
         GObject.timeout_add(1000, make_calls)

         failed = False
         hello_replied = False
         raise_replied = False

         loop = GObject.MainLoop()
         loop.run()
         if failed:
             raise SystemExit("Async client failed!")

Da der Client seine Requests asynchron absetzen soll, braucht auch er eine MainLoop. Natürlich muss er auch den selben Bus benutzen. Da der Client aber keine Dienste anbietet, muss sein Name nicht am Bus angemeldet werden. Stattdessen holt er sich von DBus ein Proxy-Objekt, das die Signaturen des Interface beim Dämon übernimmt. Mit dem Proxy-Objekt (remote_object) kann dann wie mit einer Instanz der Interface-Klasse verfahren werden. Damit das Proxy-Objekt passend aufgebaut werden kann muss natürlich das Interface eindeutig mit Name und Pfad definiert werden. Das schlägt natürlich fehl, wenn sich der Dämon nicht am Bus angemeldet hat, was z.B. der Fall wäre, wenn er nicht läuft.

Anschließend wird make_calls nach einer Sekunde Wartezeit ausgeführt. Der Timeout zählt ab dem starten der MainLoop. In make_calls wird Hello direkt aufgerufen, indem das Interface als String benannt wird. RaiseException wird danach auf einem Interface-Objekt aufgerufen. Beide Varianten funktionieren. Für viele Requests lohnt es sich ein Interface-Objekt zu erzeugen. Für einzelne Calls ist die erste Variante sinnvoller. In beiden Fällen muss ein reply_handler und ein error_handler angegeben werden. Beides sind normale Python-Funktionen, die im Erfolgs- oder Fehlerfall aufgerufen werden, sobald der Request abgeschlossen ist. Ein großer Teil des Codes dient lediglich dazu die MainLoop in dem Moment zu stoppen, wenn alle Requests abgeschlossen sind. In einem grafischen Programm ist es gut möglich, dass es durch Benutzerinteraktion beendet wird und der Code daher sogar einfacher wird.

Fazit

DBus in Python ist möglich und erfordert auch nicht übermäßig komplizierten Code. Wirklich pythonic kommt dbus-python nicht daher, weshalb pydbus durchaus noch etwas verbessern könnte. Da dort aber noch weniger Dokumentation vorhanden ist, bin ich als Einsteiger einfach außer stande es zu benutzen. Zur Prformance kann ich noch nicht viel sagen, aber es scheint bisher alles hinreichend schnell zu sein.

Prinzipiell ist DBus ein sehr interessantes System, da es Desktop-Applikationen ermöglicht, die selbst wenig machen und trotzdem im Zusammenspiel mit anderen Diensten mächtige Funktionalität anbieten können. Allerdings muss die Dokumentation rund um die DBus implementierungen deutlich besser werden, wozu ich hiermit hoffentlich meinen Beitrag geleistet habe.

Weitergehende Infos

  • Hier wird erklärt, wie man mit einem .service File DBus dazu bringen kann den Dämon genau dann zu starten, wenn er gebraucht wird.

Warum bei verschlüsselten Verbindungen im Internet eigentlich kein Weg an der Netzneutralität vorbei geht.

Es wird viel über Netzneutralität diskutiert und dabei geht es - mit Recht - ums Prinzip. Das Internet würde durch das von den providern geforderte zwei-Klassen-Modell prinzipbedingt langsam für kleine Player wie Start-Ups, Blogger und Privatpersonen (z.B. bei Videotelefonie) und schnell für große finanzstarke Unternehmen wie Google, Facebook, Amazon, Netflix, etc., die es sich leisten können die Provider für den schnelleren Tarif zu bezahlen. Die Provider würden dabei ihre Gewinne maximieren, weil sie einen zweiseitigen Markt schaffen, bei dem sie Kunden und Anbieter gleichzeitig abkassieren können. Dazu verlieren die Provider jeden Anreiz ihre Netze auszubauen, da "premium" nur schnell erscheint, wenn "normal" unbenutzbar langsam ist. Warum sollte Netflix an die Telekom zahlen wenn die Bandbreite bei "normal" schon ausreicht?

Außen vor bleibt jedoch die Frage, wie die Provider die Pakete im "nicht premium"-Tarif überhaupt ausbremsen wollen, wenn eine rapide wachsende Anzahl der Pakete zu verschlüsselten Verbindungen gehört.

Prinzipiell haben die Provider so lang ein Interesse bestimmte Pakete im Internet auszubremsen, wie die Netzneutralität nicht gesetzlich vorgeschrieben ist. Die Zusammenhänge habe ich hier bereits genauer beschrieben. In Ländern wie Japan, in denen Netzneutralität gesetzlich gefordert wird, lohnt es sich für Provider nicht, die nötige Infrastruktur zu schaffen, um Pakete ausbremsen zu können. Dort fließen alle Investitionen in die Erhöhung der Bandbreite. In Deutschland, wo Netzneutralität kein Gesetz ist, ist es für Provider oft billiger zusätzliche Server zu betreiben um durch das Ausbremsen bestimmter Pakete Bandbreiten für andere Pakete frei zu machen, als zusätzliche Kabel zu verlegen. Diese Technik nennt sich Traffic Shaping.

Beim Traffic Shaping werden die Pakete genauer analysiert. Jedes IP-Paket hat eine Ziel-Adresse und einen Absender, damit der Server auch eine Antwort zurück schicken kann. Zusätzlich gibt es natürlich auch einen Inhalt, der pro Paket nur wenige Bytes groß ist. Große Dateien müssen also in mehrere Pakete aufgeteilt werden, die beim Empfänger dann zusammen gesetzt werden. Im Inhalt steht bei unverschlüsselten Paketen auch, weiches Programm die Daten entgegen nimmt, sodass Provider am Inhalt erkennen können, ob es sich um Daten einer Webseite, einer E-Mail, einen Videostream oder um ein IP-Telefonat handelt. Diese Art der Untersuchung des Inhalts von Datenpaketen kostet erheblich mehr Rechenleistung als die einfache Weiterleitung der Pakete und verlangsamt die Übertragung zwangsläufig für alle Pakete. Durch moderne Hardware kann aber der zusätzliche Rechenaufwand trotz allem noch für weniger Geld bewältigt werden, als ein zusätzliches Kabel kostet.

Bei verschlüsselten Verbindungen ist das Traffic Shaping jedoch nicht mehr so einfach. Dank der Verschlüsselung lässt sich aus dem Inhalt der Pakete nicht mehr ablesen um welchen Dienst es geht. Provider müssen in diesem Fall auf Tricks ausweichen. Zum einen lässt sich durch Absender und Empfänger noch etwas Information gewinnen (z.B. ein normaler Nutzer erfragt irgend welche Daten von der IP von Netflix). Zum anderen gibt es Muster wie eine Übertragung für einen bestimmten Dienst aussieht. Dafür muss die Übertragung mehrerer Pakete mitprotokolliert werden, um mit einer gewissen Wahrscheinlichkeit dann vermuten zu können dass diese Pakete zu einem Dienst wie z.B. Skype gehören. Für Provider gibt es dabei zwei Möglichkeiten:

  1. Whitelisting:

    Der Provider erlaubt nur Dienste auf der Überholspur dessen Muster er erkennt. Dann würde eine teschniche Änderung z.B. einer Anwendung zum Operieren von Patienten übers Internet (ein typisches Beispiel eines Diensts, der "premium"-Übertragung erfordert) dazu führen dass diese nicht mehr die Überholspur nutzen kann. Außerdem könnten Dieste versuchen wie andere Dienste auszusehen, um ohne Kosten auf der Überholspur mitfahren zu können. Es entstünden Kosten für alle Anbieter die die "premium"-Angebote der Provider nutzen, da sie die Provider über jede Änderung an ihren Programmen informieren müssen. Die Provider wiederum müssten stetig investieren, um "nicht premium" auch sicher ausbremsen zu können. Es entstünde eine Art Wettrüsten zwischen Dienstanbietern und Providern mit technisch wenig sinnvollen Protokollen und unnützen zusätzlichen Datenverkehr. Eindeutig keine erstrebenswerte Zukunft für das Internet.

  2. Blacklisting:

    Der Provider verbietet bestimmten Diensten, deren Muster er kennt, die Überholspur. Dabei würden keine besonderen Zusatzkosten für die "premium"-Dienste entstehen (außer den hohen Summen, die sie an die Provider zahlen müssen). Die Anbieter der Dienste die die Überholspur verwehrt bekommen, haben es aber hier noch einfacher die Brense zu umgehen. Es kommt also wieder zum Wettrüsten, wobei die Kosten für die Provider besonders hoch sein werden. Vermutlich gibt es bei diesem Wettrüsten dann "Kollateralschäden", indem "premium"-Dienste versehentlich dann doch ausgebremst werden.

Auf Verschlüsselung zu verzichten ist natürlich auch keine Option, da unverschlüsselte Pakete leicht manipuliert werden können. Wer möchte von einem Roboter operiert werden, dessen Befehle von Hackern manipuliert werden können?

Egal wie man es also dreht und wendet: ein Verzicht auf Netzneutralität führt zwangsläufig zu einem Wettrüsten zwischen Diensteanbietern und Providern, das schlecht für die Technik des Internets allgemein ist. Es entstehen Kosten für mehrere Parteien die mit einer gesetzlich festgeschriebenen Netzneutralität nicht entstehen würden. Diese Kosten hemmen das Wachstum der gesamten Branche und verhindern einen Ausbau der Netze, der für ein zukunftsfähiges Internet essenziell ist.

Das Beispiel Japan zeigt, dass Netzneutralität gut für den Netzausbau ist. Für den Preis eines deutschen DSL Anschlusses bekommt man in Japan eine Glasfaserverbindung bis ins Haus, die ca. 7-mal so schnell ist und zusätlich eine ebenso hohe Upload-Rate bietet, was für Videotelefonie z.B. wichtig ist. In Japan werden die Netzkapazitäten ausgebaut, falls der Bedarf z.B. durch mehr Videostreams steigt. Deutschland sollte sich hier ein Beispiel nehmen und nicht immer nur auf die USA schielen, wo mancherorts überhaupt keine Internetverbindung möglich ist.

Das Internet ist kein "rechtsfreier Raum" - war es noch nie

Immer wieder wird von verschiedenen Stellen beteuert, dass das Internet kein rechtsfreier Raum sein dürfe. Zuletzt von Bundesinnenminister Thomas de Maizière auf dem Global Cyberspace Cooperation Summit in Berlin. Es ist die Rede davon dass es "keine eigene Welt" sein dürfe und "prinzipiell Ermittlungsverfahren unmöglich macht". Dieses Gerede ist nicht nur faktisch falsch, sondern äußerst schädlich.

Eine Zusammenfassung der zitierten Äußerungen findet sich hier. Leider wurden ähnliche Äußerungen, die natürlich genauso falsch sind, bereits von vielen Politikern in die Welt gesetzt, vor allem aus der CDU und CSU, aber auch aus den Reihen der SPD.

Zuerst zu den Fakten: Das Internet ist kein rechtsfreier Raum. Eigentlich ist das Internet gar kein Raum. Es ist ein Netzwerk von Computern die von Menschen rund um die Welt benutzt und betrieben werden. Auf diesen Rechnern werden Daten gespeichert und verarbeitet, zwischen den Menschen findet Kommunikation statt. Bei den Vorgängen die mit dem Internet bewerkstelligt werden können gibt es auch solche die gegen die Gesetze verschiedener Länder verstoßen. Straftaten wie Betrug, Verleumdung, Stalking, Urheberrechtsverstöße, Spionage, illegale Pornographie und die Vernetzung krimineller Vereinigungen sind in fast allen Ländern der Erde in ähnlicher Weise strafbar. Andere Vorgänge wie die positive Darstellung von Homosexualität ist nur in wenigen Ländern strafbar (z.B. Russland, nicht jedoch Deutschland oder die USA). Da in der Antarktis, im Weltraum und in internationalen Gewässern keine Rechner stehen, die für die Struktur des Internets eine große Rolle spielen, fallen alle Vorgänge die im Internet passieren unter die Gesetzgebung eines oder manchmal sogar mehrerer Länder.

Es geht also im Kern um die Frage welche Länder ihre Gesetze bei einem Vorgang im Internet anwenden dürfen. Maßgeblich dafür ist wo der Server und wo der Client steht. Stehen beide im gleichen Land, gelten die Gesetze von dort. Stehen sie in unterschiedlichen Ländern gelten meist die Gesetze des einen Landes für den betreiber des Servers und die des anderen Landes für den Client. Generell spielt es eine Rolle wo z.B. eine Firma ihren Sitz hat und ob Verbraucherschutzgesetze gelten. Auch wenn wegen der zahlreichen internationalen Verbindungen im Internet alles rechtlich kompliziert erscheint, sind die Vorgänge in der Praxis meist nicht so komplex. Ein paar Beispiele:

  • Ein Kunde kauft etwas bei einem betrügerischen Anbieter bei ebay.de: Ebay hat eine deutsche Tochter und der Kunde ist deutscher. Das Angebot muss also deutschem Recht entsprechen. Sollte der Händler aus dem Ausland stammen kann die Bundesrepublik die übliche Rechtshilfe vom Herkunftsland geltend machen.
  • Ein unmoralischer Anbieter stellt Bilder von Kinderpornographie online und ein deutscher pädophiler lädt diese herunter: Der Anbieter kann in seinem Heimatland angeklagt werden. Der Pädophile ebenfalls in seinem Heimatland. Fällt die Tat nur in einem Land auf, kann die Polizei dieses Landes den Behörden des anderen Landes einen Hinweis geben.
  • Bei organisiertem Verbrechen, Drogenhandel, Terrorismus, etc. kann die Polizei ebenfalls Hinweise geben und die Beteiligten können jeweils in ihrem Heimatland angeklagt werden.

Generell ist rechtlich durch die Erfindung des Internets nicht viel neues passiert. Alle genannten Straftaten waren auch per Post bereits im analogen Zeitalter möglich. Straftaten dieser Art wurden bereits vor dem Internet geahndet, werden heute geahndet und können auch in Zukunft ohne Gesetzesänderung geahndet werden. Die Herausforderung liegt lediglich darin bei Ermittlungen Grenzen zu überschreiten und mit den Behörden anderer Länder zusammen zu arbeiten.

Natürlich gibt es Vorgänge, die in einem Land Straftatan sind und in anderen Ländern nicht. Beispielsweise wird das Urheberrecht in verschiedenen teilen der Welt unterschiedlich ernst genommen. Große Unterschiede gibt es auch bei Kritik an der Regierung. Diese Unterschiede lassen natürlich Begehrlichkeiten bei den strenger regulierenden Ländern entstehen, die dann den liberaleren Ländern gerne ihre strengere Gesetzgebung aufzwingen würden. Aber ein Eingriff in die Souveränität anderer Länder ist zurecht international nicht akzeptiert. Es kann also nicht sein, dass deutsche Politiker das Recht verlangen Belize in ihre Urheberrechtsgesetzgebung hinein zu reden. Genauso würden es Deutsche nicht akzeptieren wollen sich die Gesetzgebung zur Regimekritik von China aufzwingen zu lassen. Auch wenn es bitter sein mag: Einheitliche rechtliche Standards müssen auf internationaler Ebene z.B. bei der UN verhandelt werden bzw. über bilaterale Verträge geregelt werden. Das Internet hat damit wenig zu tun.

Die Forderung mit dem angeblichen rechtsfreien Raum hat also nichts mit rechtlichen Fakten zu tun. Stattdessen ist sie ideologisch. Was nämlich eigentlich gefordert wird ist die Kontrolle über "das Internet" und dass in die Souveränität anderer Länder eingegriffen werden soll. Diese ideologie, die sich das Recht heraus nimmt andersdenkenden die eigene Meinung aufzwingen zu wollen, wird gemeinhin als "rechts" bezeichnet. Wer also vorschnell einem de Maizière recht geben will, sollte darüber nachdenken, ob es wirklich so erstrebenswert ist dessen rechte Ideologie zu vertreten. Stattdessen könnte man das Internet nämlich auch als Chance verstehen und die bestehenden Probleme bei der Strafverfogung rational angehen. Mit einer bürokratiearmen zusammenarbeit der Polizeibehörden über Grenzen hinweg könnten nämlich bestehende Rechte gerade bei straftaten über das Internet besser bekämpft werden. Auf dem gleichen Weg ließe sich übrigens auch die Aufklärungsrate bei weniger interetrelevanten internationalen Straftaten wie Steuerhinterziehung verbessern. Und wo die Gesetzeslage im Ausland ungenügend erscheint, muss eben überzeugungsarbeit geleistet werden. Gerade die beliebten Themen wie Kinderpornographie und Terrorismus lassen sich sehr gut auf Internationaler Ebene vertreten, da beides eigentlich nirgends auf der Welt toleriert wird.

Ich für meinen Teil fordere, dass die Aussagen von Politikern "kein wahrheitsfreier Raum bleiben dürfen".

Garbage Collection für Gesetze

Wenn im momentanen System ein Gesetz erlassen wird, gibt es nur zwei Fälle für die Gültigkeitsdauer des Gesetzes:

  1. Im Gesetz wird eine Zeitspanne definiert, nach der es abläuft.
  2. Es gilt für immer.

Beide Fälle können umgangen werden, indem das Gesetz durch eine neue Version ersetzt wird, oder indem es abgeschafft wird. Dies ist die häufigste Weise wie die Gültigkeitsdauer eines Gesetzes beschnitten wird und erfordert die ganze Komplexität des Gesetzgebungsprozesses.

In parlamentarischen Demokratien ist dies meist ein langwieriger Prozess unter Beteiligung von teilweise mehreren Parlamenten, Regierungsbehörden, Lobbyisten und geladenen Experten. Die Komplexität dieses Prozesses führt dazu, dass Staaten oft davor zurückschrecken veraltete Gesetze abzuschaffen. Wird ein veraltetes Gesetz aber angewendet, kann ein teilweise erheblicher gesellschaftlicher Schaden entstehen, auf den die Legislative meist nicht schnell genug reagieren kann.

Dies muss aber nicht so sein, wenn man einen Mechanismus hat, wie alte Gesetze automatisch aufgeräumt werden können.

Vorbild Programmiersprachen

Bei dynamisch typisierten Programmiersprachen gibt es das Problem, dass in Programmen Variablen definiert werden und nicht sofort klar ist, wo diese überall gebraucht werden. Werden sie nicht mehr gebraucht, soll aber der Speicherplatz freigegeben werden. Der Prozess, der sich um dieses Problem kümmert, heißt Garbage Collection.

Eine häufige Methode der Garbage Collection ist es zu protokollieren, welche Variablen den Zugriff auf einen Speicherbereich ermöglichen. Ist keine Variable mehr da, die den Speicherbereich nutzt, kann er freigegeben werden. Die Garbage Collection macht das wie die Müllabfuhr nicht sofort, aber regelmäßig genug, damit der Müll nicht anfängt zu stinken.

Bei Gesetzen könnte das ähnlich funktionieren. Ein Gesetz wird meist aus einem konkreten Grund heraus erlassen. Ein Beispiel wäre ein Gesetz, das maximale Tarife für Telefonverbindungen im Ausland vorschreibt. Der Grund, dass es erlassen werden musste war, dass Telekommunikationsanbieter irreal hohe Gebühren verlangt haben. Diese Information könnte zugehörig zum Gesetz mit gespeichert bzw. abgeheftet werden. Es können sich weitere Nutzungsszenarien ergeben wie bei Datenschutzgesetzen aus den 50ern, die heute im Internet wesentlich häufiger vorkommen, im Kern und der Formulierung aber noch anwendbar sind. Solche zusätzlichen Anwendungsszenarien bräuchten vom Parlament oder bei einer direkten Befragung der Bürger nur eine leicht zu überblickende Bestätigung, dass sie anwendbar sind, die schneller abgestimmt werden kann, als eine Novellierung des Gesetzes.

Garbage Collection

Ein von der Gesetzgebung unabhängiges Expertengremium könnte dann in regelmäßigen Abständen die Nutzungsszenarien aller Gesetze überprüfen. Hat dann ein Gesetz keinen definierten Anwendungsfall, könnte der Gesetzgeber noch eine Übergangsfrist bekommen, um das Gesetz zu novellieren oder einen validen Anwendungsfall zu verabschieden. Geschieht das nicht, könnte die Gültigkeit des Gesetzes automatisch nach der Frist enden.

In diesem System wird nicht von einer kleinen Gruppe von "Experten" über den Kopf des Gesetzgebers entschieden. Die Macht des Expertengremiums ist stark limitiert darauf, dem Gesetzgeber ein Ultimatum zu setzen. Hätte man böse Experten, könnten diese den Gesetzgeber zwar beschäftigen, nicht jedoch schlechte Gesetze erlassen oder gute Gesetze außer Kraft setzen. Es handelt sich also um eine Optimierung des Wartungsprozesses von Gesetzen, der die Machtverhältnisse nicht wesentlich verändert.

Beispiele

In den 70ern wurden Gesetze erlassen, um Terroristen der RAF leichter verfolgen zu können. Glücklicherweise ist die RAF Geschichte. Die Gesetze dazu nicht. Die Bundesrepublik hat außerdem noch zahlreiche Gesetze aus der Zeit, als eine Bedrohung durch die DDR gesehen wurde, die heute nicht mehr existiert.

Mein Beispiel von vorhin wird z.B. überflüssig, wenn es keine Telefontarife mehr gibt, die keine Flatrates sind. Die Tendenz dazu ist erkennbar, aber ein Gesetzgeber könnte die Zukunft nicht genau genug vorhersagen, um das Gesetz nach einer festen Zeit ablaufen zu lassen.

Lohnt sich der Aufwand?

Ein Expertengremium zu unterhalten, die Nutzungsszenarien von Gesetzen überprüfen ist weder besonders teuer noch aufwendig zu unterhalten. Im Gegenzug könnten veraltete Gesetze abgeschafft werden, bevor sie Schaden anrichten. Die schlankeren Gesetzestexte erleichtern sowohl für den Gesetzgeber selbst als auch für Juristen die Übersicht. Nicht zuletzt ist es für normale Bürger einfacher sich an Gesetze zu halten, wenn es wenig genug sind, um sie sich zu merken. Man denke nur mal daran, wie viele Steuerhinterzieher angegeben haben sie hätten nicht gewusst, dass ihre Finanzgeschäfte gegen das Gesetz waren.

Eine Republik wie Deutschland hat ein starkes Interesse daran wenige leicht verständliche Gesetze zu haben, die die notwendigen Dinge einschränken und dem Bürger ansonsten möglichst viele Freiheiten lassen. Notwendigkeit lässt sich bei Gesetzen aber leicht formulieren und wird beim Gesetzgebungsprozess ohnehin diskutiert. Nutzen wir diese Information, können wir so manche veraltete Regelung auf den Müll werfen, auf den sie gehört.

Woran ich merke, dass mein Klickverhalten getrackt wird

In Zeiten von NSA-Skandal und sozialen Graphen gehen wir davon aus, dass unser Verhalten auf Webseiten getrackt wird. Die Annahme ist richtig. Allerdings ist das technisch gar nicht so trivial zu erreichen und wir können die Tracking-Methoden meist ohne besondere Analysewerkzeuge im Browser erkennen.

Wer bei Twitter schon lange URLs in seinen Posts hatte, wird gemerkt haben, dass diese nur ca. 20 Zeichen vom Tweet in Anspruch nehmen. Der Grund dafür ist der Twitter-eigene URL-Shortener, der für lange URLs eine kurze URL erzeugt, die dann im Tweet benutzt werden kann. Früher musste man diesen Schritt manuell machen, um Zeichen zu sparen, heute geht das ganz automatisch. Das ist bequem für den Autor und der Leser bekommt davon auch wenig mit, weil Twitter einen Ausschnitt der ursprünglichen URL anzeigt, statt der kryptischen verkürzten URL.

Wer aber mal sehr kurze URLs getwittert hat (z.B. weil man bereits einen URL-Shortener eingesetzt hat), wird gemerkt haben, dass auch diese von Twitter "verkürzt" werden. Dass es technisch einfacher wäre, als Links gleichermaßen zu bearbeiten, ist kein Argument, weil die zwei Zeilen Code für die Unterscheidung Twitter weniger Kosten als der Speicherplatz beim Shortener-Dienst. Also muss es eine andere Erklärung für Twitters URL Bearbeitung geben.

Die Antwort liegt in der Struktur von HTML. Auch dynamische Webseiten von heute setzen in auf HTML, um Links anzuzeigen. Links stehen in <a>-Tags, in denen im href=-Attribut das Ziel des links angegeben ist. Wird auf einen Link geklickt, ruft der Browser die in href= spezifizierte URL auf, als ob man sie direkt in die Adressleiste eingegeben hätte. Die Webseite auf der sich der Link befindet, bekommt von diesem Aufruf eigentlich nichts mit. Lediglich die Zielseite registriert den Aufruf, da sie ja jetzt Daten liefern muss. Bleiben die Links auf der gleichen Plattform, kann es dem Anbieter egal sein, ob die Quellseite den Klick registriert, weil die Zielseite ja registriert ist und der Anbieter damit schon Informationen zum Verhalten des Users sammeln kann (dagegen kann man als User wenig tun). Geht der Link aber auf eine externe Seite würde Twitter oder Google oder wer auch immer nichts davon merken.

Die häufigste Methode der Anbieter besteht darin den Link nicht dort hin auszuführen, wo der Anwender eigentlich landen will. Stattdessen führt der Link auf eine Seite, die registriert, dass sie aufgerufen wurde, nichts anzeigt und den Anwender so schnell wie möglich auf die eigentlich gewünschte Seite weiterleitet. Technisch ist das genau das, was ein URL-Shortener tut.

Twitter erhebt also gezielt Daten, auf welche Links ich in Tweets klicke und auf welche nicht. Dass diese Information für Werbetreibende interessant ist, erschließt sich leicht und damit ist auch klar, dass diese Information einiges an Geld wert ist. Google verwendet in seiner Suche übrigens die exakt gleiche Methode, um herauszufinden, welche Suchergebnisse geklickt werden und welche nicht. Im Fall von Google kann man sich wehren, indem man Startpage verwendet. Startpage ruft Google für dich auf und entfernt die Umleitungslinks für dich, sodass du eine Ergebnisliste mit Links bekommst, die dich direkt zur gesuchten Seite leiten, ohne die Google-Statistik zu füttern. Bei Twitter kenne ich leider noch keinen Client, der so eine Funktion bietet.

Diaspora-Nutzer müssen sich übrigens keine Gedanken zu diesem Problem machen, da URLs in Diaspora nicht verkürzt werden müssen und daher alle Links so erscheinen, wie der Post-Autor sie eingegeben hat. Findeco verwendet auch direkte Links im Microblogging, zieht aber trotzdem nur 20 Zeichen pro Link von der Zeichenanzahl ab.

Die Redirects wie bei Twitter und Google sind nicht die einzige Möglichkeit den Klick zu registrieren. Man kann einen Klick z.B. auch per JavaScript registrieren und einen AJAX-Request dafür abschicken. Diese Methode ist allerdings aufwendiger und weniger robust, sodass man weniger darauf achten muss, weil sie in der Praxis nicht eingesetzt wird. Alle Methoden Klicks zu registrieren kann man aber immer im "Network"-Tab der Entwicklerkonsole sehen. In Chrome und Firefox können solche Konsolen mit der Taste F12 angezeigt werden. Ich lade sehr dazu ein Mal auf Redirects bei scheinbar direkten Links zu achten und Rückschlüsse daraus zu ziehen, ob die eigenen Lieblingsseiten dich überwachen oder nicht.

Bericht von der Tokyo Game Show 2014

Am letzten Sonntag ist die Tokyo Game Show 2014 zu Ende gegangen und ich habe einen Videobericht für alle, die es nicht zur größten japanischen Spielemesse geschafft haben.

Warum die Piraten Mitgliederzahlen nur auf dem Papier sinken

Die Piratenpartei verliert Mitglieder. Seit dem Höchststand 2012 ca 6000. Was auf den ersten Blick besorgniserregend erscheint, ist größtenteils nicht auf die medienwirksamen Streits oder die enttäuschenden Wahlergebnisse zurückzuführen.

Aktuelle Mtgliederzahlen finden sich hier. Grafisch aufbereitet ist das hier.

Zunächst sieht die Entwicklung dramatisch aus. 6000 Mitglieder haben uns verlassen in nur zwei Jahren. Der vorherige Aufwärtstrend scheint nachhaltig gestoppt. Die Medien berichten gern über den Zerfall oder Untergang der Piratenpartei. Gründe für diese Ansichten gibt es viele. Prominente Piraten haben äußerst medienwirksam und mit großer Ausdauer über Richtungen, Flügel und Personal gestritten. Die Wahlergebnisse bei allen Wahlen seit 2012 waren schlecht. Prominente Piraten sind medienwirksam ausgetreten und auf Twitter konnte man auch immer mal wieder über den Austritt nicht so prominenter Piraten lesen. Es scheint also, als ob viele Piraten desillusioniert die Partei verlassen und der medial beschworene Untergang tatsächlich stattfindet.

Faktisch sieht die Situation aber anders aus. Zunächst muss man bedenken, dass nach den Protestwähler-Erfolgen von 2010 bis 2012 eine gewisse Zahl von Karrieristen in die Piratenpartei eingetreten sind, die auf eine steile politische Karriere spekuliert haben. Schon die Idee entspricht nicht den Idealen der Piratenpartei und auch in der Umsetzung haben diese Leute mehr geschadet als genutzt. Natürlich kamen von Karrieristen Mitgliedsbeiträge, allerdings ist der Schaden (zeitlich und finanziell), den diese Leute angerichtet haben erheblich höher. Personalwahlen wurden schrecklich kompliziert, wegen der vielen Kandidaten, die die Basis mit erheblichem Aufwand "grillen" musste, um die karrieregeilen Möchtegern-Berufspolitiker möglichst zu erkennen und nicht zu wählen. Wenn doch mal einer gewählt wurde hat dieser in seiner Position dann den Piraten geschadet, da er die Piratigen Ideale sowieso nie geteilt hat. Wir können also froh sein über jeden Karrieristen, der enttäuscht aufgibt und austritt. Allerdings war der Anteil der Karrieristen an der Gesamtzahl der Mitglieder immer klein. Von den ca. 20% Mitgliedern, die wir verloren haben waren das bestimmt nicht mehr als 5%.

Der größte Anteil geht aber auf das Konto der nicht aktiven und nicht zahlenden Mitglieder. Dieser Anteil ist bei allen politischen Parteien erstaunlich hoch, da man ab dem Zeitpunkt Mitglied wird, ab dem der Mitgliedsantrag angenommen wird. Bei den Piraten wird praktisch kein Mitgliedsantrag abgelehnt, weshalb man sehr leicht Mitglied werden kann. Wenn diese Mitglieder nie Beitrag bezahlen, haben sie kein Stimmrecht auf dem Parteitag, auf den sie nicht gehen, weil sie nicht aktiv sind. Sie existieren also zunächst für eine Weile als Karteileichen, die vielleicht einmal im Jahr Post bekommen, dass sie zum Parteitag kommen dürfen und falls sie auch mal Beitrag bezahlen dort auch abstimmen dürfen.

Die Piraten waren mit der Mitgliederexplosion, besonders nach der Berlinwahl oftmals überfordert. Eine Menge der eben beschriebenen Karteileichen entstanden und verschwanden auch nicht, weil die Generalsekretäre und Schatzmeister mit dem Versenden von Mahnungen und Rauswerfen der Karteileichen schlicht überfordert waren. Das Problem wurde auch schnell erkannt, aber bis die Strukturen für eine effektivere Verwaltung geschaffen waren, verging viel Zeit. Inzwischen haben die Landesverbände ihre Mitgliederverwaltung an die realen Anforderungen angepasst und werfen die Karteileichen as dem System, was zu sinkenden Mitgliederzahlen in der Statistik führt. Das wiederum ist aber kein Zeichen für Verfall, sondern für die viel geforderte Professionalisierung der Piratenpartei.

Der eben beschriebene Effekt überlagert die einzelnen medienwirksam inszenierten Austritte, die auf die Statistik keinen messbaren Einfluss hätten.

Also sinken die Zahlen und man muss sich keine Sorgen machen?

Die sinkenden Mitgliederzahlen sind trotzdem besorgniserregend. Sie zeigen nämlich deutlich, dass es keine ausreichende Menge an Eintritten gibt, um die Austritte und Aufräumarbeiten zu überlagern. Das ist ein schlechtes Zeichen, weil wir als Piraten viele arbeitsintensive Projekte haben, die auf viele Schultern verteilt sein sollten.

Wir brauchen viele aktive Mitglieder, weil wir als ideologisch bedingt arme Partei (grundsätzliche Kritik an großen Parteispenden besonders von Unternehmen und an Lobbyismus) nicht das Geld haben Leute einzustellen, um die Arbeit zu machen. Verwaltung, IT und Wahlkampf kostet viel Zeit. Und damit ist dann noch keine Arbeit am Programm gemacht, die wir nicht "effizient" von wenigen machen lassen, sondern auf möglichst große Gruppen von Piraten verteilen, die folglich alle damit Zeit verbrauchen. Unser Problem ist, dass wir direkte Demokratie fordern, diese Form der Demokratie aber von allen Beteiligten einen hohen zeitlichen Aufwand abverlangt. Wir wollen aber nicht "effizient" werden, weil wir dann unsere Ideale aufgeben und wie die etablierten Parteien werden würden.

Wir sollten als Piraten weiter für Mitstreiter werben, die uns helfen unsere Visionen zu verwirklichen. Dass wir das nicht mehr gut können, ist ein großes und wichtiges Problem, das die Piratenpartei lösen muss. Wir sind aber nicht die Bundesregierung, die der Presse am Tropf hängt. Wir werben neue Mitglieder nicht für die Statistik, sondern für die Veränderung der Welt. Wenn also neue Menschen eintreten, sollten es Piraten sein, keine Karrieristen oder Protestwähler-Karteileichen. Wir brauchen neue Piraten die unsere Visionen einer demokratischen Gesellschaft teilen, die politisch und gesellschaftlich gegen die Errichtung von Überwachungsstaaten durch die Geheimdienste kämpfen. Wir brauchen neue Mitglieder, die die Privatspäre jedes einzelnen Schützen wollen und denen die Freiheit aller Bürger das größte Anliegen ist. Wir brauchen Mitstreiter die uns helfen bei einem bedingungslosen Grundeinkommen, bei einem fahrscheinlosen ÖPNV und bei einer Gesellschaft des Teilens ohne Gegenleistung Aufklärungsarbeit bei der ganzen Bevölkerung zu leisten, damit letztlich jeder verstehen kann, warum diese Ideen visionär, zutiefst moralisch und ganz anders sind, als die hohlen Worte, die uns CDU, SPD usw. seit Jahren auftischen.

Und wenn du das gelesen hast und die eben erwähnten Ziele dich angesprochen haben, dann frage dich, ob du schon Pirat bist. Und wenn du aus Wut über irgendeinen Piraten ausgetreten bist, aber diese Ideale teilst, dann frage dich, ob du wirklich bereit bist die Visionen der Piraten für einen dummen Tweet oder eine schlecht geschriebene Mail zu opfern, oder ob du nicht doch lieber für das Projekt "Freiheit" weiter kämpfen willst. Und wenn du mit den piratigen Idealen gar nichts anfangen kannst und das hier nur liest, weil du deinen Gegner kennen willst: Wir werden nicht aufgeben! Egal ob wir Wahlen verlieren, überbordend Streiten oder von der Presse klein geschrieben werden, wir werden nicht aufhören für unsere Ideale zu kämpfen. Unsere Visionen sind zu wichtig, um sie nicht umzusetzen. Wir sind Piraten und werden nicht aufhören die Welt zu verändern. Erwarte uns.

Ergänzung (24.9.2014)

Ich habe inzwischen diesen Blogpost gelesen, in dem der Mitgliederschwund schön in Zahlen gepackt wird. Das Ergebnis dort ist ein Rückgang um knapp 2000 Zahlende Mitglieder im Jahr. Die von mir vermuteten Austritte der Karrieristen lassen sich durch etwas steiler fallende Flanken nach Wahlen in der Statistik wieder finden. Man muss anhand der Zahlen davon ausgehen, dass die Austritte entsprechend der Mitgliederstatistik seit 2012 auf ungefähr konstantem Nivea sind. Das heißt die Mitgliederzahl, sowohl nach Parteibuch als auch nach zahlenden Mitgliedern, sinkt ungefähr linear.

Sollte ich durch obige Ausführungen das Problem verharmlost haben, tut mir das leid. Ich werde auf jeden Fall über die Gründe nachdenken und mich mit anderen Piraten austauschen. Mir geht es nicht um eine Rückkehr zu den Piraten wie sie 2012 waren, sondern darum dass wir für unsere eigentliche Klientel als die Visionäre wahrgenommen werden, die wir sind. Wenn Erstwähler, Gebildete und Liberale Menschen die Piratenpartei nicht wählen wollen schmerzt mich das besonders, weil diese Gruppen politisch keine zufriedenstellende Alternative haben. Und wenn wir etwas tun, um diese Menschen abzuschrecken, dann sollten wir das schleunigst ändern.

Das Internet ist ungerecht. Trotz Netzneutralität.

Die Debatte um Netzneutralität tobt in den USA. Internetaktivisten weltweit fürchten, dass es bald eine teure Überholspur und eine besonders ausgebremste Spur für alle Inhalte gibt, die nicht von ganz großen Unternehmen kommen. Experten sind sich einig, dass die Aktivisten eine reale Gefahr sehen, die ohne gesetzlich festgeschriebene Netzneutralität wirklich kommen wird. In die hitzige Diskussion wirft die Telekom jetzt ein, dass das aktuelle Netz auch nicht neutral ist. Und sie hat damit recht.

Die Telekom argumentiert (hier der Artikel dazu), dass Inhalte momentan auch unterschiedlich schnell abrufbar sind. Wenn ein Server näher am Kunden steht, sinkt die Latenz und die Bandbreite kann leichter ausgereizt sein. Ist ein Server weit weg, stellen oft Unterseekabel oder zu schwache Knotenpunkte zwischen den Netzen verschiedener Anbieter einen Flaschenhals dar und die Inhalte kommen erheblich langsamer beim Kunden an. Konzerne wie Google oder Facebook betreiben daher hunderte von Rechenzentren, die über die ganze Welt verteilt sind, um von jedem Kunden eine kurze Verbindung zum nächsten Rechenzentrum aufbauen zu können. Kleine Unternehmen wie Startups oder gar Privatpersonen können es sich nicht leisten, den Globus mit ihren Servern zu pflastern, sodass ihre Angebote von den meisten Punkten der Erde schlechter erreichbar sind. Dadurch ergibt sich ein zwei-Klassen-Internet, obwohl die Regeln der Netzneutralität immer eingehalten sind.

Für Endkunden wirkt das Internet oft wie ein einheitliches Netz mit unbegrenzter Bandbreite, bei dem nur das Problem ist, überhaupt ausreichenden Zugang dazu zu bekommen. So homogen war das Internet aber nie und wird es vermutlich auch nie sein. Jedes Kabel hat eine begrenzte Bandbreite und erfordert Wartung. Router, die die Kabel verknüpfen, brauchen Strom und Wartung und haben ebenfalls eine begrenzte Bandbreite, die sie maximal umsetzen können. Der Betrieb dieser Infrastruktur kostet Geld und ihr Aufbau oder Ausbau noch wesentlich mehr Geld. Die Infrastruktur wird von privaten Unternehmen betrieben, die ihre Kosten über Gebühren decken müssen. Ein großer Teil der Kosten, die ein Provider stemmen muss, bezahlt dieser an andere Provider, um jeweils andere Teile des Internets für seine Endkunden zu erschließen. Wir müssen davon ausgehen, dass das Internet auf lange Zeit diese Struktur behalten wird und damit immer Investitionskosten über die entsprechenden Gebühren letztlich bis zum Endkunden weiter gereicht werden. Regulierend wirkt dabei der Markt, weil Konkurrenz (zusammen mit den bestehenden Gesetzen gegen Kartelle) die Provider unter Preisdruck setzt.

Also müssen wir uns eben darauf einstellen, dass kleine Unternehmen auch weiterhin ihre Angebote nicht ganz so schnell anbieten können wie die großen Konzerne. Wirklich kleine Anbieter, die viel Bandbreite benötigen (z.B. Video-Streaming), können dann eben nur regional konkurrenzfähig agieren. Trotz aller Beschwerden der Telekom ist aber nicht zu erwarten, dass dadurch die Innovationskraft der IT-Start-Ups nachhaltig geschädigt wird. Immerhin hat das von der Telekom beschriebene Problem seit Beginn des Internets bestanden und dennoch hat so manches Start-Up den großen Wurf landen können.

Wichtig ist, dass die aktuelle Ungleichheit nichts mit dem zu tun hat, was ein Ende der Netzneutralität gefährdet. Momentan hat niemand ein Interesse daran, bestimmte Datenpakete bewusst auszubremsen. Natürlich können Ausbaupläne verzögert und Investitionen zurück gehalten werden. Aber dank Netzneutralität geht fehlende Bandbreite zu Lasten aller Anbieter und nicht nur auf Kosten der kleinen, finanzschwachen Netzteilnehmer. Wird die Netzneutralität abgeschafft, haben aber Provider ein Interesse daran, das "normale" Internet künstlich zu verlangsamen, um den großen Konzernen das Premiumangebot leichter verkaufen zu können. Ein Argument wie "Das Internet ist jetzt auch schon ungerecht und ungleich schnell, da können wir auch die Netzneutralität ganz lassen." ist also nicht nur faktisch falsch, weil Dinge verglichen werden, die man nicht vergleichen kann, sondern auch bösartig vor dem Hintergrund, dass mit Ängsten und Frustration vieler Nutzer gespielt wird, die sich ein schnelles Netz für Alles wünschen.

Verbessern kann man die ungleichen Geschwindigkeiten im Netz übrigens über mehr Wettbewerb. Dafür kann man erstens immer ein Auge darauf haben, welche Provider welche Banbreiten anbieten und diese dann auch ausmessen. Benchmarks dafür sind leicht zu finden und kaum ein Internetnutzer hat noch nicht erlebt, dass die versprochene Bandbreite seines Anschlusses nicht bei Ihm ankam. Eine zweite Möglichkeit ist der Aufbau von Netzen unter der Kontrolle der Nutzer. Dort wird meist auf Gebühren der vielen kleinen "Provider" verzichtet und damit ein Preis deutlich unter den sonstigen Markpreisen erzeugt. Dieser Preisdruck kommt bei den kommerziell arbeitenden Providern an und wird dazu führen, dass diese ihr Angebot so ausbauen müssen, dass sie bessere Leistungen als die freien Netze bieten. In Zeiten von 4k-Streams und Downloads im GB-Bereich wird es auch weiterhin genug Kunden geben, die bereit sind für hochwertige Angebote von Providern zu zahlen. Der Aufbau freier Netze könnte aber dazu führen, dass wir gedrosseltes DSL oder 300MB Volumentarife auf dem Handy dann nicht mehr sehen müssen. Bezahlt würde dann nur für echte technologische Leistungen und nicht mehr für die Möglichkeit die eigenen E-Mails abrufen zu dürfen.

Also los! Kabel in den Vorgarten, Freifunk-Router aufs Dach! Provider-Preisvergleich anmachen und der Telekom und allen anderen Providern klar sagen: Ohne Netzneutralität geht es nicht! Statt zu jammern, baut eure Netze aus!

Das diskutierende Netz und warum Weghören fast so wichtig wie Zuhören ist.

Ich habe in den letzten drei Wochen, wenn ich vorgeschlagen habe an etwas innovativem oder wichtigen innerhalb der Piratenpartei zu arbeiten, wiederholt die Entgegnung bekommen, dass zunächst die innerparteiliche Diskussionskultur verbessert werden müsste. Ich war zunächst überrascht und habe mich dann etwas eingehender mit der Problematik beschäftigt.

Mein erster Impuls war, dass ich von dem Einwand befremdet war. Die Piratenpartei hat mich bisher noch nie davon abgehalten an einem politischen Projekt zu arbeiten. Bei abgeschlossener Arbeit könnte es problematisch sein eine Mehrheit in der Partei zu finden, aber meist hat sich diese ohnehin ergeben, wenn man im Interesse der bestmöglichen Umsetzung des Projekts innerhalb der Partei viel Feedback eingeholt hat. Warum also sollte jemand das Bedürfnis haben zunächst die Diskussionskultur zu verändern und erst danach mit der interessanten Arbeit anzufangen?

Ich wollte zunächst wissen, ob die Klagen wirklich berechtigt waren und beobachtete meine Twitter-Timeline etwas genauer. Twitter deswegen, weil mir ausartende und unproduktive Diskussionen auf Mailinglisten längst bekannt waren und Twitter mir im Gegensatz zur Mailingliste die Möglichkeit lässt selbst zu entscheiden, wem ich folge. Ich wollte wissen, ob meine bewusst getroffene Auswahl von Piraten bei Twitter dazu geeignet ist mein Gemüt so sehr zu erregen, dass ich auf die Piraten insgesamt "keinen Bock" behommen könnte.

Neben den informativen und motivierenden Tweets die ich generell genieße und der relativ großen menge an irrelevanter Trivialität sind mir auch einige Tweets aufgefallen, die tatsächlich bewusst provozierend formuliert waren und mir in ihrer Unsachlichkeit störend aufgefallen sind. Ein merkmal dieser Tweets war, dass die selben Leute oft kurz darauf in weiteren Tweets Leute erwähnt haben, die auf die ursprünglichen Tweets geantwortet hatten. Die gleichen Twitterer schienen auch sonst gerne auf Tweets zu antworten, um wehement zu widersprechen, zu polarisieren oder in der direkten Ansprache zu provozieren. Thematisch ging es dabei meist um Rechts-Links-Flügelkämpfe, was mich sonst nicht so interessiert, weshalb ich die Tweets bisher oft übersehen hatte. Bei der genaueren Betrachtung dieser öffentlich geführten Streits konnte ich an mir selbst beobachten, wie ich tatsächlich eine ablehnende Haltung gegenüber den Piraten allgemein annahm, weil ich die Streithähne zur Gruppe der Piraten zählte.

Meine Beobachtung ist also, dass man sich durch eine schlechte Diskussionskultur durchaus demotivieren lassen kann. Allerdings ist das nicht zwingend notwendig. Ich habe bei Twitter die Möglichkeit unsachlichen Diskutanten einfach nicht mehr zu folgen und so meine Nerven zu schonen. Genau das habe ich heute auch getan: Den zwei unsachlichsten und unkonstruktivsten Streithähnen folge ich seit heute nicht mehr. Interessant ist, dass einer davon ziemlich bekannt ist und viele Follower hat. Das bedeutet nämlich, dass sich ganz viele Piraten demotivierende Tweets aus diesem Account antun und sich folglich demotivieren lassen.

Ein paar Gedanken zur Diskussionskultur

Das Internet ermöglicht es uns mit einer unfassbar großen Menge an Personen rund um den Globus zu kommunizieren. Es ist nicht wie ein Stammtisch in einer Kneipe, wo nur die miteinander reden, die gerade da sind. Im Internet kann im prinzip jeder mit jedem reden. Wir treffen automatisch eine Auswahl und wie wir diese Auswahl treffen hat großen Einfluss darauf, wie unsere digitalen Gespräche aussehen und was sie bei uns auslösen. Wenn wir feststellen, dass an einer Stelle demotivierend oder auch nur unproduktiv kommuniziert wird, können wir uns leicht entziehen und stattdessen mit anderen Bewohnern des globalen Dorfs reden. Da jeder das kann, ist es auch kein Akt der Zivilcourage in eine schlechte Kommunikation einzischreiten. Wer ziel von Angriffen wird, kann ganz leicht die Verbindung kappen und mit Recht sagen: "Das muss ich mir nicht antun."

Der "Unfollow" Knopf bei Twitter ist eine Möglichkeit. Das Abbestellen einer Mailingliste ist eine andere Möglichkeit, um schlechter Kommunikation innerhalb der Piraten zu entkommen. Und es ist keine Feigheit von diesen Möglichkeiten gebrauch zu machen, weil sie unsere Motivation und unsere Nerven schonen. Wichtig für die Piraten ist, dass gute politische Arbeit gemacht wird. Dafür muss man keine Mailingliste lesen. Persönliche treffen sind sehr produktiv und virtuelle Mumble-Treffen mit Pad sind ähnlich gut. Manchmal hilft es auch, die Idee ganz alleine aufzuschreiben und dann den Text zu verschicken. In Rheinland-Pfalz haben wir mit Findeco ein Tool, das gemeinsame inhaltliche Arbeit praktisch ohne Trolle ermöglicht. Unfollow und Abbestellen lasen uns mehr Raum für diese effektiven Mittel der Kommunikation.

Mein Tipp ist nicht die gane Twitter-Timeline zu entvölkern. Aber ein bewusstes Loswerden von den Leuten, die einen runterziehen kann auch etwas befreiendes haben. Mir liegt es nicht nur daran dass die politische Arbeit für die Piraten voran kommt, sondern auch dass sie Spaß macht. Glücklicherweise macht es Spaß gemeinsam einen guten Antrag zu erstellen oder eine piratige Aktion zu planen. Wir können diese Freuden aber oft nicht genießen, weil uns etwas negatives auf die Stimmung schlägt. Das bewusste Weghören schützt uns vor diesen negativen Elementen der Kommunikation. Und wer weiß, vielleicht hört der ein oder andere Schreihals, Miesepeter, Streithahn oder Troll auch einfach auf, wenn er kein Publikum mehr findet.

So löst man das Angular-Direktvien-Update-Problem

Wer in Angular schon öfter an Direktiven gearbeitet hat, kennt vermutlich das Problem: Eine Direktive hat ein Partial, das in einer separaten .html-Datei steht. Wenn in diesem Partial etwas geändert wird, kann man so oft man will die Seite in Chromium neu laden, die Änderung wird einfach nicht sichtbar. Ich habe mich schon Stunden mit diesem Problem herumgeschlagen, da man dann dazu tendiert blind Änderungen vorzunehmen ohne sie testen zu können. Auch das Umschalten auf Firefox nervt, weil es den normalen Workflow unterbricht. Jetzt habe ich endlich die Lösung gefunden.

Die Lösung fand ich hier. Man kann in den Developer Tools (das ist diese "Firebug"-Konsole die sich öffnet, wenn man F12 drückt) oben rechts über das Zahnrad-Icon die Einstellungen öffnen. Dort kann man in den Allgemeinen Einstellungen den Browser-Cache deaktivieren, wenn die Developer-Tools geöffnet sind.

Screenshot wo sich die Einstellung findet

Wenn der Cache so deaktiviert ist, muss man die Seite nur mit geöffneten Developer Tools (F12 danach F5) neu laden und sieht dann sogar die Änderungen an den Partials der Direktive direkt.

Ich werde die Option wohl jetzt standardmäßig aktiviert lassen, weil ich die Developer Tools ohnehin nur dann offen habe, wenn ich sowieso sicher gehen will, dass alles neu geladen wird. Wer eine langsame Internetverbindung hat, kann aber natürlich auch den Cache immer benutzen um Zeit zu sparen.