• Lieblingsgesetze

    Ich bin in den letzten Tagen unabhängig voneinander zwei Mal auf Gesetze gestoßen, die nach Titel oder Inhalt großartig sind, so großartig, dass ich bestimmt mal irgendwann auf sie werde zurückgreifen wollen, um etwas wie „…geregelt in, sagen wir, §42 Käseverordnung“ zu sagen. Das waren:

    • Käseverordnung: Laut Wikipedia hat es so eine schon 1934 gegeben; und nur so lässt sich wohl erklären, dass sie Marketroids anbietet, mit Wörtern wie „Vollfettstufe“ (§5 Käseverordnung) zu werben für ihre „frische[n] oder in verschiedenen Graden der Reife befindliche[n] Erzeugnisse, die aus dickgelegter Käsereimilch hergestellt sind“ (aus §1 Käseverordnung). Großartig ist das übrigens nicht nur wegen der Parallelbildung zu Käseblatt, sondern auch, weil in Jasper Ffordes großartigen Thursday Next-Romanen Käseschmuggel aus Wales eine große Rolle spielt und §30 Käseverordnung manchmal schon nach der Bookworld dieser epochalen Werke klingt.
    • Bundeskleingartengesetz: Das geht immerhin bis §22, wobei allerdings ein Paragraph weggefallen ist und §19 lediglich aus „Die Freie und Hansestadt Hamburg gilt für die Anwendung des Gesetzes auch als Gemeinde“ besteht, es dafür aber allen Ernstes zwei Buchstabenparagraphen gibt (§20a, „Überleitungsregelungen aus Anlaß der Herstellung der Einheit Deutschlands“, passt schon vom Titel her großartig zum bierernsten Ton der Gartenregeln). Eingestanden: So albern, wie Gesetze für KleingärtnerInnen zunächst wirken, wird das wohl am Ende nicht sein. Oder doch? Ich kann mich einfach nicht entscheiden, auch nicht, nachdem ich den DLF-Hintergrund vom 18.8. gehört habe (full disclosure: ich weiß nur aufgrund dieser Sendung überhaupt von der Existenz des BKleingG).
  • Corona-Film, Teil 2

    Am Ende meines Posts zum Corona-Inzidenzfilm hatte ich zuversichtlich gesagt, der RKI-Datensatz gebe durchaus auch Plots von Altersmedianen her. Tja… da habe ich den Mund etwas zu voll genommen, denn was wirklich drinsteht, sind Altersgruppen, und die sind so grob, dass eine halbwegs seriöse Schätzung hinreichend dekorativer (also: mit mindestens 256 verschiedenen Werten) Mediane doch einige Überlegung erfordert.

    Die Altersgruppen reichen aber auch ohne Sorgfalt, um eine Art Score auszurechnen (ich verrate gleich, wie ich das gemacht habe), und damit ergibt sich zum Beispiel dieser Film:

    (sollte euer Browser das vermurksen: Download).

    Nachtrag (2021-11-03)

    Nur damit sich niemand wundert, wie Herbst-Zahlen in einen Post vom August kommen: Ich habe den Film bis November 2021 fortgesetzt und werde ihn künftig wohl noch ein paar Mal aktualisieren.

    Was ist da zu sehen? Die Farbskala gibt etwas, das ich Alters-Score genannt habe. Dabei habe ich die Altersgruppen aus den RKI-Daten so in Zahlen übersetzt:

    A00-A04 2
    A05-A14 10
    A15-A34 20
    A35-A59 47
    A60-A79 70
    A80+ 85
    unbekant ignoriert

    Das, was dabei rauskommt, mittele ich für alle berichteten Fälle innerhalb von 14 Tagen. Die robustere und ehrlichere Alternative wäre wahrscheinlich, da einen interpolierten Median auszurechnen, aber das habe ich schon deshalb gelassen, weil ich dann möglicherweise eine obere Grenze bei A80+ hätte annehmen müssen; so, wie es ist, ist es allenfalls ein Score, dessen Vergleichbarkeit zwischen Kreisen angesichts wahrscheinlich recht weit auseinanderliegender Altersverteilungen so la-la ist. Mehr Substanz als Uni- oder Mensarankings hat er aber auf jeden Fall (was kein starker Claim ist).

    Wirklich fummelig an dieser Visualisierung war, dass für weite Zeiträume in vielen Kreisen entweder gar keine Daten vorliegen, einfach weil es keine Infektionen gab, oder die Schätzung auf so wenigen Fällen beruht, dass sie recht wenig Bedeutung hat. Letzteres würde ein starkes Blubbersignal liefern, das in Wirklichkeit nur das Rauschen schlechter Schätzungen beziehungsweise schlecht definierter Verteilungen ist.

    Deshalb habe ich die Inzidenz in die Transparenz gesteckt; zwecks Abstand vom Hintergrund-Weiß fange ich dabei aber gleich bei 20% an, und weil mir 100 Fälle robust genug erscheinen, setze ich ab einer 14-Tage-Inzidenz von 100 auch 100% Deckung. Wo Daten ganz fehlen, male ich nur die Umrisse der Kreise.

    Was habe ich aus dem Film gelernt? Nun, offen gestanden erheblich weniger als aus dem Inzidenzfilm im letzten Post. Ich hatte eigentlich gehofft, dass (mit der derzeitigen Colourmap) ein dramatischer Umschwung von rötlich nach bläulich stattfindet, wenn Anfang 2021 die Impfungen in den großen Altenpflegeeinrichtungen anlaufen. Das ist aber allenfalls dann sichtbar, wenn mensch genau drauf aufpasst. Überhaupt hat mich überrascht, wie niedrig die Alters-Scores doch meist sind. Hätte ich vorher nachgedacht, hätten sowohl die Inzidenz-Heatmap des RKI wie auch einige Prosa zu den Altersverteilungen das allerdings schon stark nahegelegt, so etwa im letzten Wochenbericht des RKI:

    Von allen Todesfällen waren 79.101 (86%) Personen 70 Jahre und älter, der Altersmedian lag bei 84 Jahren. Im Unterschied dazu beträgt der Anteil der über 70-Jährigen an der Gesamtzahl der übermittelten COVID-19-Fälle etwa 13 %.

    – Corona war zwar von den Folgen her vor allem ein Problem ziemlich alter Menschen, getragen haben die Pandemie aber praktisch durchweg die jüngeren.

    Aufschlussreich ist vielleicht, dass die Kreise meist von Blau nach Rot gehen, Ausbrüche also bei relativ jungen Personen anfangen und sich zu älteren hinbewegen. Das ist schon beim Heinsberg-Ausbruch zu sehen, der mit einem Score von 36 anfängt (das hätte ich für einen Kappenabend nie vorhergesagt) und recht monoton immer weiter steigt. Bei etwa 55 habe ich ihn aus den Augen verloren. Diese, wenn mensch so will, Rotverschiebung ist ein recht häufig zu beobachtendes Phänomen in dem Film. Mein unheimlicher Verdacht ist ja, dass dabei die outgesourcten Putz- und Pflegekräfte, die im Namen der Kostenersparnis nicht selten als Kolonne durch mehrere Altenpflegeeinrichtungen hintereinander gescheucht werden, eine große Rolle gespielt haben.

    Recht erwartbar war, dass bei den „jungen“ Kreisen regelmäßig Unistädte auftauchen, Göttingen z.B. im ansonsten ruhigen Juni 2020, während gleichzeitig in Gütersloh die Tönnies-Wanderarbeiter deutlich höhere Alters-Scores haben – beeindruckend, dass diese die Schinderei in unseren Schlachthöfen in das bei diesem Ausbruch starke A35-A59-bin durchhalten.

    In dieser Ausprägung nicht erwartet hätte ich die grün-rot-Trennung zwischen West- und Ostdeutschland in der zweiten Welle, besonders deutlich im Januar 2021. Ein guter Teil davon wird sicher die Basisdemographie sein, denn arg viele junge Leute, die überhaupt krank werden könnten, gibt es in weiten Teilen Ostdeutschlands nicht mehr. Aber so viel anders dürfte das in vielen ländlichen Kreisen Westdeutschlands auch nicht sein. Hm. Ich brauche gelegentlich nach Alter und Kreis aufgelöste Demographiedaten für die BRD.

    Nehmen wir mal den Landkreis Hof, der im Juni 2021 in den fünf jüngsten Kreisen mitspielt: da würde ich eigentlich eine recht alte Bevölkerung erwarten. Der niedrige Score in der Zeit ist also be-stimmt Folge von, jaklar, den wilden Parties der Jugend, von denen wir schon im Sommer 2020 so viel gehört haben. Naughty kids.

    Mit anderen Worten: Ich habe leider keine sehr tiefen Erkenntnisse aus der Visualisierung gezogen. Wenn das, was da gezeigt ist, nicht ziemlich ernst wäre, könnte mensch sich immerhin an der lavalampenähnlichen Erscheinung freuen.

    Technics

    Nachtrag (2022-10-27)

    Der Code ist jetzt am Codeberg

    Das Umschreiben des Codes vom vorigen Post war eine interessante Übung, die insbesondere eine (vor dem Hintergrund der Empfehlung der Gang of Four, normalerweise eher über Komposition als über Vererbung nachzudenken) recht natürliche Anwendung von Vererbung mit sich brachte, nämlich in der Plotter-Klasse. Auch die Parametrisierung dessen, worüber iteriert wird (_iter_maps, iter_freqs, iter_age_scores) war, nun, interessant.

    Das Programm hat dabei eine (fast) ordentliche Kommandozeilenschnittstelle bekommen:

    $ python3 mkmovie.py --help
    usage: mkmovie.py [-h] [-d] [-i N] [-m ISODATE] {inc,age}
    
    Make a movie from RKI data
    
    positional arguments:
      {inc,age}             select what kind of movie should be made
    
    optional arguments:
      -h, --help            show this help message and exit
      -d, --design_mode     just render a single frame from a dict left in a
                            previous run.
      -i N, --interpolate N
                            interpolate N frames for one day
      -m ISODATE, --min-date ISODATE
                            discard all records earlier than ISODATE
    

    Damit entsteht der Film oben durch:

    $ python3 mkmovie.py --min-date=2020-02-20 -i 7 age
    

    Der aktuelle Code: mkmovie.py und corona.py.

  • Corona als Film

    Inzidenzen mögen nicht mehr das ideale Mittel sein, um die aktuelle Corona-Gefährdungslage zu beschreiben, auch wenn es zumindest so lange kaum ein schnelleres Signal geben wird, wie nicht flächendeckend PCR auf Abwässer läuft. Aber sie ist bei allen auch hier angemäkelten Defiziten und Ungenauigkeiten doch kaum zu schlagen, wenn es um ein nach Zeit und Ort aufgelöstes Bild davon geht, was das Virus – Verzeihung, die Viren – so getrieben haben.

    Und nachdem ich neulich angefangen hatte, mit dem großen Infektions-Datensatz des RKI zu spielen, ist mir aufgefallen, dass es ausgehend von dem dort diskutierten Code nicht schwierig sein sollte, einen Film zu basteln, der die Inzidenzverläufe auf Kreisebene visualisiert. Nun, das habe ich gemacht:

    (sollte euer Browser das vermurksen: Download; Kreispolygone: © GeoBasis-DE / BKG 2021). Im Unterschied zu den bekannten Bildern aus dem RKI-Bericht (die die Inzidenz nach dem Meldedatum rechnen) verwende ich hier übrigens das Referenzdatum, also wenn möglich das Datum der Infektion und nur andernfalls das Meldedatum.

    Nachtrag (2021-11-03)

    Nur damit sich niemand wundert, wie Herbst-Zahlen in einen Post vom August kommen: Ich habe den Film bis November 2021 fortgesetzt und werde ihn künftig wohl noch ein paar Mal aktualisieren.

    Ein paar Dinge, die ich daraus gelernt habe:

    • Es gab offenbar schon vor Heinsberg einiges an Corona-Rauschen in der Republik (am Anfang vom Video). Wie viel davon einfach Tippfehler sind, ist natürlich schwer zu sagen. Aber einiges wird schon real sein, und dann ist sehr bemerkenswert, dass es in keiner dieser Fälle zu einem klinisch auffallenden Ausbruch gekommen ist. Das wäre eine sehr deutliche Illustration der hohen Überdispersion zumindest des ursprünglichen Virus: fast alle Infizierten steck(t)en [1] niemanden an, so dass, solange die Ausbrüche klein sind, sie schnell wieder verschwinden.
    • Ich hatte ganz vergessen, wie schnell am Anfang der Pandemie die Folgen des Bierfests in Tirschenreuth die des Kappenabends in Heinsberg überrundet hatten (nämlich so um den 10.3. rum). Es lohnt sich, im März 2020 Ostbayern im Blick zu halten.
    • Die etwas brodelnde Erscheinung des Bildes speziell in ruhigeren Phasen – wie ein träge kochender Brei vielleicht, bei dem an mehr oder minder zufälligen Stellen immer mal wieder eine Blase hochkommt – zeigt wieder, dass sich Corona vor allem in Ausbrüchen ausbreitet. Das tut es bestimmt auch in weniger ruhigen Phasen, aber dann sind überall Blasen („sprudelnd kochend“), so dass das nicht mehr auffällt.
    • Die großen Ausbrüche des Sommers 2020 (vor allem Gütersloh und Dingolfing) waren erstaunlich allein stehende Ereignisse. Wenn mensch bedenkt, dass es ja schon einen Haufen Schlachthöfe und andere ähnlich furchtbare Betriebe in der BRD gibt, fragt sich schon, warum es nicht mehr Ausbrüche im Tönnies-Stil gab. Waren die anderen Läden alle vorsichtiger? Oder hatten die einfach Glück, weil niemand mit hoher Virusausscheidung in ihre Betriebshallen gekommen ist? Sind vielleicht Ausbrüche übersehen worden? Rein demographisch nämlich waren beispielsweise die Tönnies-Leute so jung und fit, dass nur wenige im Krankenhaus landeten und keineR gestorben ist.
    • Auch in den zweiten und dritten Wellen blieb erstaunlich viel Struktur im Infektionsgeschehen – mehr, als ich nach Betrachtung der statischen RKI-Plots und der relativ parallelen Bundesländer-Inzidenzen erwartet hätte, vor allem aber entgegen der Einlassung, das Geschehen sei „diffus“. Angesichts des weiter bestehenden „Brodelns“ würde mich eigentlich überraschen, wenn sich B.1.1.7 oder die B.1.617.x so viel anders ausbreiten würden als der ursprüngliche Wildtyp.
    • Insbesondere gibt es auch in den späteren Wellen Kreise, die kurz „hochbubbeln“ und dann auch wieder rasch unauffällig werden. Es wäre bestimmt aufschlussreich, wenn mensch wüsste, warum das mit dem Rasch-Unauffällig-Werden in den Kreisen in Südsachsen und -thüringen über lange Zeit nicht passiert ist.

    Technics

    Nachtrag (2022-10-27)

    Der Code ist jetzt am Codeberg.

    Es war übrigens doch nicht so ganz einfach, diesen Film zu machen, und zwar vor allem, weil ich eine Weile mit den Polygonen für die Kreise gerungen habe. Mein erster Plan war, die einfach aus der Openstreetmap zu ziehen. Ich wollte aber nicht an einem kompletten OSM-Dump herumoperieren, und so war ich sehr angetan von osm-boundaries. Mit diesem Dienst ließen sich eigentlich recht leicht die „administrative boundaries“ von Kreisen (das wäre dort Level 6) in geojson bekommen.

    Abgesehen davon aber, dass die interaktive Auswahl gerne mit „cannot download tree“ scheiterte, mein Webkit lange am Javascript kaute, und Cloudflare die Downloads regelmäßig zu früh abbrach (die MacherInnen von osm-boundaries verstehen das selbst nicht so ganz), sind die Label der Kreise doch sehr verschieden von dem, was das RKI hat: „Solingen (Klingenstadt)“ auf RKI-Seite war ebenso lästig wie fehlende Unterscheidung zwischen Stadt- und Landkreisen in den Bezeichnungen der Openstreetmap (was immerhin durch Betrachtung der Flächen zu umgehen war).

    Aber auch, als ich mir die Abbildung zwischen den verschiedenen Bezeichnern zusammengehackt hatte, blieben einige weiße Flecken, Kreise also, die ich in der Openstreetmap schlicht nicht finden konnte. An dem Punkt bin ich zur offiziellen Quelle gegangen, nämlich dem Bundesamt für Kartographie und Geodäsie, speziell zum VG2500-Datensatz, der zu meiner großen Erleichterung auch die Kreis-Identifier des RKI (1001 etwa für Flensburg-Stadt) enthält. Na ja, abgesehen von Berlin, das das RKI aufteilt, was wiederum etwas Gefummel zur Wiedervereinigung von Berlin im Code braucht.

    Aber leider: Der Kram kommt als Shape, wie das BKG sagt ein „De-facto-Industriestandard“, mit dem allerdings ich noch nie etwas zu tun hatte und der als über einige Dateien verteilte Binärsoße daherkommt. Immerhin: das Debian-paketierte Cartopy kann damit umgehen. Puh. Nur: frech add_geometries auf die Geometrien loslassen, die aus dem Reader herausfallen, führt zu einer leeren Karte.

    Im Folgenden bin ich etwas untergegangen in all den Referenzsystemen, mit denen sich die GeographInnen so rumschlagen müssen. Ach, haben wir es gut in der Astronomie. Ja, klar, auch wir haben einen Haufen verschiedene Äquatoren und Nullpunkte (z.B. zwei verschiedene Systeme für galaktische Koordinaten, und haufenweise historische äquatoriale Systeme, die zudem durch verschiedene Sternkataloge definiert waren): Aber letztlich sind das im Wesentlichen Drehungen mit winzigen Knitterungen, und schlimmstenfalls kommen die Dinge halt am falschen Platz raus, was für meine gegenwärtigen Zwecke völlig wurst gewesen wäre.

    Aber hier: Nichts auf der ganzen Karte. Es braucht beim Plotten zwingend das richtige Quell-Bezugssystem, hier (wie aus dem .prj des VG2500 hervorgeht) das EPSG-System Nummer 25832 (Fünfundzwanzigtausenachthundertzweiundreißig! Holy Cow!). Damit kann Cartopy sogar umgehen, aber es zieht dann bei jedem Programmlauf die Beschreibung des Systems erneut von einem Onlinedienst, und das geht in meiner Welt gar nicht. Deshalb habe ich mir geschwind eine Proj4Projection-Klasse gefummelt, die den String, der von dem Online-Dienst kommt, händisch in die zugrundeliegende Bibliothek packt. Warnung: Das ist ohne Sachkenntnis geschrieben; dass ich da die Gültigkeitsgrenzen völlig fake, ist vermutlich Gift außerhalb dieser spezifischen Anwendung.

    Der Rest des Codes ist harmloses Python, das die Eingabedaten hinmassiert. Weil die RKI-Daten leider nach Kreis und nicht nach Datum sortiert sind, muss ich den kompletten Datensatz ins RAM nehmen; auf nicht völlig antiker Hardware ist das aber kein Drama.

    Was für den optischen Eindruck noch ziemlich wichtig ist: Ich interpoliere linear zwischen den Tagen (die iter_interpolated-Funktion). Das ist nützlich, weil damit die Übergänge nicht so hart sind, und auch, damit der Film nicht nur 25 Sekunden (also rund 600 Frames) lang ist, sondern etwas wie zwei Minuten läuft.

    Wers nachbauen will oder z.B. Altersgruppen-spezifische Filme machen will oder welche mit dem Median des Alters – das würde der Datensatz durchaus hergeben – oder welche, die nicht alles über 350 saturiert darstellen oder so etwas, braucht mkmovie.py und corona.py. Die Quelldaten werden in einem in corona.py definierten externen Verzeichnis erwartet (DATA_DIR); welche, und woher die kommen, steht am Kopf von mkmovie.py.

    [1]Bei den späteren Virusvarianten mag es eingestandenermaßen nicht mehr ganz so einfach sein, weshalb ich hier so ein vorsichtiges Präteritum schreibe.
  • Keine Mauern mehr

    Das, was in Heidelberg wohl als „Heimatzeitung“ zu bezeichnen ist, die Rhein-Neckar-Zeitung, hat es in die heutige Deutschlandfunk-Presseschau geschafft, und zwar mit folgender patriotischen Erbauung:

    Es [was „es“ ist, bleibt im DLF-zitierten Kontext unklar] sollte auch Ansporn sein, diese Republik als den Idealzustand zu sehen. Wir leben im besten aller bisherigen deutschen Staaten – das bedeutet nicht, dass man ihn nicht verbessern kann. Aber Mauern müssen keine mehr eingerissen werden.

    Nun...

    Polizeigeschützte Mauer

    Der Abschiebeknast von Ingelheim, Stand 2009. Und auch wenn diverse Regierungen in Rheinland-Pfalz diese Mauern schon mal einreißen wollten, ist da zumindest bis 2019 nichts draus geworden.

  • Motivlage im Rassismus

    Unter den tiefautoritären Gesetzen, die die Parlamente in den letzten Jahren so durchgewunken haben, sind das Netzwerkdurchsetzungsgesetz und das daran angehängte „Gesetz zur Bekämpfung des Rechtsextremismus und der Hasskriminalität“ (vgl. hier im Januar) insoweit stilbildend, als sie das Konzept von Gedankenverbrechen weiter verdichten. Klar hat es schon vorher allerlei Gesetzgebung zur „Ehrabschneidung“ gegeben – die ganze Gegend von §185 bis §199 StGB etwa – aber in freieren Zeiten war eigentlich klar, dass das Gesetze sind, mit denen sich lediglich ewig gestrige Altverleger, humorlose Prälaten und vertrocknete Politiker gegen lustigen Kram der Titanic wehren und dabei nur noch blöder aussehen.

    Das NetzDG nun erklärt das alberne Rumposen wenig reflektierter Facebook-Produkte zur staatsgefährdenden Tat, ganz so, als sei das die Ursache für hunderte Nazimorde oder die allzu berechtigten Sorgen nicht ganz so Deutscher, in den Randgebieten der Zivilisation aufs Maul zu kriegen. Wegen dieser Fehlanalyse werden kommerzielle Plattformen als Hilfssherriffs eingespannt, fordert der Staat Zugriff auf Passwörter.

    Wie unsinnig das Narrativ von Facebook als Ursache rassistischer Gewalt ist, wird schön im Deutschlandfunk-Hintergrund vom 6.8. deutlich. Facebook ist, das jedenfalls nehme ich (nicht nur) aus dieser Geschichte mit, allenfalls die Echokammer. Die Quelle der Ressentiments hingegen sind Innenministerien, eine erschreckend breite Mehrheit der sich als „bürgerlich“ definierenden klassischen Medien, und leider auch nicht zu knapp viele Staatsanwaltschaften.

    Es lohnt sich durchaus, den ganzen Beitrag zu lesen (oder zu hören), aber die Geschichte in Kürze ist: Die Behördenleiterin des BAMF in Bremen hat tatsächlich die auch mit Rücksicht auf internationale Verpflichtungen relativ (zur Praxis) menschenfreundlichen Regelungen aus der Migrationsgesetzgebung umgesetzt. Daraufhin ist sie von der „lass uns das so rechtswidrig machen wie die anderen auch“-Fraktion in der eigenen Behörde abgesägt und durch wen ersetzt worden, die eher auf der menschenrechtsfeindlichen Linie der Innenministerien liegt.

    Um das ordentlich über die Bühne zu kriegen, wurde die korrekte Vorgängerin noch ein wenig angeschwärzt, was dann von der Staatsanwaltschaft begeistert und von der breiten Presse enthusiastisch aufgenommen wurde. Ein Skandal war geboren, der letztlich alle rassistischen und sexistischen Ressentiments bedient: Eine Bürokratin macht AusländerInnen zu Deutschen, wahlweise für Geld oder weil sie mit – klar: ausländischen – Anwälten anbandeln wollte[1].

    Diese abstruse Geschichte aus der rechten Mottenkiste („großer Bevölkerungstausch“ oder wie diese Leute das auch immer nennen) beschäftigte die Nation samt ihrer öffentlichen VertreterInnen für Wochen, und eigentlich niemand traute sich zu sagen, dass das schon von Anfang an rassistische Kackscheiße ist, denn selbst wenn jemand mal einen Hauch großzügiger duldete oder gar einbürgerte: Für wen – von verstockten RassistInnen mal abgesehen – wäre das eigentlich ein Problem, geschweige denn eines, für das irgendwer ins Gefängnis sollte?

    Wer solche Diskurse anfängt und lautstark anheizt, wer die rassistische Denke als Staatsraison markiert, darf sich nicht wundern, wenn autoritäre Charaktere die Logik dieser Staatsraison in private Gewalt umsetzen.

    Dass diese Umsetzung in private Gewalt stattfindet, ist seit dem Lübcke-Mord immerhin ansatzweise ins öffentliche Bewusstsein gelangt (mit 30-jähriger Verspätung). In dieser Situation und nachdem das ganze rechte Phantasma ums Bremer BAMF implodiert ist, wäre das Mindeste für die ProtagonistInnen der öffentlichen Hassrede damals, allen voran Stefan Mayer und Horst Seehofer, nun Familienpackungen von Asche auf ihre Häupter streuen. Aber nichts davon. Stattdessen, das kann ich zuversichtlich vorhersagen, folgt ganz gewiss der nächste Menschenrechtsabbau im Stil des NetzDG. Was weniger ärgerlich wäre, wenn die Vorlagen dazu nicht eben von den Hassrednern („hochkriminell, kollusiv und bandenmäßig“) in diesem Fall kommen würden.

    [1]Dass sich die Staatsanwaltschaft zu diesem rechten Urmotiv von „uns“ die Frauen raubenden Ausländermännern hat hinreißen lassen, ist übrigens nochmal ein ganz spezieller Skandal. Findet da auch 250 Jahre nach Kant überhaupt keine Aufklärung statt?
  • Post-Wettbewerb: Echt jetzt?

    Unter den Branchen, in denen Privatisierung am alleroffensichtlichsten Quatsch ist, sehe nicht nur ich die Post ganz vorne. Denn: Alle sollen die Post nutzen können, aber die Kosten für die Infrastruktur schwanken um Größenordnungen zwischen Metropole und Provinz. Unter solchen Bedingungen eine halbwegs gleichmäßige Abdeckung mit privatwirtschaftlichen Unternehmen herzustellen, wäre ein regulatorischer Kraftakt, der abgesehen von viel Zeitverschwendung am Schluss wieder darin enden würde, dass die Gewinne privatisiert und die Verluste sozialisiert werden – wovon nun wirklich niemand[1] was hat.

    Aber auch wer in der Stadt wohnt, muss sich fragen, welchen Zweck es wohl haben könnte, wenn statt des einen zuverlässigen, halbwegs ordentlich bezahlten und beamteten Postboten im Dienst der weiland Bundespost nun fünf arme Schlucker die Viertel abfahren, die alle mehr oder minder am Mindestlohn kratzen, im Akkord arbeiten und entsprechend unzuverlässig sind: Noch nicht mal die verbohrtesten Marktpriester wollten das rechtfertigen, wenn ich sie darauf angesprochen habe.

    Und dabei fange ich noch nicht mal beim Kulturverlust an. Vor der Privatisierung konnte das Postamt als Ausspielstelle des Staates fungieren, praktisch wie die Bürgerämter unserer Zeit, nur dichter gespannt. Heute korrelieren die Außenposten der Post im Wesentlichen mit Branchen wie Glücksspiel oder Restposten.

    Kurz: Wäre ich Marktpriester, der Postdienst wäre das letzte, über das ich reden wollte.

    Um so mehr hat mich der DLF-Hintergrund vom 4.8. überrascht, in dem Mischa Ehrhardt versucht, ein Problem auszumachen, weil „die Deutsche Post den Markt dominiert“, natürlich ohne zu sagen, wie ausgerechnet mehr Markt irgendeines der angesprochenen Probleme lösen könnte – und genau keine Stimme den offensichtlichen Weg nach vorne, nämlich die Rückverstaatlichung des Postdienstes, auch nur anspricht.

    Stattdessen wird Walther Otremba – nach einer Karriere als CDU-Mann, Staatsekretär im Finanz- und Militärministerium und Bahn-Aufsichtsrat jetzt Frühstücksdirektor und Lobbyist für die nichtpostigen Postklitschen, also die, die ihre AusträgerInnen im Schnitt noch mieser behandeln als die privatisierte Post – zitiert mit:

    Ich kann ja eigentlich die Deutsche Post AG nicht kritisieren. Die tut halt, was sie machen muss, nämlich versuchen, möglichst hohe Gewinne zu erzielen.

    Öhm… Warum genau soll die Post möglichst hohe Gewinne machen müssen? Ist nicht eigentlich völlig offensichtlich, dass Aufgabe der Post ist, möglichst flott und mit wenig gesellschaftlichem Aufwand Briefe zu transportieren (und dann vielleicht noch Postsparbücher zu betreiben und ggf. mit Postämtern in der Fläche auch ein paar staatliche Aufgaben in die Hand zu nehmen)? Wer, außer ein paar AnlegerInnen, hätte umgekehrt etwas davon, wenn sie möglichst hohe Gewinne machen würde? Wer also könnte das wollen oder die Post gar dazu zwingen?

    Wohlgemerkt, der Otremba, der da solche Klopfer durchs Radio schickt, war in seinen großen Zeiten (z.B. im „Finanzmarktstabilisierungsfonds“) einer der ganz großen Mover und Shaker. Bei derart verwirrten Gedanken muss wohl nicht mehr verwundern, was für eine Lachnummer (zuletzt bei Cum-Ex und Wirecard) die BaFin zumindest in Wirtschaftskreisen ist. Immerhin haben er und seine KollegInnen die ja erfunden.

    Es gäbe noch einige weitere komplett auf dem Kopf stehende Argumente in dem DLF-Beitrag zu korrigieren, so etwa die abseitige Kritik an der Quersubventionierung; natürlich will mensch z.B. Briefe durch Telefon quersubventionieren, wenn das gesellschaftlich geboten ist, was es zumindest früher mal war. Aber wichtiger wäre mir, noch Otrembas nächsten Satz zu prüfen, denn der spiegelt einen verbreiteten Irrglauben wider:

    Es sind die Rahmenbedingungen, die nicht geliefert wurden rechtzeitig, um im Briefgeschäft ähnliche Erfolge, wie zum Beispiel in der Telekommunikation, die ja parallel liberalisiert wurde, zu erzeugen

    „Erfolge“? In der Telekommunikation, in der halb-betrügerische Verträge mehr die Regel sind als die Ausnahme und die Verbraucherzentralen gar nicht mehr aus dem Klagen rauskommen? In der drei (oder sind es wieder vier?) Mobilfunknetze konkurrieren, so dass es die gleiche Infrastruktur in den Metropolen dreifach und dafür gar keine am Land gibt?

    „Aber es ist doch alles viel billiger geworden,“ höre ich euch einwenden. Nun – das ist es bereits vor der Privatisierung.

    Es gibt dazu eine ganz interessante Untersuchung von A. Michael Noll, in Telecommunications Policy 18 (5), 255f (1994): „A study of long distance rates. Divestiture revisted“ (DOI 10.1016/0308-5961(94)90051-5; sorry, ist Elsevier). Wohlgemerkt: das ist 1994 erschienen; wir hätten also in der BRD vor der Zerschlagung der Bundespost davon lernen können. Jaja, die Auflösung von AT&T in den USA, die Noll da untersucht, war nicht exakt eine Privatisierung, aber sie war in Anlage und Ziel nicht wesentlich anders, und sie war auch die Blaupause für all die anderen marktradikalen Kreuzzüge gegen staatliche Daseinsvorsorge im Kommunikationsbereich.

    Ein Ergebnis seiner Arbeit: Die Preise für Ferngespräche folgten über fast 100 Jahre einem Abwärtstrend, nur kurz unterbrochen von einer Panikphase vor der Öffnung des Wettbewerbs im Jahr 1984:

    Fallender Graph

    Fig. 1 aus doi:10.1016/0308-5961(94)90051-5: Kosten für Ferngespräche in den USA, 1910 bis ca. 1995. Der Wettbewerb hat nicht für rascher fallende Preise gesorgt. Rechte leider bei Elsevier.

    Wenn ihr in anderen Papern seht, dass nach der Zulassung von Konkurrenz die Preise ganz schnell gefallen sind: hier ist der Hintergrund. Dazu kommt übrigens noch, wie die Wikipedia zum Ende des Bell-Systems schreibt:

    One consequence of the breakup was that local residential service rates, which were formerly subsidized by long-distance revenues, began to rise faster than the rate of inflation.

    Also: Nicht nur sind die Ferngespräche nicht schneller billiger geworden als vorher – Überschüsse aus ihnen sind auch nicht mehr in die Grundversorgung geflossen, so dass diese teuerer wurde. Statt dieser (ebenfalls sinnvollen) Quersubventionierung ging das Geld stattdessen an InvestorInnen (also: „die Reichen“) und öffentliche Belästigung (also: „Werbung“). Bei Noll sieht das so aus:

    Steigender Graph

    Fig. 4 aus doi:10.1016/0308-5961(94)90051-5: Marketingkosten von AT&T zwischen 1970 und 1993. Mit der Ende staatlicher Regulierung ging Geld statt in die Grundversorgung in die Werbung. Rechte leider bei Elsevier.

    Die Geschichte von den fallenden Preisen durch Privatisierung kehrt sich also in ihr Gegenteil.

    Nein: Was dafür gesorgt hat, dass Leute jetzt für in etwa das gleiche Geld viel mehr telefonieren können als, sagen wir, 1995, nennt sich technischer Fortschritt, in diesem Fall insbesondere die (von öffentlich finanzierten Unis und Instituten aufs Gleis gesetzte) stürmische Entwicklung paketvermittelter Netze – was nicht nur das Internet war. Ja, kann sein, dass deren Einführung mit der alten Bundespost etwas länger gedauert hätte, zumal, wenn Leute wie Otrembas Parteifreund Christian Schwarz-Schilling sie als Selbstbedienungsladen nutzten.

    Aber wärs wirklich so schlimm gewesen, wenn wir das Klingelton-Zeitalter übersprungen hätten und stattdessen nicht Öko- und Sozialkatastrophen (die Mobiltelefone nun mal sind) als Werbegeschenke windiger Knebelvertraghöker abwehren müssten?

    [1]Außer ein paar AnlegerInnen, UnternehmensberaterInnen und GeschäftsführerInnen; aber das darf guten Gewissens als Fehlsteuerung durch Marktkräfte eingeordnet werden.
  • Falscher Instinkt

    Ausschnitt aus dem RKI-Bericht von heute

    Anlass meiner Paranoia: Im RKI-Bericht von heute drängeln sich verdächtig viele Kreise gerade unter der 50er-Inzidenz.

    Mein Abgesang auf die RKI-Berichte von neulich war wie erwartet etwas voreilig: Immer noch studiere ich werktäglich das Corona-Bulletin des RKI. Es passiert ja auch wieder viel in letzter Zeit. Recht schnell schossen die ersten Landkreise im Juli über die 50er-Schwelle, während die breite Mehrheit der Kreise noch weit von ihr entfernt war. Das ist, klar, auch so zu erwarten, wenn die „Überdispersion“ (find ich ja ein komisches Wort für „die Verteilung der Zahl der von einem_r Infizierten Angesteckten hat einen langen Schwanz nach oben hin“, aber na ja) noch irgendwie so ist wie vor einem Jahr, als, wie im inzwischen klassischen Science-Artikel von Laxminarayan et al (DOI 10.1126/science.abd7672) auf der Grundlage von Daten aus Indien berichtet wurde, 5% der Infizierten 80% der Ansteckungen verursachten (und umgekehrt 80% der Infizierten gar niemanden ansteckten): SARS-2 verbreitete sich zumindest in den Prä-Alpha- und -Delta-Zeiten in Ausbrüchen.

    Nachdem aber die ersten Landkreisen die 50 gerissen hatten, tat sich für eine ganze Weile im Bereich hoher Inzidenzen nicht viel; auch heute sind nur drei Landkreise über der 50er-Inzidenz, während sich knapp darunter doch ziemlich viele zu drängen scheinen.

    Und da hat sich ein Verdacht in mir gerührt: Was, wenn die Gesundheitsämter sich mit Händen und Füßen wehren würden, über die vielerorts immer noch „maßnahmenbewehrte“ 50er-Schwelle zu gehen und ihre Meldepraktiken dazu ein wenig… optimieren würden? Wäre das so, würde mensch in einem Histogramm der Inzidenzen (ein Häufigkeit-von-Frequenzen-Diagram; ich kann die nicht erwähnen ohne einen Hinweis auf Zipfs Gesetz) eine recht deutliche Stufe bei der 50 erwarten.

    Gibt es die? Nun, das war meine Gelegenheit, endlich mal mit den Meldedaten zu spielen, die das RKI bereitstellt – zwar leider auf github statt auf eigenen Servern, so dass ich mit meinen Daten statt mit meinen Steuern bezahle (letzteres wäre mir deutlich lieber), aber das ist Jammern auf hohem Niveau. Lasst euch übrigens nicht einfallen, das ganze Repo zu klonen: Das sind ausgecheckt wegen eines gigantischen Archivs krasse 24 GB, und was ihr tatsächlich braucht, sind nur die aktuellen Zahlen (Vorsicht: das sind auch schon rund 100 MB, weil das quasi die ganze deutsche Coronageschichte ist) und der Landkreisschlüssel (vgl. zu dem Update unten).

    Auch mit diesen Dateien muss mensch erstmal verstehen, wie aus deren Zeilen die Inzidenzen werden, denn es ist nicht etwa so, dass jede Zeile einer Erkrankung entspricht: Nein, manche berichten mehrere Fälle, es wird nach schon gemeldeten und ganz neuen Fällen unterschieden, und eventuell gibts auch noch Korrekturzeilen. Dazu findet ein in-band-signalling zu Gestorbenen und Genesenen statt. Lest das README aufmerksam, sonst verschwendet ihr nur (wie ich) eure Zeit: EpidemiologInnen denken ganz offenbar etwas anders als AstronomInnen.

    Das Ergebnis ist jedenfalls das hier:

    unverdächtig aussehendes Histogramm

    Ich muss also meinen Hut essen: Wenn da irgendwo Hemmschwellen sein sollten, dann eher knapp unter 40, und das ist, soweit ich weiß, in keiner Corona-Verordnung relevant. Na ja, und der scharfe Abfall knapp unter 25 könnte zu denken geben. Aber warum würde jemand bei der 25 das Datenfrisieren anfangen? Der Farbe im RKI-Bericht wegen? Nee, glaub ich erstmal nicht.

    Wenn ihr selbst mit den RKI-Daten spielen wollt, kann euch das Folgende vielleicht etwas Fummeln ersparen – hier ist nämlich mein Aggregationsprogramm. Ich werdet die Dateipfade anpassen müssen, aber dann könnt ihr damit eure eigenen Inzidenzen ausrechnen, ggf. auch nach Altersgruppen, Geschlechtern und was immer. In dem großen CSV des RKI liegt in der Tat auch die Heatmap, die jetzt immer im Donnerstagsbericht ist. Reizvoll fände ich auch, das gelegentlich zu verfilmen…

    Hier jedenfalls der Code (keine Abhängigkeiten außer einem nicht-antiken Python). So, wie das geschrieben ist, bekommt ihr eine Datei siebentage.csv mit Landkreisnamen vs. Inzidenzen; die entsprechen zwar nicht genau dem, was im RKI-Bericht steht, die Abweichungen sind aber konsistent mit dem, was mensch von lebenden Daten erwartet:

    # (RKI-Daten zu aktuellen 7-Tage-Meldeinzidenzen: Verteilt unter CC-0)
    import csv
    import datetime
    import sys
    
    LKR_SRC = "/media/incoming/2020-06-30_Deutschland_Landkreise_GeoDemo.csv"
    INF_SRC = "/media/incoming/Aktuell_Deutschland_SarsCov2_Infektionen.csv"
    LANDKREIS = 0
    MELDEDATUM = 3
    REFDATUM = 4
    NEUER_FALL = 6
    ANZAHL_FALL = 9
    
    
    def getcounts(f, n_days=7):
        counts = {}
        collect_start = (datetime.date.today()-datetime.timedelta(days=n_days)
            ).isoformat()
        sys.stderr.write(f"Collecting from {collect_start} on.\n")
    
        row_iter = csv.reader(f)
        # skip the header
        next(row_iter)
    
        for row in row_iter:
            if row[MELDEDATUM]>=collect_start:
                key = int(row[LANDKREIS])
                kind = row[NEUER_FALL]
                if kind!="-1":
                    counts[key] = counts.get(key, 0)+int(row[ANZAHL_FALL])
    
        return counts
    
    
    def get_lkr_meta():
        lkr_meta = {}
        with open(LKR_SRC, "r", encoding="utf-8") as f:
            for row in csv.DictReader(f):
                row["IdLandkreis"] = int(row["IdLandkreis"])
                row["EW_insgesamt"] = float(row["EW_insgesamt"])
                lkr_meta[row["IdLandkreis"]] = row
    
        return lkr_meta
    
    
    def main():
        lkr_meta = get_lkr_meta()
        with open(INF_SRC, "r", encoding="utf-8") as f:
            counts = getcounts(f)
    
        with open("siebentage.csv", "w", encoding="utf-8") as f:
            f.write("Lkr, Inzidenz\n")
            w = csv.writer(f)
            for lkr in lkr_meta.values():
                w.writerow([lkr["Gemeindename"],
                    1e5*counts.get(lkr["IdLandkreis"], 0)/lkr["EW_insgesamt"]])
    
    
    if __name__=="__main__":
        main()
    

    Nachtrag (2021-08-13)

    Eine Woche später ist der Damm definitiv gebrochen. Von drei Landkreisen über dem 50er-Limit sind wir laut aktuellem RKI-Bericht jetzt bei 39, wobei allein seit gestern 10 dazukamen. An die aktuelle Verteilung würde ich gerne mal eine Lognormalverteilung fitten:

    noch unverdächtiger aussehendes Histogramm

    Nicht, dass ich eine gute Interpretation hätte, wenn das lognormal wäre. Aber trotzdem.

    Nachtrag (2021-09-08)

    Das RKI hat die Landkreis-Daten (2020-06-30_Deutschland_Landkreise_GeoDemo.csv) aus ihrem Github-Repo entfernt (commit cc99981f, „da diese nicht mehr aktuell sind“; der letzte commit, der sie noch hat, ist 0bd2cc53). Die aus der History rausklauben würde verlangen, das ganze Riesending zu clonen, und das wollt ihr nicht. Deshalb verteile ich unter dem Link oben die Datei unter CC-BY 4.0 International, mit Namensnennung… nun, Destatis wahrscheinlich, oder halt RKI; die Lizenzerklärung auf dem Commit ist nicht ganz eindeutig. Als Quelle der Geodaten war vor der Löschung https://www.destatis.de/DE/Themen/Laender-Regionen/Regionales/Gemeindeverzeichnis/Administrativ/Archiv/ angegeben, aber da finde ich das nicht.

  • Long live PGP

    The other day I ran into two rants against PGP, What's the matter with PGP?, which still is relatively reasonable, and then the raving PGP Problem by people running a security consulting shop called Latacora. It's this second diatribe that made me write this post, because the amount of badmouthing of PGP done there, on the blog of a company promising to teach startups “security“ on top, is not only unwarranted, it's also actively damaging to meaningful encryption.

    Let me start with what I think are the fundamental fallacies of the Latacora folks is: They seem to think that identity, and hence key management, is something that others can do for you, and that thinking about crypto is “bad user experience“. In contrast, I'd argue that crypto you don't notice isn't crypto at all (but instead somewhere on the obfuscation spectrum), and that identity management done by others is equivalent to them encrypting for you.

    You see, if you're encrypting something, you're encrypting it for someone. In public key encryption, this “someone“ has two aspects: a real-world entity (your friend, a bank, whatever), and a public key. Any crypto system that does not make this separation transparent and asks you the question of how well you think the two things match (and whether you care), is fundamentally broken. That's because that question plainly has to be answered. If it's not you who answers it, it's someone else. And hence that someone else is free to change the mapping from key to real-world entity, and hence they determine which real-world entity gets to read what you've encrypted.

    This, by the way, is how https is regularly subverted by businesses, anti-virus software, and occasionally state actors, who simply make your browser trust their word on who is what. At that moment, they can inspect everything your browser exchanges with the rest of the world, be it in “anti-virus portals” or bluntly in surveillance systems. This is also why very few users of “encrypted” messengers would even notice if the operating company snooped on them.

    The big advantage of PGP is what the Latacora people call „obnoxious UX“. Yes, you have to make up your mind on keys, yes, you have to explicitly manage them: but that is what you need to understand if you want meaningful encryption, and plastering abstractions on top of that only gives extra levels people have to understand – and that can break. No: if you want to do encryption, you'll have to understand key management, and PGP makes that as explicit and transparent as any crypto system I've ever seen. That's a feature, not a bug.

    Actually, this one thing is far more important than regular key rotation (as an aside: I'm not aware of anyone ever having broken a PGP secret key because too much material has been encrypted using it; it's certainly not a major reason for failing encryption) or the latest cryptographic primitives (even 1024 bit RSA keys still require serious investment to break, 20 years after they've been state of the art).

    More generally, the scenarios requiring frequent key rotation mostly imagine a targeted attack from a state actor, following you into hotel rooms to steal your secret key and install key loggers to skim your passphrase (or similar). Frankly: it's an illusion to believe a muggle (or even normal wizards doing their daily work) could withstand such a determined and comptentent state actor for a long time.

    But that's not necessary. It's already great progress if Google, the (normal) police, and the people at your employer's computation centre can't read the content of your mails unless they really try hard. Actually, most “adversaries” are not terribly determined and/or terribly competent. You hence don't need a perfect cryptosystem. It just needs to withstand the most basic of man-in-the-middle attacks (which fends off the not terribly competent adversaries), and it needs to require at least a bit of individual effort to break each person's crypto (which fends off the not terribly determined ones). Any system with centralised identity management fails at least on the side of the individual effort – get the central entity to collude, or break it, and you have it all. And given the central entity at least legally sits somewhere if it's commercial, at least for the state of residence it fails the withstand-most-basic criterion as well: The average state has no trouble obtaining court orders as soon as it moans “terrorism”.

    PGP, on the other hand, does a fairly good job on both counts once people have grokked it, at least a much better one than anything SSL-based I've ever seen. People can understand the basic operations of PGP if they want, something that is much harder with SSL and X.509. The problem is that few people want to understand that. But in that case, any kind of crypto is doomed. Hence, the problem isn't PGP, it is, as so often, education. Working on that is effort well spent, as once people have understood PGP to the level of confidently using it, they have a much better chance of being able to competently use other, less explicit crypto systems.

    Having said that: sure, PGP and its UIs could be improved. But you can't get around PGP's long-term keys for e-mail, and whatever alternative you'd come up with, you'll still need keyrings and reasonable UIs to mark up the trust in there. And, in particular, you'll still need open standards so you don't have to take a single company's word for what it does.

    That's basically where I think Latacora's arguments are harmful. But since most of the claims in the article are fairly outrageous, I can't resist commenting them, too:

    • “Absurd Complexity“ – that's not a terribly credible charge given the page comes over HTTPS, which in many ways is a lot more complex than OpenPGP, in particular because it contains the nightmare that is X.509. But really: Much as I am all for reducing complexity, I'm even more for maintaining backward compatibility. Being able to read encrypted mails I got in the 1990ies matters to me, and anything flexible enough to at least support modern crypto and deal with archive data will have to have a certain amount of complexity. Start something new, and in 10 years it'll look the same. Or worse. Only it won't be able to read archival data, and it'll have repeated the history of early bugs software simply has, in particular when you have to worry about side channel attacks.
    • “Swiss Army Knife“ – that would be more convincing if they said how exactly PGP signatures are “mediocre“ or the encryption is a “pretty bad job“. I accept the argument they make a bit down that people may want to have forward secrecy in IM and it's easy to have there, so going for PGP alternatives may be a good idea there. But then I can't remember the last time I used PGP over XMPP, so these alternatives have existed for a long time, without any need to kill PGP.
    • “Mired in Backwards Compatibility“ – well, as said above, backwards compatiblity is great if your systems live a long time. And OpenPGP is doing a reasonable job to have both backwards compatiblity and evolvability. That rolling out new features isn't instantaneous, in particular for a federated, largely volunteer effort, is useless criticism: Build another distributed, open, volunteer effort, and it'll go the same way. Oh, and just incidentally: HTTPS is from the nineties, too, and the X.509 standard was published in 1988.
    • ”Obnoxious UX“, “Long-Term Secrets“, “Incoherent Identity“ – these are the core of Latacora's fallacies; see above.
    • “Broken Authentication“ – I can't say I've thought through the problem they're pointing to here; if it is as bad as they claim, there's no reason not to fix it within OpenPGP rather than invent something entirely new.
    • “Leaks Metadata“ – sure. As long as there's SMTP, there's no way around having quite a bit of cleartext: intermediate mail servers will have an idea who's mailing whom (though of course there's still Mixmaster). Having e-mail, or at least something that doesn't require me to be always online, is so important that the metadata leaks are an almost negligible price to pay, at least compared to the fine-grained activity profile you leak when you leave your phone online all the time, or the loss of control when you (or people you trust) can't run the necessary infrastructure components (as in: a mail server) any more.
    • ”No Forward Secrecy“ – fair enough, but again that's hard to have in store-and-forward e-mail, in particular when you'd like to have mailing lists and the like. Of course, it's true that »[a]gainst serious adversaries and without forward secrecy, breaches are a question of “when”, not “if”.« But on the other hand, most serious adversaries lose interest in the cleartext hours, weeks, or at worst a few years after the communication, or at least stop being terribly serious. So, for these intents and purposes holding …
  • Ökumenische Linke

    Ich bin bekennender Fan von David Rovics. Klar fühlen sich seine Palästinasoli-Songs in der postantideutschen Linken zumindest mal gewagt an, sein Lied vom besseren Anarchisten entschuldigt vielleicht etwas sehr viel, und mein antimilitaristisches Herz blutet an einigen Stellen vom Song for Hugh Thompson (der übrigens schon am Deutschlandfunk lief). Aber in allen Kämpfen, in denen es eine richtige Seite gibt, steht er konsequent auf dieser, und ich finde viele seiner Lieder ernsthaft mitreißend, angefangen wohl mit dem Bluegrass-Reißer When the Minimum Wage Workers Went on Strike, das eine (letztlich leider wenig erfolgreiche) Organisierung von MindestlöhnerInnen an der Harvard University begleitete, während ich so um 2000 rum in der Gegend gearbeitet habe. Damals wurde ich auf David aufmerksam, und es spricht für seine Umtriebigkeit, dass später ganz unabhängig davon Bekannte von mir Auftritte von ihm in Heidelberg organisiert haben.

    Nun, David hat jetzt einen Blogpost geschrieben, der mir in vielerlei Hinsicht aus der Seele spricht: Confessions of an Ecumenical Leftist. Wer hinreichend gut Englisch kann und sich für linke Politik interessiert, sollte das, finde ich, lesen.

  • Die Gewinne privatisieren, die Verluste sozialisieren

    Selbst die verbohrtesten Marktradikalen erinnern sich plötzlich an „die Gesellschaft“, wenn irgendwo Verluste drohen; die Privatisierung von Profiten (z.B. Mobiltelefonie oder Postdienst in Städten) bei Sozialisierung von Verlusten (z.B. Mobiltelefonie oder Postdienst auf dem Land) ist Grundpfeiler des „Neoliberalismus“[1].

    Ein schönes und halbwegs aktuelles (November 2019) Beispiel ist die „Mobilfunkstrategie“ des Bundes, der 1.1 Milliarden Euro ins Schließen von Funklöchern stecken will; vernünftig wäre ja, statt dreier löchriger privater ein flächendeckendes öffentliches Netz zu betreiben, bei dem die TelefoniererInnen in den Städten die am Land subventionieren würden. Aber das würde die religiösen Gefühle der Marktgläubigen verletzen. Das geht nicht.

    Das Prinzip der Sozialisierung von Verlusten hat heute morgen ein Jörg Asmussen, seines Zeichens „Hauptgeschäftsführer beim Gesamtverband der Deutschen Versicherungswirtschaft” (was tut eigentlich ein Hauptgeschäftsführer, das ein Geschäftsführer nicht tut?), in entwaffnender Ehrlichkeit illustriert, als er in einem Deutschlandfunk-Interview erklärte:

    Um von hinten anzufangen: Ein Prozent der Gebäude ist in der Tat nicht versicherbar gegen Elementarschäden. Da muss man sicher eine gesamtgesellschaftliche Lösung finden. 99 Prozent sind versicherbar und, ich glaube, auch zu akzeptablen Kosten. [...] Das Ein-prozent-Problem ist in der Tat existent.

    Im Klartext: Mit 99% der Häuser können wir ein Geschäft machen – zumal wir bei denen ohnehin nur sehr selten bezahlen müssen –, das restliche Prozent – die nämlich, bei denen erwartbar Schäden eintreten, die Einzelpersonen regelmäßig überfordern – lohnt sich nicht für uns, die soll der Staat übernehmen. Klingt das nur in meinen Ohren so dreist?

    Wobei Versicherungen natürlich insgesamt so ein Thema sind. Das Land Baden-Württemberg zum Beispiel hat sich, als ich das letzte Mal damit zu tun hatte, grundsätzlich nicht versichert, und die Argumentation ging etwa so: Wir sind so groß, dass jede Sorte Schadensfall fast sicher auftritt. Damit kann uns aber eine Versicherung gar keine Wette gegen dessen Eintreten[2] anbieten, die für uns vorteilhaft ist. Daher gleichen wir solche Schäden lieber gleich intern aus. Das spart Geld, weil zwischen Geldquelle (Land BaWü) und Geldsenke (Land BaWü) nicht noch die Versicherung ihre Kosten und ihren Profit abschöpft.

    Das ist (modulo Bürokratiedefizite) exakt richtig: Versicherungen sind ganz schlicht eine kostspielige Art, Mängel im gesellschaftlichen Solidarsystem auszugleichen. Wenn das Land den Solidargedanken von seinem Apparat auf alle BügerInnen ausweiten würde, könnten wir einen Haufen Arbeitsplätze einsparen: Die von VersicherungsvertreterInnen, von den Leuten, die deren Werbung designen, die vieler der Leute, die die „Schadensregulation“ behandeln, die der Leute, die die hässlichen Versicherungs-Hochhäuser bauen und so fort.

    Zugegeben: Dieser klare Gedanke wird bei, sagen wir, Haftpflicht-Versicherungen in der Realität an sinnlosen, aber bis zum Ausbau des Bildungswesens wahrscheinlich unvermeidlichen Neid- und Missgunstdebatten („was muss der Typ auch heimwerken?“) scheitern. Speziell bei Naturkatastrophen ist das jedoch ersichtlich kein (großes) Problem: Die generelle Hilfsbereitschaft ist eigentlich immer so groß, dass der Staat in diesen Fällen weit besser und billiger arbeiten wird als Versicherungen, während zwischen Katastrophen keine Grundkosten für den Verkauf und die Verwaltung von Policen anfallen.

    Tatsächlich ist aber die Ablehnung, die 1% zu versichern, die es wirklich bräuchten, nicht nur frech, sondern auch ganz realistisch. Denn angenommen, wir haben die Fluten der letzten Wochen und noch einen Faktor 10 drauf – sowas kommt ganz sicher irgendwann, und wenn es ein explodierendes Eifelmaar ist: Selbst eine Allianz würde damit nicht fertig. Das kann nur eine Gesellschaft als Ganzes schultern, und das Aufräumen und Wiederaufbauen ist nicht durch Sparen und Kapitalanlage hinzubekommen. Sowas geht nur durch aktuelle Arbeitskraft und mithin dem, was bei der Rente „Umlageverfahren“ heißt.

    Die Versicherer können also mit größeren Naturkatastrophen gar nicht wirklich umgehen. Verlangt ja auch niemand, der/die ganz bei Trost ist. Nur sollen sie dann bitte auch nicht daran (und der Angst vor ihnen) verdienen wollen.

    [1]Das steht hier in Anführungszeichen, weil der – ganz nebenbei von sehr autoritären HerrscherInnen wie Pinochet, Thatcher und Reagan durchgesetzte „Neoliberalismus“ dem zwar schon etwas ramponierten, aber an sich doch ganz akzeptablen „liberal“ einen wirklich hässlichen Klang gibt. Das ist übrigens eine interessante Sorte von missglückter Antisprache, die auch mal einer Untersuchung harrt.
    [2]Ja, eine Versicherungspolice kann sehr gut als Wette analysiert werden: Die Versicherung wettet, dass ein Ereignis nicht eintritt (z.B. ein Unfall bei einer Unfallversicherung; oder ein später Tod bei einer Rentenversicherung). Wenn sie gewinnt, streicht sie die Prämien ein. Verliert sie die Wette, muss sie die Versicherungssumme zahlen. In diesem Sinne wären Versicherungen, die einen großen Zirkus bei der Schadensregulierung machen, einfach schlechte Verlierer…
  • Sport ist rechts

    Die titelgebende These wirkt in dieser knappen und etwas apodiktischen Form vermutlich etwas steil, zumal blütenreine Linke wie Klaus Theweleit Fußballfieber gestehen und weniger prominente, aber nicht minder glaubhafte Linksradikale als Ultras hingebungsvoll Fahnen schwingen. Zwischen den sportlichen Großevents des Jahres – Männerfußball in Europa und Südamerika sowie die Olympiade – möchte ich dennoch gerne für sie argumentieren, engelszünglend eintretend für jedenfalls ein wenig ironische Distanz zu Leistungshunger und Hymnenkult.

    Zu meiner Untersuchung der These braucht es eigentlich nur eine Arbeitsdefinition von „links“ oder „fortschrittlich“. Spätestens seit der französischen Revolution hat sich da „den Grundwerten Freiheit, Gleichheit und Solidarität[1] zu gleichen Teilen verpflichtet“ bewährt. Vorsorglich: Natürlich gibt es vieles, das diese Grundwerte fast gar nicht berührt. Die Entscheidung zwischen Musik von Richard oder einem der Johann Sträuße zum Beispiel, oder die zwischen Toast- und Vollkornbrot. Das ist dann „unpolitisch“, jedenfalls, solange mensch nicht allzu tief bohrt.

    „Sport“ allerdings – im durch Sportfernsehen und -vereine bestimmten Sinn – kollidiert recht fundamental mit jedem einzelnen Grundwert. Das erklärt auch zwanglos, warum SportfunktionärInnen ziemlich durchweg rechts denken (Ausnahmen wie die Crew St. Pauli bestätigen die Regel eben durch ihre Exotik) und auch entsprechend organisiert sind. Mein Lieblingsbeispiel dafür bleibt Gerhard Mayer-Vorfelder, zu verschiedenen Zeiten seines Lebens DFB-Chef und persönlicher Referent des Nazirichters Filbinger.

    Gegen Freiheit

    Der erste Gedanke bei Sport vs. Freiheit könnten die vielen barocken Regeln der meisten Sportarten sein. Um mal eine Maßstäbe setzende Norm zu erwähnen: bis 2012 durften Frauen nur in Bikins mit auf ein paar Zentimeter begrenzter Breite des Beinstegs Beachvolleyball spielen (kein Scheiß). Aber nein, solange Menschen sich freiwillig auf Regeln einigen, wäre daran wenig zu kritisieren. Wo Menschen gezwungen werden, Sport zu treiben und die Regeln deshalb keine Gegenstände von Aushandlung mehr sind, ist das Problem nicht im Sport, sondern in den externen Zwangssystemen.

    Nein, wer über Freiheit und Sport nachdenken will, möge ans Heidelberger Neckarufer kommen, wenn gerade Rudertraining ist: Der Kasernenhofton der TrainerInnen lässt keinen Raum für Zweifel[2]. Das ist am Fußballplatz nicht anders als in der Gymnastikhalle oder im Schwimmbad: Der Ton ist immer der von Befehl und Gehorsam. Bei Mannschaftssportarten kommen auch mal zusätzliche Befehlsebenen hinzu, Kapitäne im Fußball etwa, die Gehorsam erwarten und im Zweifel durchsetzen müssen, wenn sie ihren Job behalten wollen.

    Der militärische Drill skaliert zu den bedrückenden Masseninzenierungen sich synchron bewegender TurnerInnen bei Feierlichkeiten autoritärer Regimes zwischen IOK und SED. Das hat, a propos Turnen, Methode; Turnvater Jahn war glühender Patriot und Militarist und verstand seine Turnerei durchaus als paramilitärisches Training mit dem Ziel der Ablösung der ja noch halbwegs fortschrittlichen Potentaten von Napoleons Gnaden durch – nun, de facto jedenfalls die erzreaktionären Regierungen des Vormärz.

    Gehorsam und Schleiferei als Antithesen zur Freiheit sind im Sport kein Einzelfall. Sie sind von Anfang an dabei und prägen das Geschehen um so mehr, je mehr etwas Sport (und nicht vielleicht Spiel, Spazierengehen, Wohinfahren, Beetumstechen, Staubwischen) ist.

    Gegen Gleichheit

    Zum Gegensatz von Sport und Gleichheit ist zunächst wegen Offensichtlichkeit nicht viel zu sagen: in praktisch jeder Sportart geht es darum, wer der/die „BessereN“ sind. Tatsächlich könnte der Wettkampf geradezu als Definition von Sport gelten: Es ist nicht sehr übertrieben, die Grenze zwischen auf Schlittschuhlaufen (kein Sport) und Eiskunstlauf (Sport) dort zu ziehen, wo RichterInnen mit ihren Zahlentäfelchen auftauchen und jedenfalls letztendliche AdressatInnen der Handlungen auf dem Eis sind.

    Wettbewerb charakterisiert Sport auch dann, wenn das private „Sport machen“ – joggen gehen, vielleicht auch mal in die Muckibude – davon eingestandenermaßen nur peripher betroffen sein mag. Selbst dabei scheint die Motivation allerdings oft genug in der Besserstellung in diversen Konkurrenzsituationen (im Zweifel bei der Brautwerbung) zu liegen.

    Sport als Verpackung für Wettbewerb hat übrigens Auswirkungen auf die Gesamtgesellschaft, beispielsweise wenn das positive Image von Sport über schräge Metaphern regelmäßig ansonsten offensichtlich schädliche Politiken („Exportweltmeister“ ist vielleicht das furchtbarste Beispiel) rechtfertigt.

    Die Übersteigerung von Ungleichheit ist der Heldenmythos, bei dem ein einzelner (meist) Mann alle anderen hinter sich lässt und breiteste Bewunderung erfährt. Selbst in China bin ich schon auf Franz Beckenbauer angesprochen wurden, und selbst wenn die Beatles nicht beliebter als Jesus sein sollten, Diego Maradona ist es garantiert. Diese Malaise des Sportbetriebs zumindest haben die ArbeitersportlerInnen während der Weimarer Republik erkannt. Diese betrieben damals im Fußballbereich eine breite alternative Liga gegen den bereits gewohnt rechtslastigen DFB und bemühten sich in der Berichterstattung um mehr Gleichheit:

    man lehnte den „Starkult“ ab, verweigerte „Rekordjagden“, wollte keine „Kanonenzuchtanstalt“ sein. Deshalb wurden viele Jahre gar keine Spielernamen veröffentlicht. In der Presse nannte man stattdessen z. B. „den Rechtsaußen“ oder „den Mittelstürmer“.

    Zu August Postler auf arbeitersport.de

    Empfehlen möchte ich in diesem Zusammenhang die SWR2 Wissen-Sendung vom 29.6.2012, aus der ich von der Existenz der Arbeiterfußball-Liga und ihren journalistischen Mindeststandards erfahren habe.

    All das hatte mit der Machtübergabe an die Nazis ein Ende, zumal sich der DFB bereitwillig gleichschaltete, wenn er schon 1933 erklärte:

    Wir haben mit den ganzen Sozialdemokraten und Kommunisten nichts zu tun und wir sorgen auch dafür, dass weder Juden noch Arbeiter-, ehemalige Arbeitersportler bei uns im Verband offiziell Mitglied werden.

    DLF vom 27.10.2018

    Dem Vorbild des Arbeitersports zu folgen wäre, so schlage ich engelszüngelnd vor, schon mal ein erster Schritt zur Entpolitisierung des Sports: Keine Namen, keine Nationen. Wer sich erinnert, wie Boris Becker quasi im Alleingang die Tennisclubs der Republik gerettet hat, mag sich fragen, wie viel „Breitensport“ ohne nationalen Enthusiasmus eigentlich übrig bleiben würde. Und was davon. Das dürfte dann der unpolitische Teil sein.

    Gegen Solidarität

    Was „Solidarität“ angeht, kann ich mir speziell von meinen Ultra-FreundInnen den empörten Einwand vorstellen: „Aber du hast ja gar keine Ahnung, wie toll der Zusammenhalt bei uns ist. Solidarischer gehts gar nicht.“

    Nun ja. In Abwandlung des Luxemburg-Klassikers ist dazu zunächst festzustellen, dass Solidarität immer die mit den anderen ist, also nicht mit den Leuten der eigenen Gruppe und schon gar nicht denen der eigenen „Nation“. Und dass Solidarität auf jeden Fall mal kritisch ist – Solidarität mit, sagen wir, Bahnchefs heißt eben nicht, bedingungslos zu rechtfertigen, was diese so tun, sondern zu kritisieren, wie sie, neben vieler anderer Menschenfresserei, Leute hinter Autotüren treiben. Das also, was Fangruppen zusammenhält, ist keine Solidarität, es ist Abgrenzung, es ist Gruppenidentität, also das, was so gut wie alle Massenverbrechen der Geschichte – Kriege, Pogrome, Unterdrückung – erst ermöglicht hat (vgl. in diesem Zusammenhang das Minimalgruppenparadigma).

    Solidarität ist genau das Gegenteil von der Bildung von Untergruppen, die sich zu be(wett)kämpfen haben, und sei es über die Ausdeutung von StellvertreterInnen wie in der Leichtathletik. Wer anfängt, Mannschaften zu bilden, wer anfängt, für, was weiß ich, Angelique Kerber zu fiebern, weil sie ja „zu uns“ gehört, hat angefangen, sich aus der Solidarität mit den „anderen“ zu verabschieden statt, wie es Gebot der Solidarität ist, weniger Othering (ist das noch ein populärer Begriff?) zu betreiben.

    Und nun?

    Nach all dem verwundert wohl nicht, dass sich so gut wie alle rechten Ideologeme recht direkt im Sport wiederfinden, von Nationalismus (die Hymnendebatten scheinen ja mal wirklich aus einem anderen Jahrhundert zu kommen) über Homophobie (eine kommerzielle Fußballseite dazu) bis Sexismus (selbst wenn mensch an zwei Geschlechter und das Wundermittel Testosteron glaubt, kann wohl niemand die Geschlechtertrennung beim Schießen plausibel machen).

    Heißt das, dass Linke besser nicht joggen sollten? Am besten jede Anstrengung meiden? Nö, sicher nicht. Es geht hier nicht um Fleißpunkte oder moralische Reinheit. Wer mag, darf ja auch an James Bond-Streifen Spaß haben, die vergleichbar viele rechte Ideologeme bedienen. Zumindest aber im Kopf sollte mensch schon haben, dass Sportkonsum schlüpfriger Boden ist – nicht umsonst fanden die ersten größeren Angriffe auf Geflüchtete in der „neuen“ BRD nach dem Endspiel der Männerfußball-WM 1990 statt.

    Wer selbst läuft oder tritt, ist vielleicht in geringerer Gefahr. Aber dennoch: im Hinblick auf die Welt nach uns wärs schon besser, die Alltagswege mit dem Fahrrad zurückzulegen und das Gemüsebeet zu hacken als mit dem Auto in den Wald oder die Muckibude zu fahren.

    Klar, die soziale Symbolik dabei muss mensch aushalten wollen: „Ist der so arm, dass er kein Auto hat?“ Dazu will ich abschließend kurz auf den Ursprung unseres modernen Sportbegriffs eingehen, soweit ich ihn überblicke. Die gehobenen britischen Kreise im 18. Jahrhundert nämlich kamen wohl zur Einsicht, es gehe nicht so ganz ohne Bewegung und Anstrengung. „Nützliche“ Bewegung, körperliche Arbeit zumal, würde aber den Verdacht erregen, mensch habe es nötig, sei also nicht wirtschaftlich erfolgreich, mit anderen Worten: arm.

    Sport wäre dann schon im Ursprung die Demonstration von Wohlstand, wichtiger: Nicht-Armut. Ich muss nicht körperlich arbeiten, ich habe immer noch genug Zeit, mich sinnlos auszutoben, aber auch die Disziplin, mich dabei klaren Regeln zu unterwerfen, und ich habe obendrein das Geld für die tollen Accessoires, die es für Sport X braucht. Wenn ich vor allem am Wochenende durch die Berge hier radele und die Ausrüstung vieler anderer RadlerInnen ansehe, gewinnt diese These massiv an Plausibilität, bis hin zu den Fahrrädern, die oft demonstrativ alltagsuntauglich sind. Die Nachricht scheint zu sein: „Ich habe natürlich wie jeder anständige Mensch ein Auto, dieses Ding hier ist für mich nur Sportgerät.“

    Die damit verbundene zusätzliche Warenproduktion schadet dann aber schon, der …

  • Adieu, RKI-Berichte

    Oh je! Im RKI-Bericht von heute heißt es:

    Ab Montag, 19.07.2021, wird die Berichterstattung umgestellt: Eine tägliche kürzere Berichterstattung wird ergänzt mit einer ausführlichen Berichterstattung donnerstags.

    Ich gestehe offen: ich finde das ein wenig bitter. Auch wenn die Berichte nie wirklich das sagten, was sich wohl alle gefragt haben („Wo stecken sich diese Leute denn nun an? Was für Ausbrüche gibts im Land?“), waren die Zahlen und Grafiken, die da jeden Tag kamen (na ja, seit ein paar Wochen schon nicht mehr am Wochenende) durchaus ein beruhigendes und strukturierendes Element der Coronazeit.

    Die RKI-Deutschlandkarte mit farbkodierten Inzidenzen

    Gerade, wo die Karte wieder bunter wird, strafft das RKI seinen täglichen Corona-Bericht. Hm.

    Die sich windenden Inzidenzlinien der Bundesländer, die bunt gefärbten Landkreise, bei denen Extreme oft gute und manchmal auch gar keine guten Erklärungen hatten, das Schwingen der R-Wert-Schätzungen und natürlich die nach Wochentag wechselnden Features vom Wochenvergleich am Dienstag bis zur Mortalitätsstatistik am Freitag: Mir wird das fehlen, jedenfalls, solange Corona rein ethisch nicht ignorierbar ist.

    Wann ich Corona ethisch ignorierbar finde, habe ich indes noch nicht ganz klar. Wahrscheinlich werde ich irgendwann im September finden, wer dann noch nicht geimpft ist, kann es entweder nicht (und dann hat Zuwarten auch keinen Wert) oder wollte es nicht (und kann dann von mir keine Rücksicht erwarten).

    Aber wie das wirklich aussieht, wenn die Inzidenzen irgendwo jenseits der 1000 liegen – und das würden sie, wenn die IgG-Spiegel der meisten Leute wieder halbwegs normal sind und Schulen, Büros, Kneipen und Discos offen – ach, wer weiß?

    Als Abschiedsbetrachtung zu den gewohnten RKI-Berichten noch etwas aus den Tabellen zu „Betreuung, Unterbringung und Tätigkeit in Einrichtungen“ (die ich eingestandenermaßen meist überblättert habe): Dort werden ja unter anderem nach §36 IfSG „Untergebrachte“ diskutiert, was Pflegeeinrichtungen, Obdachlosenunterkünfte, Lager für (oder gegen) Geflüchtete und auch Gefängnisse umfasst. Genau dabei überrascht mich die Zeile „Sonstige“, die nach Lage der Dinge insbesondere die Gefängnis-Zahlen enthalten müsste. Dort stehen heute 1512 Fälle (seit Pandemie-Anfang), von denen 210 älter waren als 60, 132 ins Krankenhaus mussten und 27 gestorben sind.

    Das kann, nach allem, was so aus den Gefängnissen zu hören ist, schlicht nicht sein; deutsche Haftanstalten haben wahrscheinlich keine Positivraten wie Townships in Südafrika, aber sehr weit dürften sie auch nicht davon entfernt sein. Das aber würde bedeuten, dass Fälle aus Gefängnissen fast durchweg unter die 138284-85924 = 52360 Fälle nach §36 ohne „differenzierte Angaben“ fallen müssen. Und das ist schon irgendwo auf dem Skandalspektrum: Wie schwierig kann es sein, Fälle aus Gefängnissen auch so zu labeln?

  • Impfpass ohne App, Apple und Google

    Morgen werden zwei Wochen seit meiner zweiten Corona-Impfung vergangen sein. Damit wird die Impfpassfrage für mich relevant: Mit so einem Ding könnte ich wieder in die Mensa gehen!

    Allerdings habe ich, soweit ich das sehe, keinen Zugang zur offiziellen Covpass-App, weil ich mich von Apples Appstore und Googles Playstore fernhalte und eigentlich auch die Toolchains der beiden nicht auf meinem Rechner haben will. Immerhin gibt es (es lebe der Datenschutz-Aktivismus, der für offene Entwicklung von dem Kram gesorgt hat) die Quellen der Apps (wenn auch leider auf github). Wie kompliziert kann es schon sein, das ohne den ganzen proprietären Zauber nachzubauen?

    Stellt sich raus: schon etwas, aber es ist ein wenig wie eine Kurzgeschichte von H.P. Lovecraft: Die Story entwickelt sich wie beim Schälen einer Zwiebel. Schale um Schale zeigt sich, dass die Wahrheit immer noch tiefer liegt.

    Bei Lovecraft sind nach dem Abpulen der letzten Schale meist alle ProtagonistInnen tot oder wahnsinnig. Im Fall der Covpass-App hingegen ist der Kram sogar dokumentiert: So finden sich die halbwegs lesbare Dokumentation des Datenstroms im QR-Code und das JSON-Schema – leider schon wieder auf github.

    Schale 1: QR-Code scannen

    Ich dachte mir, zum Nachbauen der Covpass-App sollte ich erstmal ihre Eingabe verstehen, also die Daten aus den beiden Impfzertifikaten lesbar darstellen. Der erste Schritt dazu ist etwas, das QR-Codes lesen kann. Ich hatte anderweitig schon mit zbar gespielt, für das es das Debian-Paket python3-zbar gibt. Damit (und mit der unverwüstlichen Python Imaging Library aus python3-pillow) geht das so, wenn das Foto mit dem Zertifikat in der Datei foto.jpeg liegt:

    def get_single_qr_payload(img):
      img = img.convert("L")
    
      scanner = zbar.ImageScanner()
      scanner.parse_config('enable')
      image = zbar.Image(img.size[0], img.size[1], 'Y800', data=img.tobytes())
      if not scanner.scan(image):
        raise ValueError("No QR code found")
    
      decoded = list(image)
      if len(decoded)>1:
        raise ValueError("Multiple QR codes found")
    
      return decoded[0].data
    
    encoded_cert = get_single_qr_payload(Image.open("foto.jpeg"))
    

    Im Groben wandele ich in der Funktion das Bild (das wahrscheinlich in Farbe sein wird) in Graustufen, denn nur damit kommt zbar zurecht. Dann baue ich eine Scanner-Instanz, also das Ding, das nachher in Bildern nach QR-Codes sucht. Die API hier ist nicht besonders pythonesk, und ich habe längst vergessen, was parse_config('enable') eigentlich tut – egal, das ist gut abgehangene Software mit einem C-Kern, da motze ich nicht, noch nicht mal über diesen fourcc-Unsinn, mit dem vor allem im Umfeld von MPEG allerlei Medienformate bezeichnet werden; bei der Konstruktion des zbar.Image heißt „8 bit-Graustufen“ drum "Y800". Na ja.

    Der Rest der Funktion ist dann nur etwas Robustheit und wirft ValueErrors, wenn im Foto nicht genau ein QR-Code gefunden wurde. Auch hier ist die zbar-API vielleicht nicht ganz preiswürdig schön, aber nach dem Scan kann mensch über zbar.Image iterieren, was die verschiedenen gefundenen Barcodes zurückgibt, zusammen mit (aus meiner Sicht eher knappen) Metadaten. Das .data-Attribut ist der gelesene Kram, hier als richtiger String (im Gegensatz zu bytes, was ich hier nach der python3-Migration eher erwartet hätte).

    Schale 2: base45-Kodierung

    Das Ergebnis sieht nach üblichem in ASCII übersetzten Binärkram aus. Bei mir fängt der etwa (ich habe etwas manipuliert, das dürfte so also nicht dekodieren) so an: HC1:6B-ORN*TS0BI$ZDFRH%. Insgesamt sind das fast 600 Zeichen.

    Als ich im Wikipedia-Artikel zum Digitalen Impfnachweis gelesen habe, das seien base45-kodierte Daten, habe ich erst an einen Tippfehler gedacht und es mit base85 versucht, das es in Pythons base64-Modul gibt. Aber nein, weit gefehlt, das wird nichts. War eigentlich klar: die Wahrscheinlichkeit, dass was halbwegs Zufälliges base85-kodiert keine Kleinbuchstaben enthält, ist echt überschaubar. Und base45 gibts wirklich, seit erstem Juli in einem neuen RFC-Entwurf, der sich explizit auf QR-Codes bezieht. Hintergrund ist, dass der QR-Standard eine Kodierungsform (0010, alphanumeric mode) vorsieht, die immer zwei Zeichen in 11 bit packt und dafür nur (lateinische) Großbuchstaben, Ziffern und ein paar Sonderzeichen kann. Extra dafür ist base45 erfunden worden. Fragt mich bloß nicht, warum die Leute nicht einfach binäre QR-Codes verwenden.

    Es gibt bereits ein Python-Modul für base45, aber das ist noch nicht in Debian bullseye, und so habe ich mir den Spaß gemacht, selbst einen Dekodierer zu schreiben. Technisch baue ich das als aufrufbares (also mit einer __call__-Methode) Objekt, weil ich die nötigen Tabellen aus dem globalen Namensraum des Skripts draußenhalten wollte. Das ist natürlich ein Problem, das verschwindet, wenn sowas korrekt in ein eigenes Modul geht.

    Aber so gehts eben auch:

    class _B45Decoder:
      chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:"
      code_for_char = dict((c, i) for i, c in enumerate(chars))
      sig_map = [1, 45, 45*45]
    
      def __call__(self, str):
        raw_bytes = [self.code_for_char[s] for s in str]
        cooked_bytes = []
    
        for offset in range(0, len(raw_bytes), 3):
          next_raw = raw_bytes[offset:offset+3]
          next_bytes = sum(w*v for w,v in
            zip(self.sig_map, next_raw))
          if len(next_raw)>2:
            cooked_bytes.append(next_bytes//256)
          cooked_bytes.append(next_bytes%256)
    
        return bytes(cooked_bytes)
    
    b45decode = _B45Decoder()
    

    Die b45decode-Funktion ist, wenn mensch so will, ein Singleton-Objekt der _B45Decoder-Klasse (so hätten das jedenfalls die IBMlerInnen der CovPass-App beschrieben, vgl. unten). Ansonsten bildet das den Grundgedanken von base45 ziemlich direkt ab: Immer drei Bytes werden zur Basis 45 interpretiert, wobei die Wertigkeit der verschiedenen Zeichen im Dictionary code_for_char liegt. Die resultierende Zahl lässt sich in zwei dekodierte Bytes aufteilen. Nur am Ende vom Bytestrom muss mensch aufpassen: Wenn die dekodierte Länge ungerade ist, stehen kodiert nur zwei Byte.

    Und ja: vielleicht wärs hübscher mit dem grouper-Rezept aus der itertools-Doku, aber die next_raw-Zuweisung schien mir klar genug.

    Schale 3: zlib

    Ein b45decode(encoded_cert) gibt erwartungsgemäß wilden Binärkram aus, etwas wie b'x\x9c\xbb\xd4\xe2\xbc\x90Qm!… Das sind, ganz wie die Wikipedia versprochen hat, zlib-komprimierte Daten. Ein zlib.decompress wirkt und führt auf etwas, in dem zum ersten Mal irgendetwas zu erkennen ist; neben viel Binärkram findet sich etwa:

    ...2bdtj2021-07-01bistRobert Koch-InstitutbmamOR...
    

    Keine Frage: Ich mache Fortschritte.

    Schale 4: CBOR/COSE

    An dieser Stelle bin ich auf mir unbekanntes Terrain vorgestoßen: CBOR, die Concise Binary Object Representation (Nerd-Humor: erfunden hat das Carsten Bormann, weshalb ich auch sicher bin, dass das Akronym vor der ausgeschriebenen Form kam) alias RFC 7049. Gedacht ist das als so eine Art binäres JSON; wo es auf die Größe so ankommt wie bei QR-Codes, habe ich schon Verständnis für diese Sorte Sparsamkeit. Dennoch: Sind Protocol Buffers eigentlich tot?

    Praktischerweise gibt es in bullseye das Paket python3-cbor2. Munter habe ich cbor2.loads(raw_payload) geschrieben und war doch etwas enttäuscht, als ich etwas wie:

    CBORTag(18, [b'\xa1\x01&',
      {4: b'^EVf\xa5\x1exW'},
      b'\xa4\x01bDE...',
      b'\xf9\xe9\x9f...'])
    

    zurückbekommen habe. Das ist deutlich mehr viel Binärrauschen als ich erhofft hatte. Aber richtig, das Zeug sollte ja signiert sein, damit die Leute sich ihre Impf- und Testzertifikate nicht einfach selbst schreiben. Die hier genutzte Norm heißt COSE (nämlich CBOR Object Signing and Encryption, RFC 8152 aus dem Jahr 2017). Ich habe das nicht wirklich gelesen, aber Abschnitt 2 verrät gleich mal, dass, wer an einer Signaturprüfung nicht interessiert ist (und das bin ich nicht, solange ich nicht vermuten muss, dass meine Apotheke mich betrogen hat), einfach nur aufs dritte Arrayelement schauen muss. Befriedigenderweise ist das auch das längste Element.

    Ein wenig neugierig war ich aber schon, was da noch so drinsteht. Die 18 aus dem CBORTag heißt nach Abschnitt 4.2, dass das eine Nachricht mit nur einer Unterschrift ist, und der letzte Binärkram ist eben diese eine Unterschrift. Das erste Array-Element sind Header, die mit unterschrieben werden, wieder CBOR-kodiert. Dekodiert ist das {1: -7}, und Überfliegen der COSE-Spezifikation (Tabellen 2 und 5) schlägt vor, dass das heißt: der Kram ist per ECDSA mit einem SHA-256-Hash unterschrieben.

    Tabelle 2 von COSE erklärt auch das nächste Element, die Header, die nicht unterschrieben werden (und über die mensch also Kram in die Nachrichten einfummeln könnte). Das sieht auch erstmal binär aus, ist aber ein „entpacktes“ Dictionary: In meiner Nachricht steht da nur ein Header 4, was der „Key Identifier“ ist. Der Binärkram ist schlicht eine 64-bit-Zahl, die angibt, mit welchem Schlüssel die Unterschrift gemacht wurde (bei PGP wären das die letzten 8 byte des Fingerabdrucks, viel anders wird das bei COSE auch nicht sein).

    Schale 5: CBOR lesbar machen

    Zurück zu den Zwiebelschalen. Wenn also die Nutzdaten im dritten Element des Array von oben sind, sage ich:

    cbor_payload = cbor2.loads(cose_payload.value[2])
    

    Heraus kommt dabei etwas wie:

    {1: 'DE', 4: 1657705736, 6: 1626169736,
    -260: {1: {'v': [{'co': 'DE', 'dn': 2, 'dt': '2021-07-01',
    'is': 'Robert Koch-Institut', 'ma': 'ORG-100030215',
    'mp': 'EU/1/20/1528', 'sd': 2, 'tg': '840539006',...}]}}}
    

    – das ist ziemlich offensichtlich die Datenstruktur, die der Zauber liefern sollte. Nur sind die Schlüssel wirklich unklar. v könnte wohl „Vaccination“ sein, is der Issuer, also der Herausgeber des Impfpasses; die Werte von 4 und 6 sehen verdächtig nach Unix-Timestamps in der nächsten Zeit aus (ja, es sind schon sowas wie 1,6 Milliarden Sekunden vergangen seit dem 1.1.1970).

    Aber Raten ist doof, wenn es Doku gibt. Wie komme ich also zu …

  • Javascript Local Storage

    Es gibt eine große Zahl gruseliger APIs (also: „Kram, den ein Programm tun kann“) in modernem Javascript, von Sensor APIs (zur Abfrage von Beschleunigung und Orientierung des Geräts und des Umgebungslichts) bis Websocket (mit dem weitgehend beliebige Server dauernd mit dem Client reden können, und das auch noch „im Hintergrund“ in Web Workers) – gruselig ist das, weil in aktuellen und nicht weiter modifizierten Browsern jede Webseite dieses Zeug nutzen kann, wobei eingestandenermaßen ein paar besonders dramatische APIs (Mikrofon und Kamera z.B.) noch durch Rückfragen abgesichert sind. Oh: Webseiten können das nicht nur nutzen, viel zu viele brauchen Javascript und gehen nicht, wenn mensch es abdreht.

    Der breite Zugriff auf fast alles von Javascript aus ist der Grund, warum ich des Öfteren ziemlich unwillig auf „please enable Javascript“-Banner (und noch mehr auf ihre Abwesenheit trotz Abhängigkeit von Javascript) reagiere. Javascript erlauben bedeutet spätestens seit XMLHTTPRequest (mit dem Javascript an der NutzerIn vorbei mit dem Ursprungsserver kommunizieren konnte; kam in der ersten Hälfte der Nullerjahre) und CORS (was XMLHTTPRequest und jetzt fetch auf beliebige Server ausweitete, solange die kooperieren; im Firefox tauchte das 2009 auf) einen recht weitgehenden Zugriff auf die eigene Maschine zu erlauben, und das noch ganz ohne Spectre und Freunde – die übrigens ohne ubiquitäres Javascript auf privaten Rechnern weitgehend bedeutungslos wären.

    Eine API, die ziemlich gruselig ist, weil sie Webseiten ein unendlich langes Gedächtnis in eurem Browser gibt, ist Local Storage; damit können Webseiten ernsthafte Datenmengen in eurem Browser speichern und sie wiederfinden, wenn sie das nächste Mal Javascript ausführen dürfen. Dass das zunächst lokal gespeichert wird, hilft nicht viel – per Websocket oder zur Not einem fetch mit Payload ist der Kram auch (wieder) auf jedem Server, der bereit ist, sich das anzuhören. Wohlgemerkt: ohne dass NutzerInnen irgendwas mitbekommen.

    Wenn ihr mein Gruseln nachfühlen wollt, könnt ihr hier mal Javascript einschalten (ihr lasst mich doch sonst kein Javascript ausführen, oder?). Ihr bekommt dann unter diesem Absatz ein Eingabefeld, in das ihr Kram tippen könnt. Wenn ihr einen hinreichend modernen Browser habt (technisch: er muss das storage-Signal schicken; Firefox 78 tut das z.B., Webkit 4.0.37 nicht), könnt ihr eure Nachricht in der Javascript-Warnung am Fuß der Seite sehen, schockierenderweise auch in anderen Fenstern, die ihr auf blog.tfiu.de offen habt. Auf allen halbwegs aktuellen Großbrowsern erscheint der Text jedenfalls nach dem nächsten Reload. Und bleibt auch da. Aufauf, schreibt eurem künftigen Selbst eine Nachricht in den Fuß dieser Seite:

    Gut. Du hast Javascript aus.

    Nennt mich paranoid, aber lustig ist das nicht.

    Und so ärgern mich noch viel mehr als Seiten, die Javascript fordern, Seiten, die ohne Local Storage leer bleiben oder sonst irgendwie undurchschaubar kaputt gehen.

    Was tun?

    Für die großen Browser gibt es allerlei Erweiterungen, die das Management von Local Storage erlauben; im Firefox sehe ich gerade Forget Me Not oder StoragErazor (was gleich noch die IndexedDB-API mit abdeckt, die ähnlich schrecklich ist, aber noch nicht viel genutzt wird); soweit ich erkennen kann, erlaubt das unverzichtbare noscript nicht, Javascript ohne Local Storage laufen zu lassen.

    Für meinen Haupt-Browser, den Luakit (verdammt, schon wieder ein Link von hier in github rein), habe ich eine kleine Erweiterung geschrieben, mit der ich mit der Tastenkombination ,tq schnell local storage ein- und ausschalten kann; auf die Weise kann ich normalerweise ohne Local Storage browsen, wenn dann aber mal wirklich eine Seite kaputt ist (gitlab ist da derzeit so ein ganz schlechtes Beispiel), braucht es nur ein paar Anschläge. Eine Anzeige in der Fußleiste (q/Q für Storage aus/an) kommt auch mit:

    -- Web storage control
    
    -- @module webstorage_control
    -- @copyright Public Domain
    
    local _M = {}
    
    local window = require("window")
    local theme = require("theme")
    local settings = require("settings")
    local modes = require("modes")
    local add_binds = modes.add_binds
    
    function update_webstorage_disp(w)
        if settings.get_setting("webview.enable_html5_database") then
            w.sbar.r.webstorage_d.text = "Q"
        else
            w.sbar.r.webstorage_d.text = "q"
        end
    end
    
    function toggle_local_storage(w)
        local local_storage_enabled =
            settings.get_setting("webview.enable_html5_database")
    
        settings.set_setting("webview.enable_html5_database",
            not local_storage_enabled)
        settings.set_setting("webview.enable_html5_local_storage",
            not local_storage_enabled)
        update_webstorage_disp(w)
    end
    
    window.add_signal("init", function (w)
        local r = w.sbar.r
        r.webstorage_d = widget{type="label"}
        r.layout:pack(r.webstorage_d)
        r.layout:reorder(r.webstorage_d, 1)
        r.webstorage_d.font = theme.font
        update_webstorage_disp(w)
    end)
    
    add_binds("normal", {
        { "^,tq$", "Enable/disable web local storage", toggle_local_storage},
    })
    
    return _M
    
    -- vim: et:sw=4:ts=8:sts=4:tw=80
    

    Wer auch den luakit verwendet, kann das nach .config/luakit/webstorage_control.lua packen und dann:

    require("webstorage_control")
    

    an geeigneter Stelle (z.B. in .config/luakit/rc.lua) unterbringen. Wenn dermaleinst so viele Seiten ohne Local Storage kaputtgehen wie derzeit ohne Javascript, müsste das wahrscheinlich eher wie in der noscript-Erweiterung automatisiert werden.

    Auch wenn ich mal Local Storage erlaube, will ich natürlich nicht, dass der Kram persistent bleibt. Deshalb habe ich noch folgendes kleine Python-Programm geschrieben:

    #!/usr/bin/python
    """
    Clear luakit web local storage and cookies
    
    There's a whitelist applied to both.
    """
    
    
    import fnmatch
    import glob
    import os
    import re
    import sqlite3
    
    
    class Whitelist:
        """A fnmatch-based whitelist.
    
        Test as in "domain in whitelist".  It's not fast, though.
        """
        def __init__(self,
                src_path=os.path.expanduser("~/.config/luakit/cookie.whitelist")):
            with open(src_path) as f:
                self.patterns = [s.strip() for s in f.read().split("\n")]
    
        def __contains__(self, domain):
            for pattern in self.patterns:
                if fnmatch.fnmatch(domain, pattern):
                    return True
            return False
    
    
    def clear_cookies(whitelist):
        """removes cookies from domains not in whitelist from luakit's
        cookies db.
        """
        conn = sqlite3.connect(
            os.path.expanduser("~/.local/share/luakit/cookies.db"))
    
        try:
            all_hosts = list(r[0]
                for r in conn.execute("select distinct host from moz_cookies"))
            for host in all_hosts:
                if host in whitelist:
                    continue
                conn.execute("delete from moz_cookies where host=?",
                    (host,))
        finally:
            conn.commit()
            conn.execute("VACUUM")
            conn.close()
    
    
    def try_unlink(f_name):
        """removes f_name if it exists.
        """
        if os.path.exists(f_name):
            os.unlink(f_name)
    
    
    def clear_local_storage(whitelist):
        """removes luakit's local storage files unless their source
        domains are whitelisted for cookies.
        """
        for f_name in glob.glob(os.path.expanduser(
                "~/.local/share/luakit/local_storage/*.localstorage")):
            mat = re.match("https?_(.*?)_\d+.localstorage",
                os.path.basename(f_name))
            if not mat:
                print("{}???".format(f_name))
                continue
    
            if mat.group(1) in whitelist:
                continue
    
            try_unlink(f_name)
            try_unlink(f_name+"-shm")
            try_unlink(f_name+"-wal")
    
    
    def main():
        whitelist = Whitelist()
        clear_cookies(whitelist)
        clear_local_storage(whitelist)
    
    
    if __name__=="__main__":
        main()
    

    Das Programm liest eine Liste von Shell-Patterns (also etwas wie *.xkcd.com) aus einer Datei ~/.config/luakit/cookie.whitelist und löscht dann alle Cookies und Local Storage-Einträge im Luakit, die nicht von Servern kommen, die in dieser Ausnahmeliste erwähnt sind. Das Ganze läuft bei mir jeden Morgen aus meiner Crontab:

    01 09 * * * ~/mybin/clear_luakit_cookies.py
    

    Aber: Besser wärs, das wäre alles nicht da. In einem Browser, also etwas, mit dem mensch Webseiten anschauen will, hat eine API wie Local Storage mit Persistenz und Signalisierung eigentlich nichts verloren.

    Oh: Der Javascript-Quellcode für den ganzen Spaß mit euren Notizen in der Fußzeile ist erschreckend klein. Für den Fall, dass ich das mal anders schreibe und das so nicht mehr im Seiten-Quellcode zu finden sein wird, hier zunächst der Code für das Eingabefeld oben:

    <div id="textarea-container">
      <p><em>Gut.  Du hast Javascript aus.
      </em></p>
    </div>
    
    <script deferred="deferred">
      function setUp() {
        document.querySelector("#textarea-container").innerHTML =
          `<textarea id="to-store" style="width:100%; height:6cm"
          placeholder="Tippt kram, den ihr im Fuß der Seite sehen wollt."
          ></textarea>`;
        let textSource = document.querySelector("#to-store");
        if (!window.localStorage) {
          textSource.value = "Ah, gut.  Du hast local storage aus.  Dann\n"
            +"geht das hier nicht.  Wie gesagt, das ist gut.";
           return;
        }
    
        if (window.localStorage.savedText) {
          textSource.value = window.localStorage.getItem("savedText");
        }
    
        textSource.addEventListener("input", () => {
          window.localStorage.setItem("savedText", textSource.value);
        });
    
        window.addEventListener("storage", (ev) => {
          textSource.value = ev.newValue;
        });
      }
    
      setUp();
    </script>
    

    Und dann noch der fürs Management der Fußzeile (der sitzt jetzt gerade im head-Element):

    if (window.localStorage) {
      target.innerHTML +=
        `<div id="ls-warning"><p><strong>Schlimmer noch:</strong>
        Dein Browser lässt mich
        auch local storage machen.  Wenn du dir in
        <a href="/javascript-local-storage.html">diesem Artikel</a>
        eine Nachricht hinterlässt, bekommst du sie bei deinem nächsten
        Besuch unten zu sehen; du kannst da sogar dein eigenes
        HTML und Javascript unterbringen und ausführen lassen.</p>
        <p id="user-message"/></div>`;
    
      if (window.localStorage.savedText) {
        document.querySelector("#user-message").innerHTML =
          window.localStorage.savedText;
      }
    
      window.addEventListener("storage", (ev) => {
        document.querySelector("#user-message").innerHTML = ev.newValue;
      });
    }
    
  • Geistesgegenwart um Mitternacht: Tut sie aber nicht

    Ich bin ja eigentlich niemand, der „Handarbeit“ als Qualitätsprädikat sonderlich schätzt, aber es ist gerade bei Radio schön, wenn sich zeigt, dass der Kram zwar aus dem Computer kommt, aber doch noch Menschen vor dem Computer sitzen.

    So ging das am letzten Samstag (3.7.), kurz nach Mitternacht. Mein Rechner schneidet da immer den Mitternachtskrimi aus dem Live-Programm des Deutschlandfunks mit und hat dabei dieses großartige Stolpern aufgenommen:

    (um die Bediengeräusche besser herauszubringen, habe ich das Audio etwas komprimiert). Ich muss sagen, dieses kurze Selbstgespräch fand ich sehr beeindruckend – und ich habe mich wiedererkannt, denn in dieser Sorte experimentellen Diskurses mit der Maschine versuche auch ich mich dann und wann.

    Zu diesem schönen Ausschnitt habe ich zwei Einwürfe zu bieten.

    Erstens war die dann doch noch folgende Sendung eine leicht expressionistische Hörspielfassung des Kleist-Klassikers Das Erdbeben in Chili, die ich hier liebend gerne verteilen würde, weil sie schön zeigt, was für ein garstiges Gift reaktionäre Hetzerei ist; ich kann mir nur schwer vorstellen, dass, wer das gehört hat, noch auf das Gift von, sagen wir, Innenminister Seehofer hereinfallen könnte.

    Aber nun, das Urheberrecht hindert mich daran, was mein Argument von neulich gegen das „geistige Eigentum“ schön illustriert: Das Hörspiel, vermutlich eine öffentlich-rechtliche Produktion, gäbe es natürlich auch, wenn ich es jetzt verteilen dürfte, und die Leute, die das damals gemacht haben, sind hoffentlich schon dabei ordentlich bezahlt worden und werden kaum auf ein paar Cent für einen Download durch euch angewiesen sein. Die Existenz des Textes hat offensichtlich nichts mit Urheberrecht zu tun, denn zu Kleists Zeiten gab es gar keins. Hier wirken die heutigen („Post-Micky-Maus“) Regelungen diametral gegen den ursprünglichen Zweck des Urheberrechts, nämlich, der Gesellschaft eine möglichst reichhaltige Kultur zur Verfügung zu stellen.

    Der zweite Einwurf: Über die vergangenen 20 Jahre hatte ich verschiedene Hacks, um Radio-Streams mitzuschneiden – ich schaudere, wenn ich an die schlimmen Tage von RealAudio und das Rausfummeln des Signals über preloaded libraries zurückdenke, die das write der libc überschrieben haben. Nun, der proprietäre Client wollte kein Speichern der Streams zulassen (schon wieder das Copyright-Gift!).

    Inzwischen ist das Mitschneiden dank ffmpeg und offener Standards auf der Seite der Radiostationen nur noch ein schlichtes Shellscript. Ich verwende seit ein paar Jahren das hier:

    #!/bin/bash
    
    if [ ! $# -eq 3 ]; then
            echo "Usage $0 time-to-record m3u-url output-file"
            exit 1
    fi
    
    
    case "$2" in
            dlfhq)
                    stream=https://st01.sslstream.dlf.de/dlf/01/high/opus/stream.opus
                    oopts=""
                    ;;
            dlf)
                    stream=https://st01.sslstream.dlf.de/dlf/01/low/opus/stream.opus
                    oopts="-ac 1 -ar 22500"
                    ;;
            dradio)
                    stream=`curl -s http://www.deutschlandradio.de/streaming/dkultur_lq_ogg.m3u | head`
                    ;;
            *)
                    stream="$2"
                    ;;
    esac
    
    ffmpeg -y -nostdin -loglevel error -i "$stream"  $oopts -start_at_zero -to $1  -c:a libvorbis "$3"
    

    (wahrscheinlich ist die dradio-Regel kaputt, aber das ist sicher leicht repariert). Das lege ich an eine passende Stelle, und cron sorgt für den Rest. Die crontab-Zeile, die mir schon viele Mitternachtskrimis und eben auch die Perle von oben mitgeschnitten hat, sieht so aus:

    05 00 * * sat /path/to/oggsnarf 1:00:00 dlf ~/media/incoming/mitternachtskrimi`date +\%Y\%m\%d`.ogg
    

    Nachtrag (2021-11-01)

    Nach ein paar Monaten fällt mir auf, dass nur ganz kurz nach diesem Post und meiner zustimmenden Erwähnung der Mitternachtskrimis (die allerdings schon damals zu „blue crime“ geworden waren) der Deutschlandfunk den seit mindestens meiner späten Kindheit den Krimis gehörenden Programmplatz am Samstag um 0:05 auf aktuelle Kulturberichterstattung („Fazit“) umgewidmet hat. Die Crontab-Zeile hat also nicht mehr viel Wert (und ist längst aus meiner crontab verschwunden). Ich glaube, die Idee der ProgrammplanerInnen wird gewesen sein, den Krimi Hörspiel-Podcast als Ersatz anzubieten.

  • Klarsprache: Private Gewaltanbieter

    Beim Fegen heute morgen habe ich die DLF-Hintergrund-Sendung vom 26.6. über die Verschiebung vor allem westlicher Kriegsführung in private Unternehmen gehört. Und dabei ist mir aufgefallen, dass ich vielleicht gelegentlich mal auch über „Klarsprache“ schreiben sollte. Wo Antisprache Bedeutung annihiliert, bringt Klarsprache die Dinge auf den Punkt. In diesem Fall:

    Derzeit gibt es auf internationaler Ebene zwei Ansätze, das Verhalten privater Gewaltanbieter zu regulieren: Eine Arbeitsgruppe der Vereinten Nationen bemüht sich schon länger um eine Konvention, die den Einsatz von Militärdienstleistern generell verbieten möchte. [Der andere ist das Montreux-Dokument]

    Mensch vergleiche: „privater Gewaltanbieter“ versus „Militärdienstleister“.

    Zugegeben, „Gewalt“ ist auch kein besonders klares Wort, es wird ja nun wirklich für alles und jedes eingesetzt, und insofern wäre etwas wie „Mordkommandovermittlung“ vielleicht noch etwas besser. Aber verglichen mit „Dienstleister“ – in dessen Wortfeld sich auch „haushaltsnahe Dienstleistung“ (wozu selbst Menschen in meinem Alter „Perle“ sagen und nicht peinlich finden, dass sie ihre Wohnung nicht selbst staubsaugen können) und „modernes Dienstleistungsunternehmen“ (so sah sich das Heidelberger Studierendenwerk) tummeln – doch von beeindruckender Deutlichkeit.

  • Bluetooth tethering with a 2021 Debian

    The other day the cage that holds the SIM card for the wireless modem of my Lenovo X240 rotted away. Fixing this (provided that's even reasonable, which I'm not sure about) requires digging quite a bit deeper into the machine than I consider proportional for something I use less than once a month. Plus, there's still my trusty N900 cellphone that I can use for the occasional GSM (or, where still available, UMTS) data connection.

    A SIM card cage on a table

    The underlying reason for mucking around tethering bluetooth in 2021: the cage for the SIM card in my computer rotted out. And re-attaching it to the mainboard looks like surgery to deep for summer.

    So, I revived the ancient scripts I used to use around 2005 with feature phones playing cell modem and tried to adapt them to the N900. Ouch.

    Well, full disclosure: I have only hazy notions about what's going on in bluetooth in general, and the Linux tooling for bluetooth I find badly confusing. Hence, rather than reading manpages I started asking duckduckgo for recipes for “bluetooth tethering linux“ or similar. And since what I found was either rather outdated or used various GUI and network management tools I prefer to not have to regularly run, let me write up what I ended up doing to thether my Debian box. Oh: it's using ifupdown and is Debian-specific in that sense, but otherwise I think it's fairly distribution-neutral, contrary to what you might expect after the headline.

    The bluetooth part

    The basic operation for bluetooth tethering is straightforward: Open a serial-like connection (“rfcomm”) to the phone, then start a pppd on top of it. It's the little details that make this tricky.

    The first detail for me is that I have a deep distrust of bluez (and even the bluetooth drivers). I hence keep bluetooth off and blocked most of the time, and before opening any bluetooth connection, I have to manage this bluetooth state, which I'm going to do in a plain shell script. I'm sure there's a very elegant way to do this in systemd, but then I'd say this is a case where the clarity of a shell script is hard to beat.

    So, I created a file /usr/local/sbin/bluenet containing this:

    #!/bin/sh
    # Configure/deconfigure an rfcomm bluetooth connection
    
    DEVICE_MAC=<YOUR PHONE'S BLUETOOTH ID>
    
    case $1 in
      start)
        /usr/sbin/rfkill unblock bluetooth
        /sbin/modprobe btusb
        /usr/sbin/service bluetooth start
        /usr/bin/rfcomm bind /dev/rfcomm0  $DEVICE_MAC
        sleep 2 # no idea what I should really be waiting for here, but
          # bluetooth clearly needs some time to shake out
        ;;
      stop)
        /usr/bin/rfcomm release /dev/rfcomm0
        /usr/sbin/service bluetooth stop
        /sbin/rmmod btusb
        /usr/sbin/rfkill block bluetooth
        ;;
      default)
        echo "$1 start|stop"
        exit 1
    esac
    

    All that you really need if you don't mind having bluetooth on are the two rfcomm command lines; the advantage of having this in a separate script (rather than just hack the rfcomm calls into the ifupdown stanza) is that you can say bluenet stop after a failed connection attempt and don't have to remember what exactly you started and what the stupid rfcomm command line was. Oh: Resist the temptation to keep this script in your home directory; it will be executed as root by ifupdown and should not be writable by your normal user.

    To figure out your phone's bluetooth id, I think what people generally use these days is bluetoothctl (and for interactive use, it's fairly nice, if scantily documented). Essentially, you say scan on in there and wait until you see something looking like your phone (you'll have to temporarily make it discoverable for that, of course). While you're in there, run pair <mac>, too – at least for me, that was really straightforward compared to the hoops you had to jump through to pair bluetooth devices in Linux in the mid-2000s.

    With this, you should be able to say:

    sudo /usr/local/sbin/bluenet start
    

    and then talk to a modem on /dev/rfcomm0. Try it with a terminal program:

    minicom -D /dev/rfcomm0
    

    In minicom, type AT and return, and try again if it doesn't work on the first attempt[1]; the phone should respond with OK. If it does, you're essentially in business. If it doesn't, try rfcomm -a – which should show something like:

    rfcomm0: DE:VI:CE:MA:CA:DD:RE channel 1 clean
    

    Oh, and bluetootctl may be your (slightly twisted) friend; in particular info <mac> has helped me figure out problems. I still don't understand why my N900 doesn't show the rfcomm capability in there, though – again, I'm not nearly enough of a bluetooth buff to tell if that's normal in any way.

    The PPP part

    Assuming, on the other hand, you have your rfcomm connection, the rest is standard pppd fare (which, of course, makes me feel young again). This means you have to give a provider-specific pppd configuration, conventionally in /etc/ppp/peers/bluez (replace bluez with whatever you like), which for me looks like this:

    /dev/rfcomm0
    115200
    debug
    noauth
    usepeerdns
    receive-all
    ipcp-accept-remote
    ipcp-accept-local
    local
    nocrtscts
    defaultroute
    noipdefault
    noipv6
    connect "/usr/sbin/chat -v -f /etc/ppp/chat-bluez"
    
    lcp-echo-interval 300
    lcp-echo-failure 10
    

    Some of this is a good idea whenever there's not actually a serial port in the game (local, noctsrts), some may break your setup (noauth, though I think that's fairly normal today), and the lcp-echo things I found useful to detect lost connections, which of course are rather common on cellular data. Oh, and then there's the noipv6 that you may object to.

    Anyway: you may need to gently adapt your pppd peers file. Use your common sense and browse the pppd man page if you can't help it.

    The chat script /etc/ppp/chat-bluez mentioned in the peers file for me (who's using a German E-Netz reseller) looks like this:

    TIMEOUT 5
    ECHO ON
    ABORT 'ERROR'
    ABORT 'NO ANSWER'
    ABORT 'NO CARRIER'
    ABORT 'NO DIALTONE'
    '' "ATZ"
    OK-ATZ-OK ATE1
    OK 'AT+CGDCONT=1,"IP","internet.eplus.de","0.0.0.0"'
    TIMEOUT 15
    OK "ATD*99***1#"
    CONNECT ""
    

    Essentially I'm doing a modem reset (ATZ), and (to accomodate for the swallowed initial characters mentioned above) I'm trying again if the first attempt failed. The ATE1 enables echo mode to help debugging, and then comes the magic in the CGDCONT (“Define packet data protocol (PDP) context”) AT command – you will have to adapt at least the string internet.eplus.de to your provider's APN (there are public lists of those). The rest you can probably keep as-is; nobody really uses more than one profile (the 1) or a PDP type other than IP (well, there IPV4V6 that might interest you if you've removed the noipv6 statement above), or uses the PDP address in the last argument.

    The final dial command (the ATD) is, I think, fairly standard (it says, essentially: Call the PDP context 1 set up in CGDCONT).

    All this assumes your provider does not require authentication; I think most don't these days. If they do, say hello to /etc/ppp/pap-secrets and the pppd manpage (you have my sympathy).

    Finally, the various components are assembled in a stanza in /etc/network/interfaces:

    iface n900 inet ppp
      pre-up /usr/local/sbin/bluenet start
      provider bluez
      post-down /usr/local/sbin/bluenet stop
    

    That's it – your tethered network should now come up with ifup n900, and you can take it down with ifdown n900. If the thing gets stuck, meaning the interface won't come up as far as Debian is concerned, the post-down action will not be run. Just run bluenet stop manually in that case.

    Amazing endurance

    One thing blew my mind when I did this: A good decade ago, the Nokia N900 didn't come with the profile rfcomm uses enabled (it's called “DUN” there; don't ask me why). It didn't need much to enable it, but you needed to drop some magic file for the upstart init system running in the N900's maemo into some strategic location, and some kind soul had packaged that up. Not expecting much I simply ran apt-get install bluetooth-dun – and it just worked. Whoever still keeps up these ancient maemo repositories: Thanks a lot, and I'm impressed. If we ever meet, remind be to buy you a $BEVERAGE.

    [1]In the communication with the N900 with its ancient bluetooth stack, for some reason the first character(s) tend to get swallowed somewhere on the way. I've not tried to ascertain who is to blame; perhaps it's the autoconnection of rfcomm?
  • Ich bin auch Hanna

    Seit ein paar Wochen schreiben zahlreiche Uni-Beschäftigte auf befristeten Verträgen über ihren alltäglichen Wahnsinn unter dem Twitter-Hashtag #ichbinhanna. Nun ist mir zwar ein offenes Netz wichtiger als diese eingestandenermaßen erfolgreiche Mobilisierung, und so werde ich nicht mittwittern. Aber ich finde es natürlich klasse, dass ein Thema, das mich seit Jahrzehnten umtreibt, mal wieder etwas Öffentlichkeit bekommt. Deshalb will ich hier ein paar vielleicht nicht ganz offensichtliche Aspekte beisteuern.

    Comic eines Beratungsgesprächs

    So stellt sich das BMBF den Umgang mit Befristungen vor. Links die „Hanna“, die im Befristungs-Werbevideo aus dem Hause Karliczek froh ihre „Karriere“ plant.

    Zunächst bin auch ich Hanna: meinen ersten Vertrag mit der Universität Heidelberg hatte ich 1993, damals als studentische Hilfskraft. Seit ich 2001 von meinen akademischen Wanderjahren zurückgekehrt bin, habe ich dort ununterbrochen jeweils dreijährige Arbeitsverträge als das, was heute in Baden-Württemberg akademischer Mitarbeiter heißt; zusammen komme ich auf ein gutes Vierteljahrhundert befristeter Verträge mit der Uni.

    Und auch wenn ich in all den Jahren mit wechselnder Intensität anstank dagegen, dass weniger als jedeR fünfte MitarbeiterIn in Forschung und Lehre an deutschen Unis einen ordentlichen (also unbefristeten) Arbeitsvertrag hat, versuche ich derzeit mit einiger Intensität, nicht verdauert zu werden. Klingt komisch, ist aber so, und Schuld hat: Der Rechnungshof von Baden-Württemberg, eine Festung von durch keinerlei Sachargumente zu erschütternden festen Glauben an das ganze Spektrum marktradikalen Unsinns.

    Dieser Rechnungshof hat nämlich vor Jahren festgestellt, dass an den Unis im Land viele akademische MitarbeiterInnen mit geringen Lehrverpflichtungen (oder, Gottseibeiuns, gar keinen) beschäftigt waren, während gleichzeitig Hilfskräfte aus den Reihen der Studierenden für Geld rekrutiert wurden, um Teile der Lehre – in Physik und Mathematik vor allem Übungsgruppen – abzudecken. Was ein gestandener Rechnungshöfer ist, kann da nicht zusehen, selbst wenn es nach Maßstäben der deutschen Akademia eigentlich ein prima System war: Die Übungsgruppen waren entspannte (weil normalerweise durch „Peers“ gehaltene) und produktive (weil die Leute, die den Kram erklärt haben, ihre eigenen Schwierigkeiten noch gut vor Augen hatten) Veranstaltungen, die engagierten Studis gleichzeitig die Möglichkeit gaben, erste Erfahrungen in der Lehre zu sammeln und ihr Studium fachnah zu finanzieren. Derweil konnten WissenschaftlerInnen auch an Unis relativ konzentriert forschen, wenn sie das wollten und es ansonsten mit der Lehre reichte (was in Heidelberg mit all den Forschungsinstitutionen in der Umgebung in vielen Fachbereichen nie ein Problem war).

    All das interessierte den Rechnungshof wenig, zumal ungefähr zu dieser Zeit die Urkatastrophe über die Unis hinwegrollte: Die autoritäre Umgestaltung, die reaktionäre WissenschaftspolitikerInnen gemeinsam mit den „Think Tanks“ diverser Content-Hersteller (allen voran natürlich Bertelsmann) unter dem Label „Bologna-Prozess“ vermarktet und durchgesetzt haben – ich habe damals so vergeblich wie eifrig dagegen gepredigt. Damit einher ging ein intensives Kontroll- und Prüfungsregime, dem auch die Übungsgruppen zum Opfer fielen: Was Studis darin tun, beeinflusst jetzt direkt ihre Abschlussnote (während es früher in der Praxis egal war; den Schein hat jedeR bekommen, der/die ihn wirklich wollte). Das hat die Veranstaltungen komplett umgedreht: Von realer und oft hocheffektiver Vermittlung von Wissen und Fertigkeiten zu einem Instrument schulhafter Büttelei und intensiven Feilschens um halbe Punkte.

    In dieser Situation hat der Rechnungshof dem Wissenschaftministerium sehr nahegelegt, doch all die Leute, die es (also: aus Landesmitteln) bezahlt, für die Büttelei einzusetzen, für die Studis – es geht ja um, wow, Noten! – nicht mehr gut genug waren. Weil ich aber nicht bütteln will, nicht umsetzen, was ich jahrelang bekämpft habe, muss ich sehen, dass ich von Bundes- oder Europamitteln lebe, und weil aus solchen immer noch niemand feste Verträge machen will, heißt das: ich muss die Verdauerung dringend vermeiden. Irre? Klar. Nur, finde ich, nicht von meiner Seite.

    Andererseits bilde ich mir ein, dass ich als Computer-Zauberer mit Rücklagen auch dann keine materiellen Probleme haben werde, wenn das mit den Drittmitteln mal nicht klappen sollte. Das ist für viele andere anders, insbesondere, wenn plötzlich weitere Menschen materiell von ihnen abhängen. Diese Leute werden nicht lange in meinen Projekten arbeiten. Das, zusammen mit wild fluktuierenden Mitteln, die mich immer wieder zwingen würden, Leute, die dennoch bleiben wollen, gerade dann zu feuern, wenn sie gerade richtig angekommen sind (was ich eigentlich nicht kann – und so muss ich aufpassen, dass ich immer gerade genug Drittmittel nur für mich bekomme), ist das eigentliche Problem, das ich mit der Befristeritis habe: Mensch arbeitet fast permanent mit AnfängerInnen, und das tut keinem Projekt im Wissenschaftsumfeld gut.

    Ich wünsche also den #ichbinhanna-Leuten alles Gute. Auf ein paar großväterliche Feststellungen kann ich aber dennoch nicht verzichten:

    • Ohne eine entscheidende Rückverlagerung von wettbewerblich vergebenen Mitteln in verlässliche Etats der Hochschulen und Wissenschaftseinrichtungen wirds nicht gehen. Aus nur temporär verfügbaren Mitteln entstehen auch nach TzBfG keine Dauerstellen; dieses Gift ist längst aus den Hochschulen in die Restgesellschaft durchgesickert.
    • Würde diese Grundfinanzierung einfach nur an „die Unis“ gehen wie sie jetzt sind, würde sie genau an die Profen gehen, die die derzeitige Misere recht weitgehend zu verantworten haben und das Gewäsch aus dem Hanna-Video in ihrer breiten Mehrheit exakt so vertreten. Mit anderen Worten: um die Befristeritis zurückzudrängen, braucht es auch eine grundlegende Hochschulreform, die insbesondere Profen aus den Leitungsfunktionen nimmt und durch Menschen ersetzt, die wenigstens basale arbeitsrechtliche Instinkte haben. Extrapunkte, wenn dabei auch etwas Demokratisierung (also: Abbau von Leitungsfunktionen an sich) rauskommt.
    • KeineR der OrganisatorInnen des bestehenden Systems dürfte sich viele Illusionen gemacht haben darüber, wie beschissen das für die Betroffenen aussieht und wie kontraproduktiv für die Wissenschaft das alles ist. Wenn sich etwas ändern soll, wird es also mit freundlichen Petitionen und Hinweisen über Twitter nicht getan sein.

    Dieser letzte Punkt verdient noch eine Handvoll Worte mehr: Die klassische Aktionsform abhängig Beschäftigter ist der Streik, und ich behaupte kühn, dass es auch für uns Uni-Prekariat kaum ohne gehen wird. Sage keineR, es merke sowieso niemand, wenn er/sie streike: Allein das entschiedene Nein, das eine organisierte Arbeitsverweigerung den Hochschulen vorhält, wird diese – und in der Folge auch die Ministerien – bereits in Gang setzen. Sicher nicht beim ersten Mal, aber wenn so eine Mobilisierung über ein paar Jahre nicht verschwindet, wird die Hierarchie das nicht ignorieren – es geht ja schließlich um relevante Teile ihres eigenen Nachwuchses.

    Ein Streik gegen das WissZeitVG, gegen die Drittmittelisierung der Wissenschaft, gegen die autoritär geführte Profenhochschule: Das wäre ein politischer Streik, der in Deutschland verboten ist (kein Scheiß). So ein Verbot (mit der Folge u.a. fehlender gewerkschaftlicher Unterstützung) muss natürlich kein Hindernis sein, aber angesichts der totalen politischen Agonie des Uni-Mittelbaus in den letzten dreißig Jahren wäre es schon ein ziemlich großer Sprung von Null auf wilden Streik („accountancy to lion taming“).

    Vielleicht wäre ein vernünftiger erster Schritt doch erstmal der Beitritt zur GEW (auch wenn die manchmal nervt) und dann ein ganz ordentlicher, amtlicher Streik in Tarifangelegenheiten. Schon seit Jahrzehnten gibt es den Gedanken, für befristet Beschäftigte eine tarifliche Risikozulage von 10% herauszuverhandeln, was verglichen mit Hochschulreform, Bologna-Ende und Umsturz der Wissenschaftsförderung ein ganz realistisches Ziel ist – und vermutlich die Zahl allzu obszöner Befristungen schon ein wenig reduzieren würde. Das einzige, was es dafür braucht: Hinreichend viele streikbereite Mitglieder an den Hochschulen. Ohne die lachen die TVL-VerhandlerInnen der Gegenseite unsere TarifunterhändlerInnen nur aus.

    Also: Unsere Kraft ist die Gewerkschaft. Ganz klassisch.

  • Gehorsam macht dumm

    Eine Kuh schert aus der Herde aus, um zu fressen.

    Nicht alle Rinder sind immer brav und gefügig. Ob diese Kuh wohl ein besonders schmales Maul hat? Das würde ihr nämlich, mit der Methode des Papers, ein größeres Hirn bescheinigen.

    Die zweite Tiergeschichte, die ich neulich angekündigt habe als, nun, interessant in der Forschung aktuell-Sendung vom 9.6. (in den Meldungen ab Minute 21:55), war die, dass gezähmte Rinder ein Viertel weniger Hirn haben als wilde; ein Traditionsanarcho wie ich kann bei so einem Faktoid natürlich dem „Gehorsam macht dumm und gewalttätig“ nicht widerstehen, und so habe ich mir den zugrundeliegenden Artikel genauer angesehen.

    Es handelt sich um https://doi.org/10.1098/rspb.2021.0813, „Intensive human contact correlates with smaller brains: differential brain size reduction in cattle types“ von Ana Balcarcel und KollegInnen; die Hauptautorin arbeitet am Paläontologischen Institut und Museum der Uni Zürich, was, in memoriam Tibatong und Zwengelmann, den Urmel-Fan in mir begeistert.

    Von der Hirnschrumpfung im Rahmen der Domestikation hatte ich spätestens in einer DLF-Sendung von 2009 („Beschleunigte Evolution“) von Michael Stang gehört. Dort hatte er über schnelle Zuchterfolge bei Damhirschen[1] berichtet:

    Das Zuchtziel war klar. Der domestizierte Damhirsch musste seine natürliche Schreckhaftigkeit verlieren und die Nähe des Menschen nicht als störend empfinden. Zugleich sollte die Fleischleistung erhöht werden. Durch Probeschlachtungen konnte Helmut Hemmer feststellen, ob bereits einige Tiere ein verkleinertes Gehirn hatten - eines der entscheidenden Merkmale beim Übergang vom Wildtier zum Nutztier. [...] Heute grasen über 1000 domestizierte Damhirsche auf Wiesen in Deutschland.

    Im vorliegenden Artikel wird das deutlich quantitativer:

    Domestic cattle have 25.6% smaller brains than wild cattle, according to regressions of EV [Endocranial volume, Gehirnvolumen] versus MZW [Muzzle width, Breite des Mundes, als Stellvertreter für die Körpermasse ...]. The difference between beef and dairy breeds is also significant (ANCOVA, p = 0.010).

    Das ist natürlich weit weg von „Gehorsam macht dumm“, aber „25.4%“ weniger Hirn ist, mit drei signifikant aussehenden Stellen, schon eine Ansage.

    Eine Ansage allerdings, die ich in Summe nicht so richtig überzeugend belegt finde, nicht mal mit nur einer signifikanten Stelle. Wobei, full disclosure, ich war gleich voreingenommen, denn die Methode von Balcarcel et al waren Schädelmessungen. Nennt mich irrational, aber ich werde ernsthaft nervös, wenn jemand an Schädeln herummisst. Das war schon bei Lavater schlimm, und nach dem durch Pseudowissenschaft gestützten völligen Zivilisationsbruch der Nazi-Phrenologie kann ich auf sowas nicht mehr entspannt, sagen wir sine ira et studio, blicken.

    Aber ok, es scheint in dem Fach Konsens zu sein, die Breite des Mundes (ich vermute, der im Deutschen übliche Begriff wird Maulbreite sein, aber lasst mir mal etwas Antispeziezismus) als Maß für das Körpergewicht zu nehmen. Das Hirnvolumen hingegen schätzen die AutorInnen unter Verweis auf John Finarelli über ln(Hirnvolumen) = 1.3143 ⋅ ln(Länge der Schädelhöhle) + 0.8934 ⋅ ln(Breite der Schädelhöhle) - 5.2313. Das ist – von den fantastischen Genauigkeitsbehauptungen abgesehen – so unplausibel nicht: Proportionalität zwischen Logarithmen heißt, dass es da ein Potenzgesetz gibt, was bei der Relation zwischen linearen Größen und einem Volumen naheliegt; Fingerübung im Rechnen mit Logarithmen: bei Kugeln gilt 3 ln(r) + C = ln(V) mit einer Konstanten C.

    Dennoch: Sowohl Hirnvolumen als auch die Körpermasse als Bezugsgröße werden in der Arbeit durchweg über Proxies geschätzt. Das mag ok sein – und nein, ich habe nicht versucht, mich von den zur Unterstützung dieser Proxies angeführten Arbeiten überzeugen zu lassen –, aber wer Claims wie

    Bullfighting cattle, which are bred for fighting and aggressive temperament, have much larger brains than dairy breeds, which are intensively selected for docility.

    ins Abstract schreibt, sollte da, finde ich, schon sagen, dass für die Studie weder Rinder noch ihre Hirne gewogen wurden.

    Gesetzt jedoch, die Korrelationen zwischen den Schädelmaßen auf der einen und Körpermasse und Hirnvolumen auf der anderen Seite hauen wirklich hin[2]: Ganz laienhaft finde ich ja schon die Metrik „Hirnvolumen zu Körpermasse“ nicht ganz so überzeugend. Immerhin dürfte ja „relativ mehr Fleisch“ bei Nutzrindern auch ein Zuchtziel gewesen sein, und so kann das Verhältnis nicht nur wegen weniger Hirn, sondern genauso gut wegen mehr sonstiger Masse kleiner ausfallen. Das wäre übrigens auch plausibel im Hinblick auf größere Hirn-zu-Körper-Verhältnisse bei Kampfstieren (die Balcarcel et al finden), denn fette Kampfstiere erfüllen ihren Zweck vermutlich eher weniger gut.

    Ähnlich wenig überzeugt haben mich die Grafiken der Arbeit. Die zentralen Aussagen werden mit Punktwolken mit reingemalten Regressionsgeraden belegt. In dieser Darstellung fällt alles Mögliche in Auge (z.B. „alle Wildrinder sind rechts oben“, einfach weil diese größer sind, oder „die Geraden der Kampfrinder sind steiler“, was, wenn ich das richtig sehe, das Paper weder nutzt noch erklärt), während die eigentlich in den Tests verwendeten Achsenabschnitte (entsprechend Faktoren nach Delogarithmierung) durch eigene Rechnung bestimmt werden müssten und jedenfalls optisch unauffällig sind.

    Deshalb wollte ich probieren, mir geeignetere Plots auszudenken und habe versucht, die laut Artikel auf figshare bereitgestellten Rohdaten zu ziehen.

    Ach weh. Das ist schon wieder so ein Schmerz. Zunächst figshare: Nichts geht ohne Javascript (wie schwer kann es sein, ein paar Dateien zu verbreiten? Wozu könnte Javascript da überhaupt nur nützlich, geschweige denn notwendig sein?) und das CSS versteckt völlig unnötigerweise die Seitengröße. Dazu: Google analytics, Fonts von googleapis.com gezogen; ich bin ja kein Freund von institutional repositories, bei denen jede Uni-Bibliothek ihren eigenen Stiefel macht, aber mal ehrlich: so ein Mist muss jetzt auch nicht sein, nur um ein paar Dateien zu verteilen. Dann doch lieber Murks der lokalen Bibliothek.

    Die Datei mit den Daten sorgt nicht für Trost: Ich hatte mich schon auf so ein blödes Office Open XML-Ding („Excel“) eingestellt, aber es kam in gewisser Weise noch schlimmer: Was mensch bei figshare bekommt, ist ein PDF mit einigen formatierten Tabellen drin. An der Stelle habe ich dann aufgehört. Screen Scraping mache ich nur in Notfällen.

    Dabei will ich an der Grundaussage („Domestikation macht Hirne relativ kleiner“) nicht mal zweifeln; das mit dem „dümmer“ allerdings (was meine Sprache ist, nicht die der AutorInnen) ist natürlich gemeine Polemik, und das Paper zitiert Dritte, die vermuten, die Reduktion des Hirnvolumens gehe vor allem aufs limibische System, „a composite of brain regions responsible for the processing of fear, reactivity and aggression“. Aber das Paper hat, soweit ich als interessierter Laie das erkennen kann, keine sehr starken Argumente für diese Grundaussage.

    Dennoch habe ich nicht bereut, in das Paper reingeschaut zu haben, denn ich habe so erfahren, dass es Rinder gibt, deren Zweck es ist „to decorate the landscape“, vor allem die halbwilden Chillingham-Rinder. Die Idee, Rinder zu halten, damit der Park etwas hübscher aussieht: das finde ich hinreißend.

    [1]Hauskatzen, so hieß es irgendwo anders, haben Hirne wie ihre waldlebenden Verwandten. Damit wären sie Wildtiere, deren Habitat zufällig unsere Wohnungen sind. Das würde manches erklären…
    [2]Der Physiker in mir würde bei sowas gerne die Schätzungen für die systematischen Fehler vergrößern, und so eine ganz grobe Fehlerbetrachtung hätte diesem Paper sicher gut getan.
  • Arme als Fühler

    Ameise mit Marsianeraugen

    Ameise? Spinne? Marsianer? Tatsächlich hat das, was ich an Warnsystem für „lege dich nicht mit dieser Sorte Tier an“ habe, bei diesen tropischen Ameisen schon angeschlagen.

    In Forschung aktuell am Deutschlandfunk gab es am 9.6. gleich zwei Tiergeschichten, die mich inspiriert haben, mal in die Papers hinter den Geschichten zu schauen. Die erste war die Geschichte von Spinnen, die sich als Ameisen tarnen. Ganz klar wird aus der DLF-Story nicht, worum es aktuell ging; die letzte einschlägige Publikation des Interviewten ist „Insincere flattery? Understanding the evolution of imperfect deceptive mimicry“ von Donald McLean und KollegInnen und ist bereits 2019 im Quarterly Review of Biology erschienen (http://doi.org/10.1086/706769; wie üblich bei Bedarf auf scihub ausweichen). Das ist zwar erkennbar nicht das, worum im Bericht ging (Computersimulation der Erkennung durch die Fressfeinde), aber es stellt die Fragen, um die es hier geht, und vor allem begründet er, warum Mimikry von Ameisen ein besonders geeignetes Modell zur Untersuchung des Phänomens ist: Sie findet nach Aussehen, Geruch und Verhalten statt, es gibt jede Menge Spezies, die sich in der Imitation von Ameisen versuchen, und die meisten davon sind relativ unproblematisch im Umgang.

    Der Autor arbeitet übrigens an der Macquarie University in Sydney, Australien, und ich kann diese Gelegenheit zum zitieren des großartigen Bill Bryson nicht vorübergehen lassen:

    You really cannot move in Australia without bumping into some reminder of his [des Ex-Gouverneurs Lachlan Macquarie, der offensichtlich eine Tendenz hatte, alles Mögliche und Unmögliche nach sich zu benennen] tenure. Run your eye over the map and you will find a Macquarie Harbour, Macquarie Island, Macquarie Marsh, Macquarie River, Macquarie Fields, Macquarie Pass, Macquarie Plains, Lake Macquarie, Port Macquarie, Mrs. Macquarie’s Chair (a lookout point over Sydney Harbour), Macquarie’s Point, and a Macquarie town. I always imagine him sitting at his desk, poring over maps and charts with a magnifying glass, and calling out from time to time to his first assistant, “Hae we no’ got a Macquarie Swamp yet, laddie? And look here at this wee copse. It has nae name. What shall we call it, do ye think?”

    —Bill Bryson: In a Sunburned Country, New York, 2000

    Aber zurück zu den Spinnen, die das Interesse der Leute von der Macquarie University geweckt haben. Hingerissen hat mich ja die Vorstellung, wie da Spinnen rumlaufen, die ihr vorderes Beinpaar neben den Kopf halten und hoffen, damit als Ameise durchzugehen, ganz wie Kinder, die mit ihren Zeigefingern die Antennen von Aliens markieren, wobei nicht klar ist, ob die Zeigefinger oder der Gedanke von Antennen auf Alienköpfen alberner sind.

    Nun, es stellt sich heraus, dass sie damit ganz gut durchkommen, und zwar, weil ihre Fressfeinde eher darauf schauen, wie sie sich bewegen als wie sie jetzt im Einzelnen aussehen – und für den Bewegungseindruck sind die wippenden Fühler wohl recht relevant. Das wiederum hat mich an eine gute Bekannte erinnert, die seit frühester Jugend ziemlich kurzsichtig ist, jedoch versucht, so unabhängig von Brillen zu bleiben wie es halt geht. Sie hat immer angegeben, sie identifiziere Menschen vor allem anhand ihres Bewegungsstils oder vielleicht auch ihrer Gestik. Das funktioniere auch ohne scharfe Sicht aus großen Entfernungen, letztlich würden auch Strichmännchen reichen, wenn sie sich nur bewegen.

    Die Frage, welche Mimikry die Fressfeinde überzeugt, war schon Thema des oben zitierten Artikels von McLean et al, der leider im Hauptteil mehr um evolutionäre Kostenfunktionen geht, und ganz ehrlich: ich glaube an nicht viel davon, denn die entsprechenden Modelle sind gewiss einige Größenordnungen zu schlicht. Echte Ökosysteme haben unzählige Parameter, und wenn mensch zu viele davon weglässt, kommt am Schluss Mumpitz wie das „egoistische Gen“ heraus; ganz so schlimm kommt es hier nicht, aber das Abstandsgebot von ökonomistischer Argumentation befolgen die AutorInnen eben auch nicht so recht. Dafür sind sie wohl auch an der falschen Uni, denn bei Macquarie haben klar die Metriker und Wettbewerbs-Taliban das sagen. Wer bei der Uni nach dem Autor sucht, kommt auf sowas hier als „Profil“:

    Zitationszählung, Histogramme und h-Werte.

    Metrikwahn destilliert: Noch bevor irgendein Wort fällt, womit sich Herr McLean so beschäftigt, kommen Zitationszahlen und zur Krönung ein h-Wert. Wenn unter solchen Bedingungen ordentliche Wissenschaft und nicht Metrikdienerei entsteht, zeigt sich wieder die unendliche Robustheit des Systems Wissenschaft. Aber: Warum baut jemand überhaupt solche Webseiten? (Herkunft, 22.6.2021)

    Ach Mist, jetzt bin ich schon wieder von den Spinnen abgeschweift. Was auch deshalb unfair ist, weil McLean einen gewissen Metrikrealismus an den Tag legt: „Underlying the idea of imperfect mimicry is the assumption that mimetic accuracy can be quantified“ [Hervorhebung von mir]. Und weil das Paper eine, zumindest für Laien wie mich, wirklich ganz schöne Übersicht gibt, wie sich EvolutionsbiologInnen dem Problem nähern, warum wohl Mimikry manchmal richtig schlecht ist. Von „die Täuschenden probieren es gar nicht“ bis „für die Fressfeinde reichts“ ist da viel dabei – und klar, in verschiedenen System werden wahrscheinlich verschiedene Mechanismen am Werk sein.

    Worum es neulich im DLF ging, war nun offenbar die „für die Fressfeinde reichts“-Hypthese, die wiederum in ein paar Varianten aufgedröselt wird; in einer Fassung, die ich für viele Zwecke recht überzeugend finde, wäre das etwa: Wenn Fressfeinde mal böse Erfahrungen mit Form V gemacht haben, werden sie vielleicht auch ähnliche Formen meiden, sagen wir W, zumal, wenn sie auch W nicht dringend zum Überleben brauchen. Ziemlich offensichtlich funktioniert das sogar im genetischen Gedächtnis. Jedenfalls glaube ich nicht, dass viele Menschen in meinem Umfeld böse Erfahrungen mit Spinnen und Schlangen gemacht haben, doch haben überraschend viele wirklich ernsthafte Ängste vor Tieren, die aussehen wie Schlangen oder Spinnen.

    Und das war dann schon die Geschichte, soweit sie jetzt publiziert ist: Es gibt einen Haufen Varianten von Mimikry, und Spinnen, die ihre Vorderbeine halten, als wären sie Fühler, kommen damit durch, solange die Ameisen, die sie imitieren, nur garstig genug schmecken.

  • Antisprache: Extremismus

    „Extremismus“ ist sozusagen die Mutter aller Antisprache, Sprache also, die entworfen ist für Kommunikation, die bei gelungenem Sprechakt bei den EmpfängerInnen Information zerstört statt bildet.

    Entsprechend viele haben sich um Abrüstung des Begriffs (und der verwandten „Hufeisentheorie“) bemüht. Schon 2007 etwa schloss sich die Grüne Jugend der damals populären Strömung „gegen jede Extremismustheorie“ an (Abschnitt 9.1 im damaligen Selbstverständnis) – gerade bei denen bemerkenswert, denn 14 Jahre später werden die Leute, die das damals geschrieben haben, allmählich in die Parlamente gekommen sein, die die Etats der Inlandsgeheimdienste („Verfassungsschutz“, VS) abnicken.

    Das ist relevant, denn ohne den VS gäbe es ziemlich sicher gar keinen „Extremismus“. Diese These ist weniger steil als sie klingt. Als ersten Hinweis biete ich mal, dass zu keiner Zeit mehr Gerede über „Extremismus“ im Blätterwald raunt als gerade jetzt, wo der Bundes-VS mal wieder seinen „Bericht“ (ich wollte nicht „Kampfschrift“ schreiben, aber Bericht ohne Anführungszeichen fand ich jetzt auch nicht treffend) vorgestellt hat.

    Tatsächlich haben mich schon neulich zwei Nachrichten inspiriert, endlich mal einen Antisprache-Post über das E-Wort zu schreiben. Erstens hatte der Deutschlandfunk am 9. Juni:

    Die russische Justiz hat mehrere Organisationen des inhaftierten Kremlkritikers Nawalny endgültig verboten. Ein Gericht in Moskau stufte die Vereinigungen als extremistisch ein.

    und dann, am 10. Juni:

    Das [hessische] Landeskriminalamt durchsuchte die Wohnungen und Arbeitsplätze von sechs Mitgliedern des Spezialeinsatzkommandos. [...] Ermittler waren den Angaben zufolge im Rahmen einer anderen Untersuchung zufällig auf die rechtsextremen Handynachrichten gestoßen.

    Was haben Nawalny und die hessischen Polizisten mit Nazineigungen gemeinsam? Gemeinsam mit, sagen wir, den Leuten, die den Weiterbau des offensichtlichen Irrsinnsprojekts A49 im Dannenröder Forst verhindern wollten und die auch unter dem Label „Extremismus“ in den Fokus der Geheimdienste wie unter Polizeiknüppel kamen?

    Nur eines: Sie sind den jeweiligen Regierungen ernsthaft unangenehm. Das, und nichts anderes, ist die eigentliche (für weiter unten: „wissenschaftliche“) Bedeutung von „Extremismus“.

    Gut, die meisten Leute, die von „Extremismus“ reden, geben sich große Mühe, von dieser Bedeutung abzulenken. Die sinnzerstörende Wirkung entfaltet das Wort tatsächlich nur, wenn das diffuse Grauen im Angesicht von Nazi-Polizisten, die quälen, wen sie als „Ausländer“ oder Linke einschätzen gegen die netten Leute vom Danni eingesetzt werden kann (oder halt, wenn ihr Putin seid, gegen Querulanten wie Nawalny). Und das ist wichtig, denn gerade die Danni-Leute (und in Russland wahrscheinlich eben auch eine Figur wie Nawalny) werden von allen außer den betonköpfigsten Schurken geliebt. Ohne den Aufruf von Bildern blindwütig mordender IS-Gläubischer (oder muttermordender Nazispinner aus Hanau) ist robuste staatliche Reaktion – sagen wir, wochen- (Danni), monate- (auch Danni) oder jahrelanges (Nawalny, nochmal Danni) Wegsperren – in solchen Situationen in der Öffentlichkeit schwierig zu verkaufen.

    Nettes und Fortschrittliches mit Fiesem und Reaktionärem verrühren und damit diskreditieren: Das ist die Nettowirkung des Extremismusbegriffs. Wenig überraschend kommt er genau aus der fiesen und reaktionären Ecke, nämlich aus den damals noch intensiv von Altnazis durchsetzten Verfassungsschutzbehörden. Anfang der 1970er Jahre machten sie sich erkennbar Sorgen, weil die allgemeine Sympathie für die unter anderem durch die aufkommenden Berufsverbote gepeinigten „Radikalen“ (so hießen die damals; vgl. Radikalenerlass) in dem Maß zunahm, wie die Avantgarde von 68 gesellschaftlicher Mainstream wurde. Da musste was Neues her, zumal der ähnlich verrührende „Totalitarismus“, der gegen realsozialistische Umtriebe noch prima – und noch dazu mit erheblicher Plausiblität – zog, für kiffende Blumenkinder und wenig später bunte HausbesetzerInnen offensichtlich nicht passte.

    Und so wurde der „Extremismus“ im Bericht des BfV von 1973 geboren – wobei ich vermute, dass es international Vorbilder gegeben haben wird. Wenn nicht, würde inzwischen sogar Wladimir Putin dem deutschen Inlandsgeheimdienst nachplappern. Ich kann gar nicht so genau sagen, warum ich diesen Gedanken besonders furchtbar finde.

    Bis heute wird „Extremismus“ als Konzept wie als Wort vom VS genährt. Die scheinbare Glaubwürdigkeit eines so eindeutig antisprachlichen und breit kritisierten Begriffs in der heutigen Zeit wird erzeugt von Männern wie Armin Pfahl-Traughber, Eckhard Jesse und Uwe Backes, die aus dem Umfeld von Geheimdienst und politischer Polizei in die Akademia aufgestiegen sind und dort VS-Berichte durch Zitate adeln – VS-Berichte, deren krudes politisches Gerüst sich umgekehrt auf die aggressive Scheinwissenschaft der genannten Herren (und noch einer Handvoll weiterer) aufbaut. Diese zirkuläre Legitimation funktioniert immerhin so gut, dass taz-Autor Volkan Ağar in der taz von heute dem Bundesinnenministerium vorwirft, der Bundeszentrale für politische Bildung vorgeschrieben zu haben, eine „wissenschaftliche Linksextremismusdefinition“ durch eine des VS zu ersetzen. Der „Wissenschaftler“, zu dessen Produkten übrigens BMI und Bildzeitung selbst die bpb zuvor genötigt hatten: Armin Pfahl-Traughber. Au weia.

    Wie geht es besser? Nun, wie immer: Hinschauen und sagen, worum es wirklich geht. Die PolizistInnen des Frankfurter SEK sind eklig nicht, weil sie der Regierung peinlich sind, sondern weil sie RassistInnen sind, autoritäre Positionen vertreten, vielleicht AntisemitInnen sind – wer weiß, nachdem ja statt konkreter Information bisher nur „Rechtsextremismus“ im Raum steht? Wäre es nicht wirklich hilfreich, wenn klar wäre, ob es da auch groben Sexismus geht, ob nur um den üblichen Autoritarismus („die Polizei sind die Guten“) oder ob dort auch preppermäßige Putschpläne ausgeheckt wurden?

    Fängt mensch an, solche Fragen zu stellen, zeigt sich auch bald, warum das autoritäre Establishment den „Extremismus“ so sehr präferiert gegenüber dieser Sorte von Hinschauen: Jemand wie Seehofer vertritt offensichtlich erznationalistische Positionen (wenn er sich etwa über Abschiebungen zum Geburtstag freut), Leute, die 2% des Bruttoinlandsprodukts fürs organisierte Töten ausgeben wollen, sind klar MilitaristInnen („Lasst uns Menschen töten, um meine Interessen durchzusetzen“), und wer meint, „Hasskriminalität“ durch mehr Befugnisse für die Polizei beikommen zu können, dürfte sehr offen für autoritäre Gedankengänge sein (eine wirksamere Alternative wäre z.B., die Bildzeitung unrentabel zu machen, die, soweit ich als Vertreter offener Standards das sehe, weit mehr für die Verbreitung von Hass tut als alle Facebook-Trolle zusammen). All diese Dinge sind kritikabel, sogar unappatitlich, führen bei konsequenter Umsetzung in gefährliche Nähe von Faschismus – und nichts davon bewegt sich irgendwo dort, wo der VS „Extremismus“ sieht.

    Die Leute im Danni hingegen wollen glaubhaft größtmögliche Befreiung vom Auto. Sowohl Befreiung als auch weniger Autos sehe wohl nicht nur ich sehr gerne. Und so geht das auch mit vielen anderen „Linksextremismen“: Von Deutsche Wohnen-Enteignung über die Auflösung von NATO und VS über entschlossenere Schritte gegen den Klimawandel und das Massensterben im globalen Süden bis zu grundsätzlicherer Kritik an unseren Produktionsweisen sind die meisten Anliegen sehr gut nachvollziehbar, immer mit dem Herz, sehr oft auch mit dem Hirn. Ohne „Extremismus“ bräuchte es Argumente gegen diese Anliegen. Und die sind entweder schwer zu ersinnen oder entlarvend für die Anliegen der Gegner.

    Ohne „Extremismus“ leben heißt mithin zu fragen, was Leute wirklich wollen und nachzudenken, wie weit das Freiheit, Gleichheit und Solidarität (oder was immer mensch nun als Leitplanken annimmt) voranbringt – oder die jeweiligen Gegenteile.

    Klar, das ist im Regelfall viel mehr Arbeit (insbesondere auch als der schlichte Verweis „vom VS beobachtet“), aber so ist das mit der intellektuellen Ehrlichkeit. Und genauso klar, häufig sind die Ergebnisse nicht so ganz eindeutig, wie etwa bei Alexei Nawalny. An sich mag mensch ja Sympathien hegen für Menschen, die Herr Putin anstrengend findet; ich fürchte aber, angesichts von Nawalnys tatsächlichen Überzeugungen, die kaum weniger autoritär wirken als die der KremlparteigängerInnen, bleibt allenfalls generelle Solidarität gegen Repression übrig als Motivation, ihm irgendwie beizuspringen.

    Nach diesen Worten ist ein Blick in die DLF-Presseschau von heute besonders ernüchternd: Selbst der Süddeutsche, deren Heribert Prantl sich nach dem Auffliegen des NSU den Forderungen nach Auflösung des VS angeschlossen hatte, gelingt allenfalls milder Spott im Angesicht überkritschen Masse von Antisprache im „Bericht“ des Inlandsgeheimdienstes. Alle anderen extremisieren („rechts wie links“ die beim Verbreiten von VS-Material unvermeidliche NOZ, „die Demokratie [und natürlich nicht wie schon seit Jahrzehnten Nichtkartoffeln, Punker und Penner] angegriffen“ beim Tagesspiegel, „Facebook, Telegram & Co [und selbstverständlich nicht Bildzeitung und VS selbst]“ als Jaucheschleudern bei der Südwest-Presse, „Militanz nimmt auch in der linksextremistischen Szene zu“ bei der Mitteldeutschen Zeitung) als gäbe es kein Morgen. Seufz.

  • Zu vollgefressen zum Abheben

    Ein Eichhörnchen turnt durch Zweige

    Keine Zikaden in Weinheim: das Eichhörnchen im dortigen Arboretum konnte noch munter turnen.

    Wieder mal eine Tier-Geschichte aus Forschung aktuell am Deutschlandfunk: In der Sendung vom 25.5. gab es ein Interview mit Zoe Getman-Pickering, die derzeit eine Massenvermehrung von Zikaden an der US-Ostküste beobachtet. Im Gegensatz zu so mancher Heuschreckenplage kam die nicht unerwartet, denn ziemlich verlässlich alle 17 Jahre schlüpfen erstaunliche Mengen dieser Insekten und verwandeln das Land in ein

    All-You-Can-Eat-Buffet. Es gibt schon Berichte von Eichhörnchen und Vögeln, die so fett sind, dass sie nicht mehr richtig laufen können. Die sitzen dann einfach nur herum und fressen eine Zikade nach der anderen.

    Es war dieses Bild von pandaähnlich herumhockenden Eichhörnchen, die Zikaden in sich reinstopfen wie einE Couch Potato Kartoffelchips, das meine Fantasie angeregt hat.

    Gut: Gereizt hat mich auch die Frage, wo auf der Fiesheitssakala ich eigentlich einen intervenierenden Teil der Untersuchung ansiedeln würde, der im Inverview angesprochen wird: Um

    herauszufinden [ob die Vögel noch Raupen fressen, wenn sie Zikaden in beliebigen Mengen haben können], haben wir auch künstliche Raupen aus einem weichen Kunststoff. Die setzen wir auf die Bäume. Und wenn sich dann Vögel für die künstlichen Raupen interessieren, dann picken sie danach

    und sind bestimmt sehr enttäuscht, wenn sie statt saftiger Raupen nur ekliges Plastik schmecken. Na ja: verglichen mit den abstürzenden Fledermäuse von neulich ist das sicher nochmal eine Stufe harmloser. Balsam für die Ethikkommission, denke ich. Das Ergebnis übrigens: Ja, die Zikadenschwemme könnte durchaus eine Raupenplage nach sich ziehen.

    Die Geschichte hat ein Zuckerl für Mathe-Nerds, denn es ist ja erstmal etwas seltsam, dass sich die Zikaden ausgerechnet alle 17 Jahre verabreden zu ihren Reproduktionsorgien. Warum 17? Bis zu diesem Interview war ich überzeugt, es sei in ÖkologInnenkreisen Konsens, das sei, um synchronen Massenvermehrungen von Fressfeinden auszuweichen, doch Getman-Pickering hat mich da eines Besseren belehrt:

    Aber es gibt auch Theorien, nach denen es nichts mit den Fressfeinden zu tun hat. Sondern eher mit anderen Zikaden. Der Vorteil wäre dann, dass die Primzahlen verhindern, dass unterschiedliche Zikaden zur gleichen Zeit auftreten, was dann schlecht für die Zikaden sein könnte. Und dann gibt es auch noch einige Leute, die es einfach nur für einen Zufall halten.

    Das mit dem Zufall fände ich überzeugend, wenn bei entsprechenden Zyklen in nennenswerter Zahl auch nichtprime Perioden vorkämen. Und das mag durchaus sein. Zum Maikäfer zum Beispiel schreibt die Wikipedia: „Maikäfer haben eine Zykluszeit von drei bis fünf, meist vier Jahren.“

    Aua. Vier Jahre würden mir eine beliebig schlechte Zykluszeit erscheinen, denn da würde ich rein instinktiv Resonanzen mit allem und jedem erwarten. Beim Versuch, diesen Instinkt zu quantifizien, bin ich auf etwas gestoßen, das, würde ich noch Programmierkurse geben, meine Studis als Übungsaufgabe abbekommen würden.

    Die Fragestellung ist ganz grob: Wenn alle n Jahre besonders viele Fressfeinde auftreten und alle m Jahre besonders viele Beutetiere, wie oft werden sich die Massenauftreten überschneiden und so den (vermutlichen) Zweck der Zyklen, dem Ausweichen massenhafter Fressfeinde, zunichte machen? Ein gutes Maß dafür ist: Haben die beiden Zyklen gemeinsame Teiler? Wenn ja, gibt es in relativ kurzen Intervallen Jahre, in denen sich sowohl Fressfeinde als auch Beutetiere massenhaft vermehren. Haben, sagen wir, die Eichhörnchen alle 10 Jahre und die Zikaden alle 15 Jahre Massenvermehrungen, würden die Eichhärnchen alle drei Massenvermehrungen einen gut gedeckten Tisch und die Zikaden jedes zweite Mal mit großen Eichhörnchenmengen zu kämpfen haben.

    Formaler ist das Problem also: berechne für jede Zahl von 2 bis N die Zahl der Zahlen aus dieser Menge, mit denen sie gemeinsame Teiler hat. Das Ergebnis:

    Balkendiagramm: Gemeinsame Teiler für 2 bis 20

    Mithin: wenn ihr Zikaden seid, verabredet euch besser nicht alle sechs, zwölf oder achtzehn Jahre. Die vier Jahre der Maikäfer hingegen sind nicht so viel schlechter als drei oder fünf Jahre wie mir mein Instinkt suggeriert hat.

    Ob die Verteilung von Zyklen von Massenvermehrungen wohl irgendeine Ähnlichkeit mit dieser Grafik hat? Das hat bestimmt schon mal wer geprüft – wenn es so wäre, wäre zumindest die These vom reinen Zufall in Schwierigkeiten.

    Den Kern des Programms, das das ausrechnet, finde ich ganz hübsch:

    def get_divisors(n):
      return {d for d in range(2, n//2+1) if not n%d} | {n}
    
    
    def get_n_resonances(max_period):
      candidates = list(range(2, max_period+1))
      divisors = dict((n, get_divisors(n)) for n in candidates)
    
      return candidates, [
          sum(1 for others in divisors.values()
            if divisors[period] & others)
        for period in candidates]
    

    get_divisors ist dabei eine set comprehension, eine relativ neue Einrichtung von Python entlang der altbekannten list comprehension: „Berechne die Menge aller Zahlen zwischen 2 und N/2, die N ohne Rest teilen – und vereinige das dann mit der Menge, in der nur N ist, denn N teilt N trivial. Die eins als Teiler lasse ich hier raus, denn die steht ohnehin in jeder solchen Menge, weshalb sie die Balken in der Grafik oben nur um jeweils eins nach oben drücken würde – und sie würde, weit schlimmer, die elegante Bedingung divisors[period] & others weiter unten kaputt machen. Wie es ist, gefällt mir sehr gut, wie direkt sich die mathematische Formulierung hier in Code abbildet.

    Die zweite Funktion, get_n_resonances (vielleicht nicht der beste Name; sich hier einen besseren auszudenken wäre auch eine wertvolle Übungsaufgabe) berechnet zunächt eine Abbildung (divisors) der Zahlen von 2 bis N (candidates) zu den Mengen der Teiler, und dann für jeden Kandidaten die Zahl dieser Mengen, die gemeinsame Elemente mit der eigenen Teilermenge haben. Das macht eine vielleicht etwas dicht geratene generator expression. Generator expressions funktionieren auch wie list comprehensions, nur, dass nicht wirklich eine Liste erzeugt wird, sondern ein Iterator. Hier spuckt der Iterator Einsen aus, wenn die berechneten Teilermengen (divisors.values()) gemeinsame Elemente haben mit den Teilern der gerade betrachteten Menge (divisors[period]). Die Summe dieser Einsen ist gerade die gesuchte Zahl der Zahlen mit gemeinsamen Teilern.

    Obfuscated? Ich finde nicht.

    Das Ergebnis ist übrigens ökologisch bemerkenswert, weil kleine Primzahlen (3, 5 und 7) „schlechter“ sind als größere (11, 13 und 17). Das liegt daran, dass bei einem, sagen wir, dreijährigen Zyklus dann eben doch Resonanzen auftauchen, nämlich mit Fressfeindzyklen, die Vielfache von drei sind. Dass 11 hier so gut aussieht, folgt natürlich nur aus meiner Wahl von 20 Jahren als längsten vertretbaren Zyklus. Ganz künstlich ist diese Wahl allerdings nicht, denn ich würde erwarten, dass allzu lange Zyklen evolutionär auch wieder ungünstig sind, einerseits, weil dann Anpassungen auf sich ändernde Umweltbedingungen zu langsam stattfinden, andererseits, weil so lange Entwicklungszeiten rein biologisch schwierig zu realisieren sein könnten.

    Für richtig langlebige Organismen – Bäume zum Beispiel – könnte diese Überlegung durchaus anders ausgehen. Und das mag eine Spur sein im Hinblick auf die längeren Zyklen im Maikäfer-Artikel der Wikipedia:

    Diesem Zyklus ist ein über 30- bis 45-jähriger Rhythmus überlagert. Die Gründe hierfür sind nicht im Detail bekannt.

    Nur: 30 und 45 sehen aus der Resonanz-Betrachtung jetzt so richtig schlecht aus…

  • Ach, Sparda!

    Werbeschriften der Sparda-Bank

    Bin ich komisch, weil ich nicht gerne Geld geboten bekomme fürs Ausliefern von Bekannten an Banken?

    Ich bin leider Kunde der Sparda-Bank Baden-Württemberg. „Leider“ beispielsweise, weil mich die Bank dann und wann mit 75 Euro dazu bringen will, als Makler für sie tätig zu werden. Fände ich das Konzept Ehre nicht kreuzdoof, müsste ich wegen Betrag und Inhalt des Angebots Satisfaktion fordern.

    Lästiger im Alltag ist das Online-Banking, zumal es mit jedem „Relaunch“ schlimmer wird. Die utopische Hoffnung, ich könnte Kontoauszüge per PGP-verschlüsselter Mail bekommen und Überweisungen per signierter Mail in einem einfachen, maschinenlesbaren Format einreichen, habe ich dabei schon längst aufgegeben. Wahrscheinlich zwingen die diversen Zahlungsdiensterichtlinien die Bank wirklich zu (aus Sicht EDV-kompetenter Menschen) unsinnigen Schnittstellen.

    Aber wenn es schon hakelige Webseiten sein müssen, sollten sie wenigstens technisch so halbwegs in Ordnung sein. Fantastische Maximalforderung: die elementaren Funktionen sollten ohne Javascript gehen; das würde viel mehr für die Sicherheit tun als alle Zweifaktorauthentifizierungen des Universums. I have a dream.

    Die Sparda jedoch geht, wie gesagt, mit großen Schritten in die entgegengesetzte Richtung, kürzlich zu einem Laden namens TEO, mit dem sich einige Sparda-Genossenschaften, wie es aussieht, eine Art Fintech leisten wollten. Um damit nicht gleich bauchzulanden, ziehen sie ihre Kunden aus ihren alten (eingestandenermaßen auch unangenehmen) Systemen dorthin um.

    Schon, dass die KundInnen beim Umzug ein manuelles „onboarding“ samt Neueinrichtung der Konten sowie der (Nicht-) Zustellung von Kontoauszügen duchlaufen müssen, wirkt unnötig umständlich, so sehr ich verstehen kann, dass TEO nicht unbedingt die (vermutlich eher bescheidenen) Passwort-Hashes des alten Sparda-Eigenbaus übernehmen wollten. Bei den Investitionssummen, um die es hier vermutlich geht, wären jedoch elegantere Migrationspfade („bitte ändern sie jetzt ihr Passwort“) schon denkbar gewesen.

    Das um so mehr, als das onboarding richtig schlecht gemacht ist: Es erscheint erstmal ein leerer Bildschirm, und das ändert sich auch dann nicht, wenn mensch den Browser Javascript ausführen lässt. Kein Fallback, nichts, immer nur ein weißes Fenster. Das Javascript von TEO nämlich wirft eine Exception, wenn es kein local storage bekommt, und niemand fängt diese Exception. Ganz im Stil der neuen Zeit gibt es nicht mal ein minimales HTML ohne Skripting – nur weiß. Au weia.

    Zwei Zeilen Javascript würden reichen, um nicht verfügbare local storage zu diagnostizieren und das etwas weniger murksig zu machen (ordentliches HTML wäre natürlich immer noch nett). Etwas mehr Arbeit ist es, dann zu erklären, was da wie lang gespeichert wird und warum es ohne nicht gehen soll. Das jedoch würde ohnehin in die Datenschutzerklärung gehören, viel zusätzliche Arbeit wäre es also nicht. Wenn die Datenschutzerklärung etwas taugen würde, heißt das. Aber dazu gleich.

    Ich könnte jetzt weitermachen mit Punkten, an denen der Kram an allen möglichen und unmöglichen Stellen kaputt geht, ohne dass es irgendeine Sorte Fehlermeldung außerhalb der Javascript-Konsole (und welche Muggels kennen die schon?) gibt. Aber selbst wenn mensch den Browser – was bei Bank-Geschäften schon als schlechte Idee gelten kann – nach und nach immer unvorsichtiger konfiguriert, sind noch schwer verstehbare Schnitzer im Programm, etwa, dass der Flickercode die falsche Größe hat. Die meisten Clients haben inzwischen eine recht zuverlässige Idee von der physikalischen Größe der Anzeige; ein width: 6.5cm im CSS ist doch wirklich nicht zu viel verlangt.

    Ähnliche WTF-Momente ergeben sich in der Datenschutzerklärung der TEOs. Derzeit heißt es dort in 2.3:

    Zur Erhöhung der Kundensicherheit nutzen wir in TEO den Service reCAPTCHA der Google Ireland Limited, Gordon House, 4 Barrow St, Dublin, D04 E5W5, Irland. Im Rahmen der Registrierung in TEO wird das reCAPTCHA zur Erkennung und Unterscheidung zwischen missbräuchlicher Nutzung personenbezogener Daten durch Maschinen und menschliche Eingaben eingesetzt.

    Als ich das gelesen habe, habe ich erstmal mit dem „onboarding“ aufgehört, denn wer mir was verkaufen will, sollte nicht verlangen, dass ich Schaufenster oder Verkehrsschlider auf Zuruf von google abklicke, und mich schon gar nicht zum Ausführen von googles Code nötigen (ebay, hörst du mich?). Sparda beruft sich für diese Frechheit auf Art. 6 1(f) DSGVO, also berechtigte Interessen des Betreibers. Das ist offensichtlich Quatsch; Textchas oder selbst hostbare Tests funktionieren besser und unter weniger Kundenverprellung.

    Am Ende musste ich aber dringend überweisen und war entschlossen, den reCaptcha-Mist zur Not doch durchzustehen. Musste ich am Ende nicht nicht, google hielt meinen Browser offenbar wirklich für menschengesteuert – wer weiß, warum. Aber TEO lädt tatsächlich eine Datei recaptcha__de.js von google-Servern, und zwar dort aus einem Pfad wie /recaptcha/releases/CdDdhZfPbLLrfYLBdThNS0-Y/recaptcha__de.js – da könnte ich schon allein bei der URL ins Grübeln kommen, was für Informationen google da wohl aus dem Banking ausleiten mag (ok: ja, ich vermute in Wirklichkeit auch, dass die Buchstabensuppe eher etwas wie einen git-Commit auf google-Seite identifiziert – aber wenn die googles wollten, könnten sie über Pfade dieser Art fast beliebige Mengen an Information exfiltrieren, was erst dann auffallen würde, wenn mal wer Pfade verschiedener Clients vergliche).

    Was denken sich Leute, wenn sie ohne Not reCaptcha auf ihre Seiten packen? Diese Frage stellt sich fast noch mehr beim nächsten Punkt:

    2.4 Google Web Fonts

    Um Inhalte browserübergreifend korrekt und grafisch ansprechend darzustellen, werden in TEO Web Schriften von Google Fonts verwendet. Die Einbindung dieser Web Fonts erfolgt nicht über Google. Die Schriften liegen lokal auf Servern. Es erfolgt kein externer Serveraufruf bei Google. Es findet keine Informationsübermittlung an Google statt.

    Wenn ich recht verstehe, was die da sagen wollen, dann wäre das: Wir nehmen Fonts von google, aber ziehen sie nicht von google. Dann stellt sich die Frage, was diese Information hier soll – wenn die anfangen, aufzuzählen, wer alles irgendwie an der Software beteiligt war, die auf ihren Servern läuft, sind sie lang beschäftigt.

    Um das noch absurder zu machen: sie lügen (jedenfalls im Effekt). Zumindest gestern und heute versucht die Seite für mich, die URL https://fonts.gstatic.com/s/roboto/v18/KFOmCnqEu92Fr1Mu4mxP.ttf (und noch zwei weitere; ich hoffe, die Buchstabensuppe erhält nicht allzu viel Kompromittierendes über mich) zu dereferenzieren. Damit hat google die IP, via Referrer den Umstand, dass gerade wer überweist, und vermutlich auch die Muggel-Identität, da mich wundern würde, wenn nicht normal der google-Cookie auch an gstatic gehen würde (ich muss gestehen, das nicht näher untersucht zu haben, zumal fonts.gstatic.com auf meinen Maschinen zu localhost auflöst).

    Was soll das? Wenn TEO schon Geld in die Hand nimmt und meint, mir die Wahl des Fonts vorschreiben zu müssen (was ich übrigens lästig finde), dann sollen sie wenigstens irgendwas kaufen statt die vergifteten Geschenke von google zu nehmen und dann noch in ihrer Datenschutzerklärung zu lügen.

    Für eine teilweise Erklärung für die, na ja, Lüge (ich will gnädig sein: „das Versehen“) mit den google-Fonts hilft ein Blick auf die 107 (!) Requests, die mein Browser macht, um die Wurzelseite des Online-Bankings aufzubauen. Dabei zeigt sich, dass immerhin die meisten Daten von TEO-Servern kommen. Es bleiben aber, nach der Vorrede kaum überraschend, doch einige Cross-Site-Requests.

    • die erwähnten Google-Fonts
    • ein CSS, ein Logo, das Captcha-Javascript (von www.gstatic.com)
    • eine bizarre Datei „anchor“, die offenbar im Zusammenhang mit Captcha steht (und die den Browser vermutlich dazu bringt, die Fonts von fonts.gstatic.com zu ziehen)
    • Und dann noch Ressourcen list und logoutWeb von prod-teo.itmr.de, beides JSON, ersteres mit Zeug, was erstmal nach Werbequatsch aussieht, aber vermutlich Identitäsinformation ist.

    Die Suche nach ITMR in der Datenschutzerklärung ist vergeblich, www.itmr.de zeigt ohne Javascript nur einen Spinner:

    Ein Warte-Spinner

    Wenn dieses Ding genug Schöpfungshöhe für Copyright hat, liegt dieses vermutlich bei itmr. Hier verwendet unter der, klar, Satireklausel.

    Der Spinner ist schon mal deutlich mehr als die leere Seite von TEO. Mit Javascript kommt sogar ein Titel: „ITM Research GmbH – Smart Cloud Computing”, ansonsten bleibt es beim Spinner. ITM Research… nichts, was Wikipedia kennen würde. Smart? Na ja. Zieht auch erstmal fünf Pfund Zeug von Google, Fonts und eine Familienpackung Javascript von maps.googleapis.com, einen Haufen PNGs von www.google.com. Ziemlich viel Kram für einen rotierenden Spinner.

    Wenn ich der Seite obendrauf local storage erlaube, kommt endlich das heiß erwartete Cookie-Banner, und zwar so:

    Cookie-Banner mit vor-abgeklickten Trackingcookies

    Echt jetzt? Per default angeklickte Tracking-Cookies? Wie smart muss mensch wohl sein, um für so ein bisschen Überwachungsmehrwert ein fettes Bußgeld zu riskieren?

    Zurück zur Ausgangsfrage: Was für Daten tauscht die Sparda eigentlich mit diesen etwas anrüchigen Gesellen aus? „ITM-ation – unser Synonym für digitale Transformation und Innovation“ schreiben sie, wenn ihnen der Browser gut genug ist. Diese Leute bekommen mit, wenn ich mit der Sparda-Bank rede? Uh.

    Ich klicke auf „Mehr Erfahren”. Beim Bullshit Bingo hätte ich gleich gewonnen:

    Wir realisieren Projekte der digitalen Transformation und Innovation, um Ihnen durch die Digitalisierung von Geschäftsmodellen, Wertschöpfungsketten und Prozessen mehr Wachstum in einem immer stärkeren Wettbewerbsumfeld zu ermöglichen. [...] Wir entwickeln Apps und Web-Apps, um Geschäftsprozesse in digitale Ökosysteme zu transferieren. Wir entwickeln dabei Ihre Datenveredelungsstrategie, setzen aber auch externe Echtzeit-Dienste der künstlichen Intelligenz (KI) wie zum Beispiel Cognitive Services und Watson ein. [...] Eine positive User Experience ist unabdingbar in der Digitalisierung Ihrer Prozesse. Um das jederzeit und von überall zu erzielen, brauchen Sie zwischen Ihrer Anwendung und Ihren Kunden über alle Kanäle und Anwendungsoptionen hinweg funktionale und ansprechende Benutzeroberflächen und Schnittstellen.

    Der Bullshit gegen Ende suggeriert (ebenso wie der konsistente Totalausfall ohne …

  • Immer auf die Linken

    In ihrem Engagement „gegen Rechts“ beschränkt sich die Regierung im Wesentlichen auf autoritäre Maßnahmen, also Verbote und Drohungen. Das ist schade, denn das Runtertönen des regierungsamtlichen Nationalismus („deutsche Interessen wahren“), Militarismus („Fähigkeit zur Machtprojektion“), Autoritarismus (§114 StGB, um mal was besonders Schlagendes zu erwähnen; die Rote Hilfe Berlin dazu) und der vielen anderen rechten Versatzstücke („Flüchtlingskrise“, „wegsperren, und zwar für immer“ usf) könnte erstens vielleicht wirklich was bringen und würde zweitens nicht am Ende in aller Regel menschenfreundliche Anliegen treffen.

    Für die Beobachtung, nach der „Gesetze gegen Rechts“ (aktuell z.B. das verschärfte Hassgesetz) am Ende in aller Regel Linke treffen, habe ich gerade ein Beispiel gefunden, das ich gar nicht in diese Kategorie gepackt hatte: Den Entzug der Gemeinnützigkeit der VVN/BdA. Dabei hatte das Berliner Finanzamt der Antifa-Organisation eine dicke Steuernachforderung geschickt unter Hinweis auf erstens den Bericht des bayrischen Inlandsgeheimdienstes („Verfassungsschutz”, VS), der die VVN/BdA als staatsfeindlich listet.

    Der Eintrag als solcher wäre ja nicht schlimm, denn dass der VS aus Schurken besteht und aufgelöst werden muss, ist nicht erst seit Maaßen klar. Jedoch hat der Gesetzgeber zweitens 2009 dem §51 Abgabenordnung (AO) – der Einleitung zur Regelung von Steuerbegünstigung und Gemeinnützigkeit – einen Absatz 3 hinzugefügt, in dem es heißt:

    Bei Körperschaften, die im Verfassungsschutzbericht des Bundes oder eines Landes als extremistische Organisation aufgeführt sind, ist widerlegbar davon auszugehen, dass die Voraussetzungen des Satzes 1 [ausschließlich und unmittelbar gemeinnützige, mildtätige oder kirchliche Zwecke] nicht erfüllt sind.

    – der VS hat mithin ein effektives Vetorecht für die Anerkennung steuerlicher Begünstigung, was nicht weit weg ist von der Methode der Klassifikation als ausländischer Agent durch das Justizministerium in Russland[1]. Wie das die beschließenden ParlamentarierInnen mit einem transparenten, gewaltengeteilten Staatsmodell zusammenbekommen haben, ist mir schleierhaft.

    Aber stellt sich raus: sie haben sich wohl als antifaschistisch bewegt gewähnt, denn §51 (3) AO entstand als Folge des gescheiterten Verbotsprozesses gegen die NPD. Zur Erinnerung: 2001 bis 2003 hatten Bund und Länder versucht, die NPD vor dem Bundesverfassungsgericht verbieten zu lassen. Das scheiterte 2003, weil die diversen Inlandsgeheimdienste sich weigerten, ihre MitarbeiterInnen abzuziehen und Vertrauenspersonen abzuschalten, so dass klar hätte werden können, wie viel der Organisation tatsächlich nicht nur aus Geheimdienst besteht. Wo auf dem Spektrum von „NPD decken“, „die eigene Existenzgrundlage aufbauen“ und „unfähig sein“ das anzusiedeln war, bleibt bis auf Weiteres dem eigenen Geschmack überlassen (vgl. auch Wikipedia zum ersten NPD-Verbotsverfahren).

    Tatsäche ist jedenfalls: Der VS hat die NPD gerettet, und nun dachten sich vermutlich nicht ganz übelmeinende Personen aus der Restpolitik, der Laden sollte zumindest nicht noch anders als über den VS in großen Mengen staatliches Geld bekommen. Dazu hätte eine Änderung im Parteiengesetz gereicht (und selbst das hätte ich als schlechte Idee klassifiziert). Dass auch die ganz normale Vereine regulierende Abgabenordnung geändert wurde, nun, das könnten weniger wohlmeinende Menschen auf den Fluren der Ministerien angeleiert haben. Vielleicht war es aber auch wirklich nur der Versuch, proaktiv Schlupflöcher zu stopfen.

    Nun, zehn Jahre später wandte das Finanzamt Berlin das in sogar halbwegs glaubhaftem antifaschistischem Furor geänderte Gesetz gegen die größte antifaschistische Organisation der BRD.

    Das hat letztes Jahr für einige Mobilisierung und viele Eintritte in die VVN/BdA gesorgt, nicht jedoch für eine Änderung des anrüchigen §51 (3) AO. Stattdessen haben sich Finanzamt Berlin und VS Bayern elegant aus der öffentlichen Schusslinie genommen, indem der VS Bayern seine Einschätzungen nur noch auf den bayrischen Landesverband der VVN beschränkt und das Finanzamt Berlin daher die Bundesorganisation nicht mehr als unerwünscht einstufen muss.

    Was aber heißt: Der nächste VS, der einen Laden plattmachen will, der sich auf Steuerbegünstigung verlässt, kann das immer noch tun.

    [1]In Russland sind im Laufe der Jahre eine Art Trucker-Gewerkschaft und eine Selbsthilfe-Organisation von Diabetiker_innen in den Fokus des ausländische-Agenten-Apparats gekommen. Dass VS und Finanzamt immerhin auf die VVN-BdA und nicht etwa auf Männergesangsvereine losgehen: das macht Hoffnung im Hinblick auf die Funktionsfähigkeit der deutschen Bürokratie jedenfalls im Vergleich zur russischen.

« Seite 15 / 18 »

Letzte Ergänzungen