• Kopfzahlen 2: Wir fressen der Welt die Haare vom Kopf

    Im Hintergrund Politik vom 9.9.2021 habe ich die schockierendste Zahl dieses Jahres gehört. Das Thema wird dort so eröffnet:

    1,6 Milliarden Hektar Ackerflächen gibt es auf der Erde. Nach den Zahlen des Umweltbundesamtes wächst nur etwa auf einem Fünftel davon Nahrung für die menschliche Ernährung. Auf den übrigen vier Fünfteln wird dagegen Tierfutter und Biosprit produziert.

    Auch wenn mir klar war, dass bei der „Wandlung“ von Soja und Getreide in Steaks oder Eier zwischen 70% und 95% des Nährwerts verlorengehen[1] – „Wandlung“ ist hier eingestandenermaßen ein wenig euphemistisch –, hatte ich diese danach relativ naheliegende Konsequenz nicht auf dem Schirm: 80% der Äcker auf diesem Planeten gehen im Groben in „unsere“ (also die der reichen Länder) Völlerei. Derweil:

    Und trotzdem gehen immer noch mehr als 800 Millionen Menschen hungrig zu Bett. Und viele davon sind selbst Kleinbauern – und Kleinbäuerinnen. Sie erwirtschaften auf einem Bruchteil der weltweiten Ackerfläche bis zu 70 Prozent der menschlichen Nahrung, gesicherte Zahlen gibt es hier nicht […]

    Also: unsere tolle, marktgestählte, industrielle Landwirtschaft trägt plausiblerweise nur zu 30% zur Welternährung bei, obwohl sie den Großteil der intensiv zur Nahrungsmittelproduktion nutzbaren Landfläche in Anspruch nimmt (und um die 10% der CO2-Emissionen verursacht). Das war, was mich wirklich schockiert hat.

    Wenn „unsere“ Firmen im globalen Süden für die Produktion unseres Tierfutters und, schlimmer noch, unseres „Biosprits“ Land requirieren und den dortigen Kleinbauern wegnehmen („Landgrabbing“), ist das schlicht ein Hungerprogramm. Wieder mal frage ich mich, wie die Leute in, sagen wir, hundert Jahren auf uns zurückblicken werden.

    Kopfzahlen für große Flächen

    Unterdessen sind die 1.6 Milliarden Hektar von oben ein guter Anlass, meine Kopfzahlen für „große“ Flächen loszuwerden. Erstmal: Ein Hektar ist ein Quadrat, dessen Diagonale ein Mensch in etwa zwei Minuten durchläuft. Nämlich: Ein nicht allzu hektischer Mensch läuft so gegen 4 km/h oder etwas mehr als einen Meter pro Sekunde. Die Diagonale eines Quadrats mit 100 Meter Kantenlänge (eben ein Hektar) sind 100 Meter mal √2 oder rund 150 Meter[2]. Bei einem guten Meter pro Sekunde dauert es also rund 120 Sekunden von Ecke zu Ecke durch die Mitte.

    Ansonsten ist die bessere Einheit für große Flächen der Quadratkilometer, also 100 ha. Mithin: 1.6e9 ha (1.6 ⋅ 109 ist in meinem Eingabeformat ReStructuredText echt lästig zu schreiben, weshalb ich mir hier die in eigentlich allen nichtantiken Programmiersprachen übliche Schreibweise genehmige) sind 1.6e7 oder 16 Millionen km².

    Wie viel ist das? Etwas albernerweise weiß ich immer noch die Fläche der alten Sowjetunion, des in meiner Kindheit größten Staats der Erde: das waren 22 Millionen km². Es gibt also global etwas weniger Acker als das, was mal alles zur Sowjetunion gehörte. Ich denke, der zeitgemäße Ersatz sind einerseits Afrika[3] mit 30 Millionen km² und andererseits die USA und China mit jeweils rund 10 Millionen km². Ich finde, auf diese Weise kriegt mensch schon mal ein Gefühl, wie die global genutzte Ackerfläche auf einer Weltkarte aussähe – und wie viele Wüsten, Tundren, Hochgebirge, Wildnisse oder Parkplätze es so geben wird.

    A propos Welt: Die Erde hat bei einem Radius von etwa 6000 km eine Fläche von 4 π (6000 km)² oder 450 Millionen km² oder auch 15 Mal Afrika, wobei mensch nicht vergessen sollte, dass im Fall der Erde 70% der Fläche von Meeren eingenommen wird und also Afrika deutlich über 20% der Landfläche ausmacht.

    Zwecks Gefühl und Abschätzung merke ich mir noch, dass die BRD eine Fläche von rund 350'000 km² hat (oder, für Leute, die sich das so leichter merken können: eine Drittelmillion). Kombiniert mit der Kopfzahl für Afrika heißt das: die BRD passt 100 Mal in Afrika rein. Von der Fläche her. Vom Ressourcenverbrauch her… eher so zwei Mal[4].

    Die Fläche von Baden-Württemberg ist 35'000 km². Das ist bequem zu merken, weil es einen Faktor zehn kleiner ist als die BRD, und ist als Größenordnung für ernstzunehmende Bundesländer auch sonst ganz brauchbar (die Spanne reicht von 71'000 km² für Bayern bis 16'000 km² für Schleswig-Holstein, also alles grob innerhalb von einem Faktor zwei, was für viele Abschätzungen überallhin reicht).

    So eine Zahl im Kopf ist beispielsweise praktisch, wenn mensch am Neckar steht und abschätzen will, wie viel Wasser da wohl fließt: Sein Einzugsgebiet wird so etwa die Hälfte des Landes sein (fürs einfache Rechnen: 20'000 km²), und es wird da zwischen 500 und 1000 mm pro Jahr regnen (800 mm Niederschläge pro Jahr sind keine unvernünftige Schätzung für normale Gebiete in der BRD). Wegen einfacher Rechnung nehmen wir hier mal 1000 mm, und dann müssten über dem Einzugsgebiet jedes Jahr 20e3 km² ⋅ 1e6 m²/km² ⋅ 1 m an Wasser runterkommen, also irgendwas wie 20e9 m³. Einiges davon wird, gerade im Sommer, verdunsten oder auch von Planzen in Sauerstoff verwandelt, bevor es in Heidelberg vorbeikommt; das Problem verschiebe ich aufs Ende des übernächsten Absatzes.

    20 Milliarden Kubikmeter pro Jahr sind etwas unhandlich, wenn mensch gerade auf den Fluss guckt. Wie sieht es pro Sekunde aus? Nun, ein Jahr hat etwas wie 3e7 Sekunden (vgl. die klassische Kopfzahl in Kopfzahlen 1), also wird der mittlere Abfluss vom Neckar was wie 20/3 ⋅ 10², also rund 670 m³/s sein. Tatsächlich gibt die Wikipedia 145 m³/s für den Pegel Mannheim an.

    Gut: wir liegen einen Faktor vier zu hoch, aber das ist für so eine Abschätzung schon ok, zumal der tatsächliche Abfluss übers Jahr hinweg um weit mehr als so einen Faktor schwanken wird. Wers genauer haben will: das wirkliche Einzugsgebiet sind nur 13'934 km², und dann ist da der Evapotranspirationswert (vgl. Erläuterung in der Wikipedia), dessen Einfluss nicht ganz einfach anzubringen ist, schon, weil einiges des verdunsteten Wassers ja noch im Einzugsgebiet wieder abregnet oder -taut. Egal: Ein Faktor vier ist oft gut genug.

    Letzte Kopfzahlen in dieser Rubrik: Größere europäische Städte wie Berlin oder Hamburg haben so gegen 1000 km² (in Wirklichkeit: 892 bzw. 755), kleinere Städte wie Heidelberg eher so 100 km² (in Wirklichkeit: 109).

    [Alle Flächenangaben hier aus den jeweils erwartbaren Wikipedia-Artikeln]

    [1]Das sind FAO-Schätzungen, die z.B. die gesetzliche Unfallversicherung grafisch schön aufgemacht hat. Die FAO-Quellen habe ich auf die Schnelle nicht im Netz gefunden.
    [2]Eine nicht direkt flächige Kopfzahl obendrauf: √2 ist ungefähr 1.44, und der Kehrwert ungefähr 0.7. Ein wenig flächig ist das aber auch: Die Fläche eines A4-Blatts ist (theoretisch genau) (√2)-(2⋅4) m², für A3 ist sie (√2)-(2⋅3) m² usf. Messt und rechnet selbst oder lest einfach im Wikipedia-Artikel zu Papierformaten nach, warum das so ist.
    [3]Asien (55 Millionen km²) eignet sich nicht so gut als Referenz, weil zu viele Leute Europa als separaten Kontinent abrechnen und zumindest ich mir nie sicher wäre, ob meine Fläche mit oder ohne Europa zählt (die 55 Millionen zählen den ganzen Kontinent, also mit den Gebieten westlich von Ural und kaspischem Meer).
    [4]CO2-Emission der BRD aus Kopfzahlen 1: 2/3 Gigatonnen; für Afrika insgesamt gibt das dort zitierte Our World in Data-CSV 1.4 Gigatonnen.
  • Patriotische Raison

    Die heutige Presseschau im Deutschlandfunk war mal wieder niederschmetternd.

    Zum Afghanistan-„Zapfenstreich“ gestern fällt der taz gerade noch ein, es sei „eher“ ein „Kuriosum“, während die anderen Blätter sich noch fester hinter ihrer Armee versammeln:

    • Es wäre in Afghanistan ja sonst noch viel schlimmer gewesen (Volksstimme); angesichts der tatsächlichen Verhältnisse ist das nur schwer vorstellbar: Geringer als in Afghanistan, 51.3 Jahre laut CIA World Factbook von 2016, ist die Lebenserwartung derzeit nur noch in zwei Staaten.
    • Soldaten – und nicht etwa ihre Opfer – seien „traumatisiert und physisch verletzt“ (Mitteldeutsche; den naheliegenden Schluss, die Bundeswehr, die dafür ja verantwortlich ist, aufzulösen, zieht sie natürlich nicht).
    • „gut gemeint“ (Nürnberger Nachrichten).
    • „Außen- und Sicherheitspolitik den nötigen Raum“ geben (Märkische Oderzeitung).
    Strammstehende und taktstockschwingene Soldaten

    Screenshots vom Zapfenstreich, Rechte fürs Rohmaterial hat die ARD.

    Au weia. Niemand möchte sich durch Stellen der offensichtlichen Frage als vaterlandsloser Geselle outen: „Was war denn das für ein bizarres Spektakel?“

    Strammstehen, Tschingdarassabum, bunte Kappen, Orden? Für Leute, die für die Regierung töten? Leute, es ist 2021. Es hat zwischendurch ein 20. Jahrhundert gegeben. Erinnert ihr euch?

    Den Auweia-Preis für den fürchterlichsten Kommentar räumt aber erneut die FAZ ab, wenn sie fordert:

    Nie wieder darf die ‚Parlamentsarmee‘ in eine Mission geschickt werden, in der sie mit ihrem Blut für die Unschärfe des Mandats und die Inkonsequenz, um nicht zu sagen: Feigheit der politischen Entscheider büßen muss.

    Das ist nur noch ein paar Millimeter von „im Felde ungeschlagen“ und dem Narrativ hinter der Dolchstoßlegende („die tapferen Jungs hätten den Feind schon platt gemacht, aber die Politiker...!“) entfernt. Wenn in dieser Umgebung dann noch Testosteron-Vokabeln wie „feige“ und „Entscheider“ auftauchen, schlägt mein persönliches Jetzt-Flucht-planen-o-Meter schon ziemlich deutlich aus.

  • Ach, Bahn, Teil 1: Captchas und Bodensee

    Alte Waggons und eine Dampflok

    Einen Vorteil hat die dysfunktionale Bahn: Mensch sieht etwas von der Welt, für mich und heute etwa dieses Stück Bahnromantik am Bahnhof von Rottweil.

    Ja, klar, es ist wohlfeil, über die Bahn zu ranten. Andererseits ist es auch unmöglich, mit der Bahn zu reisen und es nicht zu tun. Drum genehmige ich mir das gleich mal in mehreren Teilen. Wobei: Ich bin die Segnungen der Privatisierung nach meinen coronabedingten Zugpausen auch einfach nicht mehr gewöhnt. Vielleicht gibt es gar nicht mehr so viele weitere Teile von „Ach, Bahn“, wenn ich mich erstmal wieder in die Realitäten privatisierter Infrastruktur gefunden habe (vgl. auch Post-Wettbewerb).

    Sprinter und Antisprinter

    Ich fahre gerade von Heidelberg auf die Insel Reichenau. Das sind so etwa 200 Kilometer. Weil ich um 12 Uhr angekommen sein soll, musste ich in Heidelberg um 7:02 losfahren, fünf Stunden vorher. Ok, vielleicht sollen ja Leute eh nicht so viel durch die Gegend fahren, aber wenn ich gestern bei heise lese, die Bahn wolle „mit Inlandsflügen konkurrieren“ und hole künftig zwischen Berlin und Köln eine halbe Stunde raus: Nun, so sehr Flugzeuge viel Dreck und großflächig Lärm machen, das weit größere Problem sind immer noch Autos. In Konkurrenz zu denen werden netto fünf Stunden für 200 km, zumindest solange es Autobahnen gibt, nicht viele Leute auf die Schiene ziehen.

    Oder, in den Worten der taz zu den neuen Sprintern aus dem Heise-Artikel: „Dreimal täglich je Richtung fährt dann zum Beispiel ein Zug ohne Unterbrechung direkt von Berlin nach Köln. Pech gehabt, wenn man in einen Ort dazwischen will.“

    Ja, klar, die komplizierte und langsame Verbindung für mich und heute liegt bestimmt auch daran, dass derzeit die Schwarzwaldbahn nicht fährt. Oh Verzeihung, dass da Schienenersatzverkehr ist. Tja. Ich würde, dies bedenkend, als ein Infrastrukturziel vor dem Ausbau auf 350 km/h-Strecken vorschlagen: Möglichst viele Strecken so ausbauen, dass weitere Bauarbeiten ohne Schienenersatzverkehr und Zugverlegungen durchgeführt werden können. Das würde mir gerade als wichtiger Punkt erscheinen, um die Bahn als Autoalternative glaubhaft zu machen. Zugegeben, vielleicht erscheint mir dieser Punkt wichtiger als er ist, weil ich öfters in der weiteren Umgebung der Stuttgart 21-Katastrophe unterwegs bin. Dort nämlich litt tatsächlich die Mehrheit meiner Zugfahrten in den letzten 10 Jahre darunter, dass Züge, die meine Verbindung viel angenehmer gemacht hätten, baustellenbedingt nicht fuhren.

    Erlaubt mir kurz einen Extra-Nostalgie-Jammer bezüglich der speziellen Heidelberg-Bodensee-Relation: Ich bin alt genug, um mich an den Interregio zu erinnern, der einstmals direkt von Heidelberg nach Konstanz fuhr; ich weiß zwar nicht mehr, wie lang der wirklich brauchte, aber es wäre ja schon mal großartig, wenn ich nicht alle halbe Stunde wieder alles zusammenpacken und umsteigen müsste.

    Ach, Bahn. Sollten die Leute, die damals das Einstampfen der Interregios zu verantworten hatten, schon tot sein, hat der Teufel hoffentlich noch ein paar Grad draufgelegt in dem Teil der Hölle, in den sie gefahren sind.

    Von einem, der mit der Bahn-Webseite interagierte

    Ähnliche Wünsche hege ich im Hinblick auf die Leute, die derzeit an der Bahn-Webseite schrauben. Beim Buchen gestern: Ich logge mich auf bahn.de ein, gebe meine richtigen Credentials ein. Ein Captcha poppt auf. Ich soll nacheinander Fahrräder und Boote markieren. Ich überlege schon, einfach zu Hause zu bleiben, tue der Bahn aber trotzdem den Gefallen. Ich klicke mich zum Bezahlen durch, lasse dort meine gewohnte SEPA-Lastschrift angeklickt.

    Doch irgendwie mag die Bahn das nach nochmaligem Überlegen nicht mehr und schreibt auf der nächsten Seite in Rot: „Die folgenden Zahlungsmöglichkeiten bestehen für diese Reise“ (oder so ähnlich). Lastschrift ist jetzt ohne weitere Erklärung verschwunden. Nach einem tiefen Durchatmen wähle ich Kreditkarte. Ein paar Felder poppen auf, doch kann ich dort nichts eingeben (und, wohlgemerkt, das ist ein hundsordinärer Firefox, nicht mein üblicher Luakit; ich erwarte von der Bahn ja schon gar nicht mehr Browserunabhängigkeit). In einem Versuch, dem Bahn-Code eine zweite Chance zu geben, mache einen Reload. Eine kurze Fehlermeldung, und dann loggt mich der Bahn-Kram aus.

    Ich brülle laut und fluche, knirsche mit den Zähnen und fantasiere von Teufeln an großen Schaltpulten, die die Temperatureinstellung von „fies“ auf „jenseits der Spezifikation“ drehen. Ich wechsele auf einen fast unkonfigurierten, erweiterungslosen Chromium. N-n-n-n-och ein Captcha! Lokomotiven und Lkws dieses Mal. Ich bin jetzt noch heiser von der Fluchkaskade, die sich an dem Punkt meiner Kehle entrang. Immerhin ging vom Chromium aus die SEPA-Lastschrift. Warum auch immer.

    Captchas! C-a-p-t-c-h-a-s!

    For the record: Wenn du wem was verkaufen willst, dann verschwende nicht seine/ihre Zeit mit Captchas. Das ist wirklich ein No-no. Niemand will Objekt verhaltenspsychologischer Experimente sein, und auch nicht von Dingen, die so aussehen. Vielleicht kannst du deine NutzerInnen dazu bringen, da mitzumachen, wenn du so tust, als würdest du ihnen was schenken. Aber wenn sie dir Geld geben, dann musst du im Zweifelsfall Leute bezahlen, um Robots rauszufiltern (wenn es das schon brauchen sollte, was ich in den meisten Fällen bestreiten würde); zur allergrößten Not ist vielleicht noch eine knappe Texteingabe zur Robot-Abwehr („Textcha“) statthaft.

    Völlig absurd ist es natürlich, ein Captcha bei korrekt eingegebenen Credentials zu verlangen. Woher bitte sollten Robots die haben? Was denken sich diese Leute? Wenn das eine Abwehr von Clients sein sollte, die die (eingestanderenmaßen etwas mühsame) Interaktion mit der bahn.de-Webseite automatisieren: Öhm… Was genau wäre das Problem mit denen?

    Oh: Und wenn dich jemand auf so einen solchen Fehler hinweist (das habe ich in diesem Fall schon vor zwei Wochen per Mail an die Bahn-Kontaktadressee gemacht): Reagiere irgendwie. Ein „nur ein wenig Geduld, wir arbeiten an einer Fehlerlösung“ wäre zwar nicht optimal, ist aber immerhin besser als gar nichts. Überflüssig zu erwähnen, dass die Bahn für „gar nichts“ optiert hat.

    Auf der positiven Seite: Die Strecke zwischen Stuttgart und Singen ist hübsch, gerade hier in der Gegend von Horb. Ohne die Schließung der Schwarzwaldbahn hätte ich das wahrscheinlich nie gesehen.

  • Ella: Fast ein Jahr im Gefängnis

    Gerade an dem Tag, an dem in meinen Überlegungen zu Wahlen und Informationstheorie anmerkte, bedeutender als Wahlen sei für die politische Partizipation „eine Justiz, die es häufig genug doch noch schafft, diesen wenigstens dann und wann ein wenig Schutz vor den Übergriffen der Exekutive zu geben“, fand eine verteilte Uraufführung eines Films statt, der Zweifel am „häufig genug“ ziemlich nachhaltig vertieft.

    Es geht darin um den Fall von „Ella“ oder auch „UP1“ für „Unbekannte Person 1“, die seit der brutalen Räumung des Dannenröder Forsts im letzten November im Gefängnis sitzt. Der Fall folgt dem von den Rondenbarg-Prozessen allzu bekannten Muster, bei dem die Polizei lebensgefährliche Einsatzmethoden – im Dannenröder Forst insbesondere das Durchtrennen lebenswichtiger Seile – durch absurd aufgeblasene Vorwürfe gegen die Opfer dieser Einsätze in irgendeinem Sinne zu rechtfertigen versucht; in Ellas Fall kommt sicher noch einiger Zorn über ihre erfolgreiche Personalienverweigerung dazu.

    Einsatzszene

    Ein Sequenz vom Anfang des Ella-Films: Ein Polizist wirft einen Aktivisten von einem Baum runter. Die öffentliche Zurückhaltung angesichts erschreckend gewalttätiger Räumungstechniken im Wald (na gut, inzwischen: Autobahnbaustelle) ist jedenfalls im Hinblick auf künftige Möglichkeiten politischer Partizipation schon ziemlich beunruhigend.

    Die erste Gerichtsinstanz hat dabei mitgemacht, und nun soll sie noch weitere 16 Monate im Gefängnis schmoren. Ohne große Öffentlichkeit wird das wohl auch so kommen, denn ein Landgerichtsprozess geht normalerweise nicht im Eiltempo. Und dann hilft auch ein Freispruch nichts mehr.

    Sowohl im Hinblick auf Ellas Schicksal als auch auf die Diskussion indiskutabler Polizeitaktiken finde ich den Film also höchst verdienstvoll. Wer ihn verbreiten kann, möge das tun, z.B. von youtube; wer das Ding ohne google bekommen will, möge sich per Mail rühren, dann lege ich es auf von mir kontrollierten Webspace (ich spare mir die 800 MB in der Erwartung, dass eh alle zu youtube gehen).

    Nachtrag (2022-05-10)

    Meine Spekulation, es sei bei der ganzen Einsperrerei im Wesentlichen um Ellas Weigerung gegangen, ihre Personalien abzugeben, gewinnt an Substanz. Die Staatsgewalt lässt Ella jetzt, da sie ihre Identität preisgegeben hat, frei, wie die taz berichtet. Die Entscheidung wird den mitredenden Behörden leicht gefallen sein, denn sie werden alle nicht wild sein auf eine weitere Klärung der inzwischen offizell gewordenen Tatsache, dass „die Beamten die Unwahrheit gesagt hatten“ (so die taz sehr staatsfreundlich) und des offensichtlichen Desinteresses beider Gerichtsinstanzen, die Polizei beim Lügen zu erwischen. Zumindest die zweite Instanz kannte ja (vermutlich) den hier besprochenen Film.

  • Wahlen und Informationstheorie

    Ich hatte neulich versprochen, ein paar Worte zu Zweifeln am repräsentativen Modell zu sagen, die sich aus der Informationstheorie speisen. Dazu braucht es zunächst einen Begriff von Information, und um den definieren zu können, ein Modell von Nachrichtenübertragung, in diesem Fall etwa: eine Wahl überträgt die Wünsche zur Organisation der Gesellschaft von Wählenden an die Macht.

    Information: Nachrichten in Bits gemessen

    Wie viel Information steckt nun in den Wunschlisten dieses Modells? Nun, Information – gemessen in Bit – lässt sich recht anschaulich definieren als die Zahl der ja/nein-Fragen, die mensch bei optimaler Fragestrategie im schlimmsten Fall stellen muss, um einer Menge verschiedener Nachrichten eine ganz bestimmte Nachricht rauszufiltern.

    Wenn die Wahl heißt „Parkplätze zu Parks?“ und sonst nichts, reicht eine solche Frage, und mithin wird ein Bit Information übertragen. Kommt als zweite Frage hinzu „Lebkuchen subventionieren?“, braucht es zwei Fragen und mithin Bit, um die kompletten Wünsche zu übertragen.

    Wenn mensch das fortführt, ergibt sich: Für ein komplettes Programm mit n binären Entscheidungen braucht es naiv erstmal n bit Information. Diese n bit reichen aus, um 2n Programme zu kodieren, nämlich alle Kombinationen von ja/nein Entscheidungen über die n Fragen hinweg. Wenn es nur die Parkplätze und die Lebkuchen von oben gäbe, wären das beispielsweise:

    • für Parkplätze/für Lebkuchen
    • für Parkplätze/gegen Lebkuchen
    • gegen Parkplätze/für Lebkuchen
    • gegen Parkplätze/gegen Lebkuchen

    Nochmal: Mit n bits kann ich 2n verschiedene Nachrichten (hier also Programme oder Wunschzettel) auseinanderhalten.

    Das kann mensch jetzt rückwärts aufziehen. Um den Informationsgehalt einer Nachricht herauszubekommen, muss mensch sehen, wie viele verschiedene Nachrichten es gibt und diese Zahl dann als 2x darstellen. Das x in diesem Ausdruck ist der Informationsgehalt in Bit. Das x braucht mensch nicht zu raten, denn es ist nichts anderes als der Logarithmus der Zahl der verschiedenen Nachrichten, genauer der Zweierlogarithmus (meist als ld geschrieben). Wenn euer Taschenrechner den nicht kann: ld x = ln x/ln 2 – aber letztlich kommts nicht so drauf an, denn ln 2 ist nicht viel was anderes als eins. Profis schenken sich sowas.

    Pop Quiz: Wie viele Bits braucht ihr, um eine von 1000 Nachrichten rauszufummeln? (Ungefähr 10). Wie viele, um eine von 1'000'000'0000 zu kriegen? (Ungefähr 30; ihr seht, der Logarithmus wächst sehr langsam).

    Nicht gleichverteilt, nicht unabhängig

    In Wahrheit ist das mit der Information etwas komplizierter. Stellt euch vor, zur Parkplatz-Lebkuchen-Programmatik käme jetzt die Frage „Vorrang für FußgängerInnen auf der Straße?“. Wer die Antwort einer Person auf die Parkplatz-Frage kennt, dürfte recht zuverlässig vorhersagen können, wie ihre Antwort auf die Vorrang-Frage aussehen wird.

    Mathematisch gesprochen sind die beiden Entscheidungen nicht unabhängig, und das führt dazu, dass mensch durch geschicktes Fragen im Schnitt deutlich weniger als drei Fragen brauchen wird, um das komplette Programm mit den drei Antworten rauszukriegen, etwa, indem mensch zusammen nach Parkplätzen und Vorrang fragt. Dieser Schnitt liegt irgendwo zwischen 2 und 3 – für die Mathematik (und den Logarithmus) ist es kein Problem, Fragen auch hinter dem Komma zu zählen: 2.3 bit, vielleicht (ich bin immer wieder erstaunt, wie viele Menschen noch gewillt sind, Parkplätze hinzunehmen, während der Vorrang für FußgängerInnen doch hoffentlich unbestrittener Konsens in der zivilisierten Welt ist[1]).

    Ein ähnlicher Effekt ergibt sich, wenn bestimmte Antworten viel wahrscheinlicher sind als andere. Wenn es z.B. zwei Texte A und B gibt, die jeweils 45% der Nachrichten ausmachen, bekomme ich in 90% der Fälle die Nachricht in nur zwei Fragen raus („Eins von A oder B?“, worauf zu 90% schlicht „A?“ reicht, um die gewählte Nachricht rauszukriegen), ganz egal, ob es noch 10 oder 10'000'000'000 andere Nachrichten gibt.

    Die Sache mit „Information in bit rechnest du als den Logarithmus der Zahl der verschiedenen Nachrichten aus“ gibt also eine Obergrenze für den Informationsgehalt. Sie wird erreicht wenn die Nachrichten gleichverteilt sind (und in gewissem Sinn in sich unabhängig; besser verständlich wird der Unabhängigkeits-Teil, wenn mensch nicht eine Nachricht, sondern eine Folge von Nachrichten betrachtet). Wer wissen will, wie das richtig geht, sei auf die Wikipedia verwiesen.

    Das ganz einfache Modell unabhängiger, gleichverteilter Nachrichten von oben gilt in der Regel nicht – in natürlichsprachigen Texten sind z.B. die Buchstabenhhäufigkeiten drastisch verschieden (Scrabble-SpielerInnen kennen das), und es gibt allerlei Regeln, in welchen Reihenfolgen Buchstaben kommen können. Eine erstaunlich effektive Schätzung für den Informationsgehalt von Nachrichten ist übrigens, einfach mal gzip laufen zu lassen: Für diesen Text bis hierher kommt da 2090 Bytes (á 8 bit) raus, während er auf der Platte 4394 Bytes braucht: Was gzip da geschluckt hat, sind die Abweichungen von Gleichverteilung und Unabhängigkeit, die so ein dummes Computerprogramm leicht finden kann.

    Klar: auch die 2090 ⋅ 8 bit sind höchst fragwürdig als Schätzung für den Informationsgehalt bis hier. Wenn die Nachrichtenmenge „alle bisherigen Blogposts hier“ wäre (davon gibt es etwas weniger als 100), wären es nur sechseinhalb Bit, ist sie „Zeug, das Anselm Flügel schreibt“, wäre es zwar mehr, aber immer noch klar weniger als die 16720 Bit, trotz aller Exkurse über Information und Logarithmen[2]. Informationsgehalt ist nur im Kontext aller anderen möglichen Nachrichten gut definiert. Und dem, was bei EmpfängerInnen ankommt, was bei diesem Post für SchurkInnen auch nur ein Bit sein kann: „Alles Mist“.

    Wie viele bit in einem Wahlzettel?

    Euer Wahlzettel bei der Bundestagswahl neulich dürfte so um die zwei Mal sechzehn Möglichkeiten gehabt haben, etwas anzukreuzen. Im besten Fall – unabhängige Parteien mit gleichen Erfolgschancen – könntet ihr also 8 bit übertragen mit euren zwei Kreuzen. In Wahrheit sorgt schon die 5%-Hürde dafür, dass es allenfalls 8 Listen gibt, die in der Logik repräsentativer Regierungsbildung wählbar sind, und dann noch vielleicht eineN von vier DirektkandidatInnen, die auch nur irgendeine Chance haben. Zusammen, schätze ich (immer noch optimistisch), vielleicht drei Bit.

    Vergleicht das mit den Nachrichten, die so eine Regierung aussendet: So redundant und erwartbar da auch viel sein mag, kein gzip dieser Welt wird die Gesetze, Verordnungen und Exekutivakte von Regierung und Parlament in der letzten Legislaturperiode auf irgendwas unter 100 Megabyte bringen können, selbst wenn es, das Kompressionsprogramm, Politik und Jura schon kann. Gesetze wie das zur Bestandsdatenauskunft etwa sind völlig beliebig: sie setzen einfach Wünsche der Polizeien um und kümmern sich weder um Verfassungen noch um Sinn, und sie würden deutlich anders aussehen, wenn bei BKA, Innenministerium und Polizeiverbänden gerade andere Individuen am Werk gewesen wären. Beliebigkeit ist aber nur ein anderes Wort für Unabhängigkeit und Gleichverteilung. Die 100 Megabyte werden also eine harte untere Grenze sein.

    Bei einem Verhältnis von rund drei Bit rein zu mindestens 100 Megabyte raus (in Worten: eins zu zweihunderfünfzig Millionen, weit unter der Gewinnchance beim 6 aus 49-Lotto) ist evident, dass Wahlen gewiss kein „Hochamt der Demokratie“ sind; ihr Einfluss auf konkrete Entscheidungen wäre auch dann minimal, wenn bei realen Wahlen viel entschieden würde.

    Was natürlich nicht der Fall ist. Niemand erwartet ernsthaft, dass eine Wahl irgendetwas ändert an wesentlichen Politikfragen, hierzulande beispielsweise Reduzierung des Freihandels, Zurückrollen von Privatisierungen, Abschaffung des Militärs, Befreiung der Menschen von der Autoplage, weniger autoritäres Management sozialer Spannungen (z.B. durch weniger übergriffige Polizeigesetze), weniger blutige Staatsgrenzen, weniger marktförmige Verteilung von Boden, kein Wachstum bis zum Kollaps und so weiter und so fort; praktisch die gesamte Bevölkerung hat in allen diesen Punkten die bestehende Regierungspolitik bestätigt, obwohl sie manifest ihren Interessen oder zumindest ihrem moralischen Empfinden widerspricht.

    Warum Wahlen wichtig sind

    Entsprechend tut in den gegenwärtigen Koalitionsverhandlungen nicht mal wer so, als ginge es um mehr als um Selbstverständlichkeiten wie Tempolimits auf Autobahnen (stellt euch mal kurz vor, wie unfassbar bizarr das auf in 100 Jahren eventuell noch lebende Menschen wirken muss).

    Was nicht heißt, dass Wahlen nicht wichtig sind. Die ganz zentrale Funktion von Wahlen dieser Art hat neulich im Deutschlandfunk ein gewisser Andrej Kolesnikow am Beispiel Russland erläutert:

    Die Wahl soll vor allem das Staatsmodell legitimieren, das sich in Russland entwickelt hat. Sie ist deshalb für die Staatsmacht wichtiger als für die Bürger. Die Wahl soll den Menschen auch vor Augen führen, dass die Staatsmacht weiterhin über eine Mehrheit verfügt und dass es besser ist, sich dieser Mehrheit anzuschließen, oder, wenn jemand unzufrieden ist, wenigstens ruhig zu bleiben und seine Unzufriedenheit für sich zu behalten.

    Wer aus ein paar Schritt Entfernung auf die hiesigen Verhältnisse blickt, wird diese Beobachtung auch hierzulande im Wesentlichen bestätigt sehen. Versteht mich nicht falsch: Das ist durchaus wichtig. Ein delegitimierter Staat geht schnell in eine kaputte Gesellschaft über, solange wir es nicht hinbekommen, Menschen auch ohne Nationalgeklingele zu rationalem, sprich kooperativem Verhalten zu bekommen (nicht, dass ich glaube, dass das sehr schwer wäre; es würde aber jedenfalls andere Schulen brauchen). Etwas von dieser Delegitimation sehen wir schon hier, verglichen mit den 1980er Jahren jedenfalls, etwas mehr in den USA, und noch viel mehr im, sagen wir, Libanon. Und etwas weniger als hier in Dänemark oder Schweden. Ich mache kein Geheimnis daraus, wo auf diesem Spektrum ich lieber leben will.

    Allerdings: diese Legitimationsfunktion der Wahl funktioniert weitgehend unabhängig von politischer Partizipation. Auch die finstersten autoritären Regimes halten Wahlen ab und wollen diese in aller Regel auch recht ehrlich …

  • Fortgesetzte Missachtung

    Ich versuche gerade erneut, die Neuregelung (oder eher: Wiederregelung oder vielleicht auch Widerregelung) der Bestandsdatenauskunft nachzuvollzielen und schmökere dazu im letzten einschlägigen Urteil des Bundesverfassungsgerichts vom 27.5.2020 (1 BvR 1873/13). Darin findet das Gericht zunächst, dass die Anfechtungen von Regelungen im BND-Gesetz und im Zollfahndungsgesetz wegen Verfristung unzulässig sind, da der Bundestag in der Zwischenzeit bereits wieder Verschärfungen der entsprechenden Gesetze abgenickt hatte (Rn. 66ff).

    Das ist schon mal sportlich: Die Regierung beschließt neuen Menschenrechtsabbau, bevor das Verfassungsgericht den alten beanstanden kann. Das ist nicht die ungeschickteste Art, auf die Beschränkungen zu reagieren, die so eine lästige Verfassung mit sich bringt.

    Noch bemerkenswerter finde ich allerdings folgende, für höchstreichterliche Verhältnisse doch sehr klaren Worte des Gerichts (Rn. 80):

    Auch § 113 Abs. 1 Satz 2 TKG konnte fristgerecht angegriffen werden. Zwar hat die Norm gegenüber der Vorgängerregelung vom 22. Juni 2004 (BGBl I S. 1190) ‒ trotz geänderten Wortlauts und neuer Regelungsstruktur ‒ für sich genommen keinen grundsätzlich neuen Gehalt. Die Vorgängerregelung wurde jedoch für verfassungswidrig erklärt (BVerfGE 130, 151). Wenn der Gesetzgeber nunmehr eine Regelung mit im Wesentlichen gleichem Inhalt wiederholt, stellt diese einen neuen verfassungsrechtlichen Prüfungsgegenstand dar (vgl. dazu BVerfGE 96, 260 <263>; 102, 127 <141>; vgl. auch BVerfGE 135, 259 <281 Rn. 36>).

    Mit anderen Worten: Das Gericht hat den alten 113er für menschrechtswidrig erklärt, woraufhin die Regierung das Ding einfach ein wenig umformuliert und ganz offenbar im Wissen um seine Menschenrechtswidrigkeit völlig unverfroren wieder beschließen lässt. Dass keineR der betroffenen ParlamentarierInnen den Mut hatte, Einspruch gegen diesen doch besonders offensichtlichen Fall von Grundrechtsfeindlichkeit einzulegen, könnte in Hinblick auf die Funktionsfähigkeit des Parlaments ernüchtern. Andererseits ist das Muster autoritärer Problembewältigung (kein Mitglied der Regierungsparteien darf öffentlich gegen Wünsche von Polizei und Militär sprechen; privat tun sie das übrigens durchaus) leider allzu vertraut, und zwar von allen deutschen Regierungen zumindest in diesem Jahrtausend.

    Wobei: Immerhin hat die Regierung nicht (erkennbar) die vom BVerfG beanstanden Passagen noch wesentlich weiter getrieben (die Passwortabfrage ist wohl eher ein sachlicher Unkenntnis geschuldetes Gimmick). So ein Weitertreiben gab es durchaus schon, vielleicht am eklatantesten bei den Terrordateien (ATD und RED), deren Verschärfungen von 2015 vorgaben, durch recht fundamentale Beanstandungen des BVerfG motiviert zu sein, aber in Wirklichkeit die Menschenrechtsverstöße noch zuspitzten. Oder, wie Michael Plöse richtig feststellt (Vorgänge 208, 4/2014):

    [Der Regierungsentwurf zum ATDG-ÄG kann] kaum mehr nur als eine Enttäuschung bezeichnet werden – er ist vielmehr eine dreiste Provokation des Karlsruher Verfassungskompromisses.
  • Foced https Redirects Considered Harmful

    I don't remember where I first saw the admontion that “not everything that does HTTP is a browser“ – but I'd like to underscore this here. One corollary to this is:

    Please do not unconditionally redirect to https!

    People may have good reasons to choose unencrypted http, and sometimes they don't get to choose, in particular in embedded systems (where https may be prohibitively large) or when you cannot upgrade the ssl libraries and sooner or later the server no longer considers any of the ciphers you know safe.

    Case in point: I have a command line program to query bahn.de (python3 version)…

    Nachtrag (2022-09-04)

    after many years of relative stability, the Bahn web page has significantly changed their markup, which broke this script. There is a new bahnconn now.

    …which screen-scrapes the HTML pages that Deutsche Bahn's connection service hands out. I know bahn.de has a proper API, too, and I'm sure it would be a lot faster if I used it, but alas, my experiments with it were unpromising, with what's on the web working much better; perhaps I'll try again next time they change their HTML. But that's beside the point here.

    The point is: In contrast to browsers capable of rendering bahn.de's HTML/javascript combo, this script runs on weak hardware like my Nokia N900. Unfortunately, the N900 is more or less frozen at the state of something like Debian Lenny, because its kernel has proprietary components that (or so I think) deal with actually doing phone calls, and hence I can't upgrade it beyond 2.6.29. And that means more or less (sure, I could start building a lot of that stuff from source, but eventually the libc is too old, and newer libcs require at least kernel 2.6.32) that I'm stuck with Python 2.5 and an OpenSSL of that time. Since about a year ago, these have no ciphers any more that the bahn.de server accepts. But it redirects me to https nevertheless, and hence the whole thing breaks. For no good reason at all.

    You see, encryption buys me nothing when querying train connections. The main privacy breach here is bahn.de storing the request, and there I'm far better off with my script, as that (at least if more people used it) is a lot more anonymous than my browser with all the cookies I let Deutsche Bahn put into it and all the javascript goo they feed it. I furthermore see zero risk in letting random people snoop my train routes individually and now and then. The state can, regrettably, ask Deutsche Bahn directly ever since the Ottokatalog of about 2002. There is less than zero risk of someone manipulating the bahn.de responses to get me on the wrong trains.

    Now, I admit that when lots of people do lots of queries in the presence of adversarial internet service providers and other wire goblins, this whole reasoning will work out differently, and so it's probably a good idea to nudge unsuspecting muggles towards https. Well: That's easy to do without breaking things for wizards wishing to do http.

    Doing it right

    The mechanism for that is the upgrade-insecure-requests header that essentially all muggle browsers now send (don't confuse it with the upgrade-insecure-requests CSP). This does not lock out old clients while still giving muggles some basic semblance of crypto.

    And it's not hard to do, either. In Apache, you add:

    <If "%{req:Upgrade-Insecure-Requests} == '1'">
      Header always set Vary Upgrade-Insecure-Requests
      Redirect 307 "/" "https://<your domain>/"
    </If>
    

    rather than the unconditional redirect you'd otherwise have; I suppose you can parameterise this rule so you don't even have to edit in your domain, but since I'm migrating towards nginx on my servers, I'm too lazy to figure out how. Oh, and you may need to enable mod_headers; on Debian, that would be a2enmod headers.

    In nginx, you can have something like:

    set $do_http_upgrade "$https$http_upgrade_insecure_requests";
    location / {
    
      (whatever you otherwise configure)
    
      if ($do_http_upgrade = "1") {
         add_header Vary Upgrade-Insecure-Requests;
         return 307 https://$host$request_uri;
      }
    }
    

    in your server block. The trick with the intermediate do_http_upgrade variable makes sure we don't redirect if we already are on https; browsers shouldn't send the header on https connections, but I've seen redirect loops without this trick (origin).

    Browser considerations

    Me, I am by now taking it as a sign of quality if a server doesn't force https redirects and instead honours upgrade-insecure-requests. For instance, that way I can watch what some server speaks with the Javascript it executes on my machine without major hassle, and that's something that gives me a lot of peace of mind (but of course it's rather rare these days). In celebration of servers doing it right, I've configured my browser – luakit – to not send upgrade-insecure-requests; where I consider https a benefit rather than a liability for my privacy, I can remember switching to it myself, thank you.

    The way to do that is to drop a file no_https_upgrade_wm.lua into .config/luakit containing:

    local _M = {}
    
    luakit.add_signal("page-created",
        function(page)
            page:add_signal("send-request", function(p, _, headers)
                if headers["Upgrade-Insecure-Requests"] then
                    headers["Upgrade-Insecure-Requests"] = nil
                end
            end)
    end)
    

    (or fetch the file here). And then, in your rc.lua, write something like:

    require_web_module("no_https_upgrade_wm")
    

    ...and for bone-headed websites?

    In today's internet, it's quite likely that a given server will stink. As a matter of fact, since 1995, the part of the internet that stinks has consistently grown 20 percentage points[1] faster than the part that doesn't stink, which means that by now, essentially the entire internet stinks even though there's much more great stuff in it than there was in 1995: that's the miracle of exponential growth.

    But at least for escaping forced https redirects, there is a simple fix in that you can always run a reverse proxy to enable http on https-only services. I'm not 100% sure just how legal that is, but as long as you simply hand through traffic and it's not some page where cleartext on the wire can realistically hurt worse than the cleartext on the server side, I'd claim you're ethically in the green. So, to make the Deutsche Bahn connection finder work with python 2.5, all that was necessary was a suitable host name, an nginx, and a config file like this:

    server {
      listen 80;
      server_name bahnauskunft.tfiu.de;
    
      location / {
        proxy_pass https://reiseauskunft.bahn.de;
        proxy_set_header Host $host;
      }
    }
    
    [1]This figure is of course entirely made up<ESC>3bC only a conservative guess.
  • Bingo zur Wahl

    Bullshit Bingo-Karten zur Wahl

    Wer solche Bingo-Karten haben will: Das Wahlbingo-CGI macht sie euch gerne. Jeder Reload macht neue Karten!

    Auch wenn verschiedene Posts der letzten Zeit etwas anderes suggerieren mögen: Ich will gewiss nicht in die von Plakatwänden und aus Radiolautsprechern quellende Wahlaufregung einstimmen. Aber ein wenig freue ich mich doch auf die Bundestagswahl am nächsten Sonntag: ich kann nämlich wieder mein Wahlbingo spielen. Ihr kriegt bei jedem Reload der Bingo-Seite andere Karten, und zumindest Webkit-Browser sollten das auch so drucken, dass auf einer A4-Seite zwei Bingokarten rauskommen.

    Die Regeln sind dabei: Wer in der Wahlkampfberichterstattung eine hinreichend ähnliche Phrase aufschnappt, darf ein Feld abkreuzen (die Hälfte vom Spaß ist natürlich die lautstarke Klärung der Frage, ob eine Phrase ähnlich genug war). Wer zuerst vier…

    Nachtrag (2022-03-07)

    Die Erfahrung zeigt, dass es mit drei mehr Spaß macht.

    …Felder in horizonaler, vertikaler, oder diagonaler Richtung hat, hat gewonnen. Dabei gelten periodische Randbedingungen, mensch darf also über den Rand hinaus verlängern, als würde die eigene Karte die Ebene parkettieren.

    Das Ganze ist übrigens ein furchtbar schneller Hack an irgendeinm Wahlabend gewesen. Ich habe den gerade noch geschwinder für das Blog in ein CGI gewandelt. Wer darauf etwas Aufgeräumteres aufbauen will: die Quellen. Spenden für den Phrasenkorpus nehme ich sehr gerne per Mail.

  • Ad hominem

    Die Ideenwelt der repräsentativen Demokratie hat etliche Ungereimtheiten – was an sich nicht notwendig katastrophal[1] ist, siehe RiwaFiw. Speziell zu Wahlkampfzeiten muss ich aber doch manchmal meinen Kopf bis an die Grenze zum Schleudertrauma schütteln.

    Derzeit ist in Heidelberg etwa das hier plakatiert:

    Wahlplakat mit eigenartigem Brustportrait und einem Slogan

    Klar, mensch könnte das einfach mit „selbst schuld“ wegnicken und weiterfahren. Aber für mich will diese Sorte Plakat einfach nicht zusammengehen mit der öffentlichen Ächtung von Attacken auf die Person von KandidatInnen und PolitikerInnen („ad hominem“), und das nicht nur, weil das Plakat recht unbestreitbar eine ad hominem-Selbstattacke ist.

    Schön, das ad hominem-Tabu war schon immer mehr deklariert als gelebt (was gerade die zugeben müssen, die sich gerne öffentlich nach Herbert Wehner und Franz Josef Strauß sehnen), aber als normative Richtschnur des Handelns ist es im Wesentlichen unbestritten. Wenn also Kritik ad hominem nicht statthaft ist: Warum zeigt dann die Mehrheit der Wahlplakate „ernstzunehmender“ Parteien die Portraits der KandidatInnen und nicht etwa, sagen wir, eine politische Position oder wenigstens ein hübsches Bild zur Aufwertung des Straßenraums, Dinge jedenfalls, die anzugreifen nicht Tabu ist?

    Der „Digitalturbo“ im Plakat oben zählt übrigens mangels Bedeutung nicht als politische Position. „Digitalisierung“ ist Antisprache, versucht also aktiv, nichts zu sagen. „Turbo“ hingegen ist eine dämliche Autometapher, der positiv nur die radikale Selbstentlarvung zuzurechnen ist. Der Kluge führt unter dem Lemma Turbine aus:

    1. turbo (-inis) m. „Wirbel; alles, was sich im Kreis dreht“

    Ich erfinde das nicht.

    Eine politische Position, die tatsächlich etwas bedeutet, wäre etwa public money, public code gewesen, oder vielleicht „hohe Hürden bei Zugriff auf Tk-Bestandsdaten“ (cf. Post vom 2021-01-31). Doch, sowas passt auf ein Plakat, und mit etwas Mühe kriegt mensch auch Muggels erklärt, was das jeweils bedeutet. Allerdings müsste ich bei einem „Master of Public Policy“ (was Nusser ausweislich seiner Online-Biografie ist) zunächst noch überzeugt werden, dass der Kandidat tatsächlich Einsicht hätte in das, was er da sagen würde.

    Da seine Parole leer ist: was eigentlich soll mensch kritisieren als das Restplakat, also das Bild? Wenn das Bild nur die Person zeigt, wird die Kritik notwenig ad hominem. Das ist besonders bitter, wenn der Kandidat aussieht, als habe er starke Schwierigkeiten bei der Ablösung von der Mutter (oder jedenfalls bei der Impulskontrolle). Hand aufs Herz: Wer hatte bei Nussers Foto nicht gleich das Bild im Kopf vom pummeligen Einzelgänger in der Schule, der Verachtung und Hänselei der Mitschülis jetzt durch Dampfplaudern im Machoclub FDP kompensiert? [Mitschülis von Nusser: wie irrig ist diese Fantasie?]

    Wer solche, eingestandermaßen üblen, Reflexe nicht haben will: Wie gesagt, thematische Bilder statt Köpfe auf Plakaten würden sich anbieten, bei der selbsternannten Wachstumspartei FDP vielleicht viele Autos und viel Beton oder so. Weniger ansprechend als die Portraits der KandidatInnen wird das in der Regel auch nicht sein, solange nicht gerade Rana Plaza oder Union Carbide in Bhopal als Symbole für die Segnungen des Freihandels herhalten müssten.

    Besser wärs aber wahrscheinlich, ganz auf Fotos zu verzichten, etwa nach US-Vorbild:

    Vorgarten mit Wahlschildern, auf denen nur Namen stehen

    Um euch die Arbeit zu ersparen, anhand der Namen herauszubekommen, wann und wo die Szene spielt: Das Foto entstand 2002 in Massachussetts, und die schon etwas extreme Botschaftsdichte mag damit zusammenängen, dass der Vorgartenbesitzer im liberalen Jamaica Plain Werbung für alle möglichen Kandidaten der Republicans machte. Mensch sieht: Rechte Trolle sind keine Erfindung des facebook-Zeitalters.

    So oder so: Wahlwerbung in den USA ist, soweit ich das sehe, immer noch, wenn Leute die Namen ihrer LieblingskandidatInnen in den Vorgarten stellen (ok, und am Straßenrand mit Namenschildern winken). Keine Fotos, keine leeren Slogans.

    Ich glaube ja, das ist weit mehr im Geist der repräsentativen Demokratie, bei der Menschen ja genau nicht etwa die wählen sollen, die aussehen wie sie selbst; von Lookismus-Prävention will ich gar nicht anfangen. Der größte Vorteil aber: ästhetische Tiefschläge wie der folgende aus dem Jahr 1998 unterbleiben:

    Wahlplakat von Karl A. Lamers
    [1]Nur zur Vorsicht sollte ich wohl sagen, dass ich damit natürlich mitnichten repräsentative Demokratie befürwortet haben will; eine dahingehende Beurteilung aus informationstheoretischer Sicht verspreche ich schon mal für demnächst.
  • Reading a zyTemp Carbon Dioxide Monitor using Tkinter on Linux

    Last weekend I had my first major in-person conference since the SARS-2 pandemic began: about 150 people congregated from all over Germany to quarrel and, more importantly, to settle quarrels. But it's still Corona, and thus the organisers put in place a whole bunch of disease control measures. A relatively minor of these was monitoring the CO2 levels in the conference hall as a proxy for how much aerosol may have accumulated. The monitor devices they got were powered by USB, and since I was sitting on the stage with a computer having USB ports anyway, I was asked to run (and keep an eye on) the CO2 monitor for that area.

    A photo of the CO2 meter

    The CO2 sensor I got my hands on. While it registers as a Holtek USB-zyTemp, on the back it says “TFA Dostmann Kat.Nr. 31.5006.02“. I suppose the German word for what's going on here is “Wertschöpfungskette“ (I'm not making this up. The word, I mean. Why there are so many companies involved I really can only guess).

    When plugging in the thing, my syslog[1] intriguingly said:

    usb 1-1: new low-speed USB device number 64 using xhci_hcd
    usb 1-1: New USB device found, idVendor=04d9, idProduct=a052, bcdDevice= 2.00
    usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
    usb 1-1: Product: USB-zyTemp
    usb 1-1: Manufacturer: Holtek
    usb 1-1: SerialNumber: 2.00
    hid-generic 0003:04D9:A052.006B: hiddev96: USB HID v1.10 Device [Holtek USB-zyTemp] on usb-0000:00:14.0-1/input0
    hid-generic 0003:04D9:A052.006C: hiddev96: USB HID v1.10 Device [Holtek USB-zyTemp] on usb-0000:00:14.0-1/input0
    

    So: The USB is not only there for power. The thing can actually talk to the computer. Using the protocol for human interface devices (HID, i.e., keyboards, mice, remote controls and such) perhaps is a bit funky for a measurement device, but, on closer reflection, fairly reasonable: just as the mouse reports changes in its position, the monitor reports changes in CO2 levels and temperatures of the air inside of it.

    Asking Duckduckgo for the USB id "04d9:a052" (be sure to make it a phrase search with the quotes our you'll be bombarded by pages on bitcoin scams) yields a blog post on decrypting the wire protocol and, even better, a github repo with a few modules of Python to read out values and do all kinds of things with them.

    However, I felt like the amount of code in that repo was a bit excessive for something that's in the league of what I call a classical 200 lines problem – meaning: a single Python script that works without any sort of installation should really do –, since all I wanted (for now) was a gadget that shows the current values plus a bit of history.

    Hence, I explanted and streamlined the core readout code and added some 100 lines of Tkinter to produce co2display.py3, showing an interface like this:

    A co2display screenshot

    This is how opening a window (the sharp drop of the curve on the left), then opening a second one (the even sharper drop following) and closing it again while staying in the room (the gentle slope on the right) looks like in co2display.py. In case it's not obvious: The current CO2 concentration was 420 ppm, and the temperature 23.8 degrees Centigrade (where I'm sure the thing doesn't measure to tenths of Kelvins; but then who cares about thenths of Kelvins?) when I took that screenshot.

    If you have devices like the zyTemp yourself, you can just download the program, install the python3-hid package (or its equivalent on non-Debian boxes) and run it; well, except that you need to make sure you can read the HID device nodes as non-root. The easiest way to do that is to (as root) create a file /etc/udev/rules.d/80-co2meter.rules containing:

    ATTR{idVendor}=="04d9", ATTR{idProduct}=="a052", SUBSYSTEM=="usb", MODE:="0666"
    

    This udev rule simply says that whenever a device with the respective ids is plugged in, any device node created will be world-readable and world-writable (and yeah, it does over-produce a bit[2]).

    After adding the rule, unplug and replug the device and then type python3 co2display.py3. Ah, yes, the startup (i.e., the display until actual data is available) probably could do with a bit of extra polish.

    First Observations

    I'm rather intrigued by the dynamics of CO2 levels measured in that way (where I've not attempted to estimates errors yet). In reasonably undisturbed nature at the end of the summer and during the day, I've seen 250 to 280 ppm, which would be consistent with mean global pre-industrial levels (which Wikipedia claims is about 280 ppm). I'm curious how this will evolve towards winter and next spring, as I'd guess Germany's temporal mean will hardly be below the global one of a bit more than 400 (again according to Wikipedia).

    In a basically empty train I've seen 350 ppm yesterday, a slightly stuffy train about 30% full was at 1015 ppm, about as much as I have in my office after something like an hour of work (anecdotically, I think half an hour of telecon makes for a comparable increase, but I can hardly believe that idle chat causes more CO2 production than heavy-duty thinking. Hm).

    On a balcony 10 m above a reasonably busy road (of order one car every 10 seconds) in a lightly built-up area I saw 330 ppm under mildly breezy conditions, dropping further to 300 as the wind picked up. Surprisingly, this didn't change as I went down to the street level. I can hardly wait for those winter days when the exhaust gases are strong in one's nose: I cannot imagine that won't be reflected in the CO2.

    The funkiest measurements I made on the way home from the meeting that got the device into my hands in the first place, where I bit the bullet and joined friends who had travelled their in a car (yikes!). While speeding down the Autobahn, depending on where I measured in the small car (a Mazda if I remember correctly) carrying four people, I found anything from 250 ppm near the ventilation flaps to 700 ppm around my head to 1000 ppm between the two rear passengers. And these values were rather stable as long as the windows were closed. Wow. Air flows in cars must be pretty tightly engineered.

    Technics

    If you look at the program code, you'll see that I'm basically polling the device:

    def _update(self):
      try:
        self._take_sample()
        ...
      finally:
        self.after(self.sample_interval, self._update)
    

    – that's how I usually do timed things in tkinter programs, where, as normal in GUI programming, there's an event loop external to your code and you cannot just say something like time.wait() or so.

    Polling is rarely pretty, but it's particularly inappropriate in this case, as the device (or so I think at this point) really sends data as it sees fit, and it clearly would be a lot better to just sit there and wait for its input. Additionally, _take_sample, written as it is, can take quite a bit of time, and during that time the UI is unresponsive, which in this case means that resizes and redraws don't take place.

    That latter problem could easily be fixed by pushing the I/O into a thread. But then this kind of thing is what select was invented for, or, these days, wrappers for it (or rather its friends) usually subsumed under “async programming“.

    However, marrying async and the Tkinter event loop is still painful, as evinced by this 2016 bug against tkinter. It's still open. Going properly async on the CO2monitor class in the program will still be the next thing to do, presumably using threads.

    Ah, that, and recovering from plugging the device out and in again, which would also improve behaviour as people suspend the machine.

    Apart from that, there's just one detail I should perhaps highlight in the code: The

    self.bind("<Configure>", lambda ev: self._update_plot())
    

    in the constructor. That makes the history plot re-scale if the UI is re-sized, and I've always found it a bit under-documented that <Configure> is the event to listen for in this situation. But perhaps that's just me.

    Nachtrag (2021-10-19)

    I've updated co2display.py3 as published here, since I've been hacking on it quite a bit in the meantime. In particular, if you rename the script co2log.py (or anything else with “log” in it), this will run as a plain logger (logging into /var/log/co2-levels by default), and there's a systemd unit at the end of the script that lets you run this automatically; send a HUP to the process to make it re-open its log; this may be useful together with logrotate if you let this run for weeks your months.

    You can also enable logging while letting the Tk UI run by passing a -d option …

  • Ehrlichkeit in Parteiprogrammen

    Über einen Artikel in der Wochenzeitung Kontext bin ich auf eine Kleinstudie des Zentrums für europäische Wirtschaftsforschung (ZEW) gestoßen, auf die ich vor allem im Hinblick auf eine spätere Nutzung zur Mythenstörung kurz eingehen möchte.

    Zu bedenken ist zunächst, dass das ZEW gewiss in keinem Verdacht steht, irgendwelche fortschrittlichen Ideen zu hegen. So gehört zu deren aktuellen „Empfehlungen für die Wirtschaftspolitik“ offensichtlicher Quatsch der Art „Standardisierte Altersvorsorgeprodukte einführen“ oder Deflektorschilde gegen eine entspanntere, arbeitsärmere und umweltfreunlichere Gesellschaft des Typs „Kostengerechte Aufteilung der CO2-Reduktionen zwischen den Sektoren“; aktuelle Pressemitteilungen beten marktradikale Wirrnisse herunter wie „Lokale Preisanreize im Strommarkt setzen“ (Faustregel: „Anreiz“ heißt im Klartext: Geld von unten nach oben umverteilen) oder „Bundesnetzagentur sollte weiterhin auf Auktionen setzen“, ganz als sei 1998.

    Ausgerechnet diese Leute haben in ihrer Kleinstudie zu den fiskalischen und ökonomischen Folgen der aktuellen Parteiprogramme herausgefunden, dass das Programm der Linken den Staathaushalt um 37 Milliarden Euro entlasten würde, während die FDP den Haushalt mit 88 Millarden Euro belasten würde und die CDU immer noch 33 Millarden Euro mehr Staatsdefizit ansagt.

    So viel zur Frage fiskalischer Verantwortung in der Theorie, soweit also mensch Wahlprogramme ernstnehmen will. Zumindest sollte die Studie traugen, um die Erzählungen von „wirtschaftlicher Vernunft“ bei den Rechtspartien als Legenden zu entlarven.

    Die Studie liefert weiter Hinweise zum Thema „Turkeys voting for Christmas“, also Armen, die Rechtsparteien wählen (davon gibt es augenscheinlich einen ganzen Haufen): Das VEW hat nämlich auch die Folgen der Programme für den Gini-Koeffizienten abgeschätzt, also einer Metrik für die Ungleichheit der Einkommen in einer Gesellschaft, der mit wachsender Ungleichheit wächst. Souveränder Spitzenreiter dabei ist die AfD, die die Ungleichheit in dieser Metrik um 3.8% verschärfen würde, wo selbst die FDP die Dinge nur 3.4% schlimmer machen will (und die CDU um 1.6%). Demgegenüber würde das Wahlprogramm der Linken – take this, ExtremismustheoretikerInnen! – die Ungleichheit um knapp 15% reduzieren. Wenn denn irgendwas davon umgesetzt würde, käme sie an die Regierung; spätestens nach der Katastrophe der Schröder-Administration dürfte klar sein, dass das ungefähr so wahrscheinlich ist wie ein ernsthaftes Aufbegehren gegen den permanenten Bürgerrechtsabbau durch eine FDP in der Regierung. Die Grünen würden laut VEW die Ungleichheit um 6.5% reduzieren, und selbst die vom für Cum Ex und Hartz IV bekannten Scholz geführte SPD wäre noch mit -4.3% dabei.

    Klar: das Ganze ist eine stark zirkuläre Argumentation, denn Programme der Parteien haben viel mit den Methoden des ZEW und Metriken wie dem Gini-Koeffizienten gemein, alle drei aber sicher nicht viel mit irgendwelchen Realitäten. In der gemeinsamen, wenn auch hermetischen Logik bleibt festzuhalten: die bekennenden Rechtspartien betreiben unzweifelhaft die Umverteilung von unten nach oben auf Kosten des Staatshaushalts.

    Und das taugt ja vielleicht später nochmal für ein Argument innerhalb dieser hermetischen Welt.

  • Vom Töten und Massenschlachten

    Heute morgen hat der Deutschlandfunk das IMI-Urgestein Tobias Pflüger interviewt (Informationen am Morgen, 14.9.), und die Art, in der der Interviewende versucht hat, Tobias dazu zu bringen, sich für einen „Mangel“ an Bellizismus zu entschuldigen, war erwartbar empörend. Umgekehrt aber war Tobias schon sehr zahm, verglichen jedenfalls mit dem militanten Pazifismus, den ich von ihm eigentlich kenne; nun ja, er trat auch als stellvertretender Vorsitzender der Linken auf, und die will erkennbar regieren[1].

    Das – wie natürlich auch das ultrazynische Rührstück um die „Ortskräfte“, die die Bundeswehr aus dem gleichen Afghanistan „rettete“, in das die Regierung in den Vormonaten noch mindestens 167 Menschen abschieben hat lassen – wiederum gibt mir den Vorwarnd, endlich ein paar politische Gegenstücke zum Tucholsky-Klassiker „Soldaten sind [meinethalben potenzielle] Mörder“ zu formulieren, die ich schon lang irgendwo unterbringen wollte (auch wenn ich anerkenne, dass sie vermutlich nicht sehr originell sind und bestimmt schon oft ganz ähnlich von PazifistInnen, AnarchistInnen und anarchistischen PazifistInnen formuliert wurden; ich sollte vermutlich mehr von solchen Leuten lesen).

    Erste Behauptung: Eine Regierung, die sich ein Militär hält, will für die eigene Macht Menschen töten.

    Für den Fall, dass jemand das nicht unmittelbar offensichtlich findet, will ich ein paar Ableitungsschritte nennen. Erstens ist nämlich Militär schicht dafür da, Krieg zu führen oder Aufstände zu unterdrücken. Ich gebe zu, dass die Bundeswehr auch schon Dämme ausgebessert, Brunnen gebohrt, und in Impfzentren ausgeholfen hat. Sie war dabei aber immer ausnehmend schlecht, bis hin zur Unfähigkeit, die Impfunterlagen korrekt und halbwegs gestapelt zusammenzutackern. Das ist soweit erwartbar, denn sowohl das Rumgeballer als auch die Gehorcherei sind bei nichttödlichen Einsätzen klar störend. Wer Personal für „humanitäre“ Einsätze vorhalten will, würde selbstverständlich keine Gewehre und Waffen kaufen und viel Geld dafür ausgeben, den Leuten den Umgang damit (statt mit Baggern, Bohrern und Büroklammern) beizubringen.

    Mithin geht es beim Militär um Personal zum Bedienen von Kriegswaffen, und das heißt zum Führen von Krieg (bei der Aufstandsbekämpfung ist das der Sonderfall des Bürgerkriegs).

    Was aber ist Krieg? Krieg ist auf der einen Seite der Versuch einer Regierung, eine andere Regierung zu ersetzen, entweder durch sich selbst („Eroberungskrieg“) oder durch eine der eigenen Machtausübung weniger hinderliche („Nation Building“). Und entweder komplett oder nur in einem Teil des Machtbereichs der anderen Regierung.

    Auf der anderen Seite ist Krieg der Versuch einer Regierung, die eigene Macht gegen eine andere Regierung oder Teile der Bevölkerung (beim Bürgerkrieg) zu halten. Wie herum es im Einzelfall auch sein mag: Es geht allein darum, Macht auszuweiten oder zu erhalten.

    Selbst wenn mensch der eigenen Regierung wider jede Evidenz (die Bundeswehr hat derzeit in, wievielen?, zwanzig oder so, anderen Ländern Waffen) unterstellt, sie sei dabei in der Rolle der machterhaltenden, quasi verteidigenden Regierung: Sie könnte jede Menge Blutvergießen verhindern, wenn sie einfach zurücktreten würde und sagen, die „angreifende“ Regierung könne ja gerne versuchen, ob sie es besser kann. Es gäbe dann keinen Krieg, und ob die Regierungsführung am Boden wirklich wesentlich schlechter wäre, ist überhaupt nicht ausgemacht. Ich z.B. würde es wahrscheinlich begrüßen, wenn die Schweiz die Regierung in Baden übernehmen würde. Oder Luxemburg: soweit es mich betrifft, könnten die mich schon erobern, denn sooo viel unethischer und steuerparadiesiger als meine gegenwärtige Regierung sind die auch nicht, aber ich glaube, deren Sozialsystem macht schon ein wenig mehr her.

    Ach, wenn nicht gerade Macron regiert, würde jetzt auch ein Überfall aus Frankreich nicht offensichtlich zu einem Rückschritt führen, wenn die Machtübergabe hinreichend friedlich passiert. Ich versuche ohnehin im Augenblick, ein wenig Französisch zu lernen.

    Also: Regierungen, die ein Militär unterhalten, sagen damit klar an, dass sie für ihre Macht töten wollen. Auf jeden Fall mal die Soldaten der anderen Regierungen.

    Es kommt aber noch schlimmer: Wie ich in meinem Furor über die Weigerung der deutschen Regierung, dem Atomwaffenverbotsvertrag TPNW beizutreten, argumentiert habe, sind Kernwaffen nur einsetzbar, um Hunderttausende oder Millionen von Untertanen einer (na ja: in der Regel) anderen Regierung zu töten. Es gibt schlicht keine anderen glaubhaften Einsatzszenarien.

    Mithin ist, wer die Bombe werfen will, gewillt, für die eigene Macht Städte in Schlachthäuser zu verwandeln. Alle deutschen Regierungen meiner Lebenszeit waren ganz wild auf die „nukleare Teilhabe“ und hatten damit diesen Willen. Die zweite Behauptung, die ich hier machen will, ergibt sich damit unmittelbar: Wer in der BRD lebt, wird regiert von Menschen, die für ihre Macht Städte ausradieren werden.

    Es wäre also schon ein großer zivilisatorischer Fortschritt, wenn sich die nächste Regierung durchringen könnte zum Statement, sie könne sich schon vorstellen, zwecks Machterhalt ein paar hundert, tausend, oder zehntausend Menschen zu töten (also: sie löst die Bundeswehr nicht einfach auf, was natürlich der erfreulichste Ausgang wäre); der eigene Machterhalt würde aber doch nicht rechtfertigen, dutzendweise Städte einzuäschern (weshalb sie den Spuk der nuklearen Teilhabe beenden und dem TPNW beitreten würde).

    Ich wette dagegen.

    [1]Da ich wild entschlossen bin, niemals mit meiner Zustimmung regiert zu werden und also nie der künftigen Regierung meine Stimme geben will – das ist mir bisher auch nicht schwer gefallen –, konnte ich daher leider den Linken nicht meine Stimme geben. Repräsentative Demokratie ist schon manchmal kompliziert, denn im Parlament will ich die Linke selbstverständlich schon haben: Wo wären wir heute ohne ihre parlamentarischen Anfragen?
  • Kopfzahlen: Kohlendioxid

    Es gibt eine Handvoll Zahlen, die ich versuche, so ungefähr im Kopf zu haben. Ich nenne die gerne Kopfzahlen, auch wenn das Wort laut Duden was ganz anderes bedeutet.

    Die klassische Kopfzahl ist natürlich die Zahl der Sekunden in einem Jahr, mit guter Genauigkeit π ⋅ 1e7 (ich schreibe hier aus Bequemlichkeit und Computergewohnheit 107 als 1e7). Überlegungen des Typs „ich habe eine Milliarde Datensätze und schaffe 3000 pro Sekunde, also brauche ich für das ganze Ding ungefähr 300000 Sekunden oder halt 3e5/3e7, also ein hundertstel Jahr oder vier Tage“ finde ich sehr hilfreich. Würde ich Mathematik an einer Schule unterrichten, würde ich Depressionen kriegen, wenn meine Schülis sowas nicht hinkriegen würden, nachdem ich ein Jahr auf sie eingeredet habe. Gut, dass ich kein Schullehrer bin.

    Heute nun hat mich die Deutsche Umwelthilfe (DUH) angeschrieben, weil sie Spenden haben will für Klagen gegen BMW, Daimler und Wintershall[1]. Die Brücke zu den Kopfzahlen: sie sagen darin, Wintershall sei allein für rund 80 Megatonnen CO2 im Jahr verantwortlich.

    Um solche Angaben ein wenig einordnen zu können, hatte ich mir vor zehn Jahren zwei Kopfzahlen zurechtgelegt: Die BRD emittierte rund eine Gigatonne, die Welt rund dreißig Gigatonnen CO2. Demnach macht Wintershall rund 8% des CO2-Ausstoßes der BRD aus; das ist nicht unplausibel, aber ich dachte mir, das ist ein guter Anlass, meinen schon etwas länger gehegten Plan umzusetzen, solche Kopfzahlen im Blog zu notieren und zu aktualisieren. Wie steht es nun also, zehn Jahre nach 1 und 30 Gigatonnen?

    Für halbwegs überschaubare Infos zu den BRD-Emissionen hatte ich ganz naiv auf die Publikationen zum Emissionshandel des UBA gehofft, aber zumindest der Juli-Bericht ist in der Hinsicht nicht sehr ergiebig: Was genau heißt es, dass in der Kalenderwoche 27 Emissionsrechte über 280 Millionen Tonnen gehandelt wurden (außer, dass ein Haufen Leute nicht sehr nützliche Arbeit hatten)?

    Aber das Umweltbundesamt hat glücklicherweise eine andere Seite mit nicht marktkontaminierten Informationen. Demnach wären 2020 in der BRD 644 Millionen Tonnen CO2 emittiert worden. Auf drei Stellen genau ist das natürlich lächerlicher Unfug; ich wäre überrascht, wenn das auf 10% irgendeiner sinnvollen Definition von Emission entspräche. Aber dennoch: 2/3 Gigatonnen klingen nach einer brauchbaren Kopfzahl für die aktuelle Kohlendioxid-Emission direkt aus der BRD. Natürlich wären dazu die importierten Emissionen (z.B. aus brasilianischem Sojaanbau für „unser“ Fleisch oder chinesischer Zement- und Stahlproduktion für „unsere“ Häuser und Elektronik) zu rechnen, aber das wird dann kompliziert und letztlich spekulativ.

    Neu merken sollte ich mir den Quellen-Split, den sie dort aufmachen, wieder bereinigt um allzu mutige Claims bezüglich Genauigkeit: Energie 1/3, Haushalte 1/5, Straßenverkehr ein gutes Fünftel, Industrie (wozu dann auch z.B. Hausbau gehört) 1/4.

    Für die globale Emission gibt der einschlägige Artikel der Wikipedia 57 Gigatonnen CO2-Äquivalent an, wo dann allerdings jede Menge tiefes Voodoo reingerechnet ist („including 5 Gt due to land use change“).

    Um dem tiefen Voodoo zu entkommen (und nur das Einsteiger-Voodoo der Emissionsschätzung zu behalten), kann mensch zum aus meiner Sicht relativ vertrauenswürdigen Our World in Data gehen, das eine Kohlendioxid-Seite anbietet, die wiederum auf github-Daten verweist, wo schließlich CO2 und Treibhausgas-Äquivalente separat ausgewiesen sind. Deutschland hat dabei für 2019 700 Mt; das passt im Rahmen meiner Erwartungen gut zu unseren 2/3 Gt für 2020 von oben. Für die Welt (freundlicherweise gibt es die in dem Datensatz schon vorkumuliert unter „World“) und 2019 stehen da mit absurden acht Stellen 36441.388 Mt. Schon zwei Stellen Genauigkeit sind da sicher überoptimistisch, und so wäre meine Kopfzahl für die Weltemission jetzt „um die 35 Gt“.

    Mein Spickzettel für diese Runde Kopfzahlen ist also:

    • Emission in der BRD: 2/3 Gt, davon anteilig 1/3 Energie, 1/4 Industrie, je rund 1/5 Verkehr und Haushalte.
    • Emission in der Welt: 35 Gt, womit die BRD direkt ungefähr 1/50 der Welt-Emission ausmacht.
    [1]Dass mich die DUH immer noch in ihrem CRM-System hat, obwohl ich ihnen eigentlich nur vor Jahren mal gespendet habe – die erfolgreichen Fahrverbots-Klagen haben mich schon sehr begeistert – finde ich jetzt nicht so großartig, aber wer sich so effektiv dem Autowahnsinn entgegenstellt, darf in menem Buch auch mal nicht ganz so korrekt mit Daten umgehen.
  • Die Intensiv-Antwort

    Ich habe ja immer noch nicht so recht meinen Frieden gemacht mit dem Schluss von 66 ist das neue 50 vom letzten Freitag, dass nämlich die Impfkampagne bisher fast keinen Unterschied macht für unsere Fähigkeit, hohe Inzidenzen – die wir praktisch sicher bald haben werden, wenn wir nicht wieder viel weiter zumachen als derzeit – zu ertragen, ohne dass die Intensivstationen zu einem Schlachtfeld werden.

    Die Frage lässt sich zurückführen auf: „Wie viele Intensivbetten waren eigentlich relativ zur jeweiligen Inzidenz durch SARS-2-Erkrankte belegt?“ (bei allen berechtigten Zweifeln an der zuverlässigen Messung letzterer). Diese Antwort der Intensivbelegung auf das Infektionsgeschehen – ich taufe es mal int/inc, weil ich zu faul bin, nachzusehen, wie die Profis das nennen – kriege ich mit dem Besteck vom Coronafilm-Post und meiner DIVI-Auswertung relativ schnell ausgerechnet, und wenn ich dann das Verhältnis von DIVI-Belegung (gezogen jeweils aus den RKI-Berichten der Zeit) zur bundesweiten Inzidenz (auf der Basis der Referenz-Daten des RKI) plotte, sieht das so aus:

    Ein großes Maximum im Juli 2021

    Ich habe die y-Achse wieder logarithmisch eingeteilt, in dem Fall nicht, weil ich irgendwelche exponentiellen Verläufe erwarten würde, sondern weil mir im Wesentlichen der Verlauf im unteren Teil des Wertebereichs am Herzen liegt.

    Das dominierende Feature Anfang Juli 2021 nämlich ist schnell erklärt: Hier waren die Inzidenzen sehr niedrig, die langwierigen Fälle blieben aber auf den Intensivstationen. Und so ging es bis zu 120 IntensivpatientInnen pro Punkt Inzidenz. Ähnlich reflektiert das zweithöchste Feature rund um den Februar 2021 lediglich die fallende Inzidenz und also quasi vorauseilend kleine Nenner zwischen zweiter und dritter Welle.

    Wenn mensch sich diese großen Features mal rausdenkt, kommt als Basis etwas heraus zwischen 20 und 40 Intensivpatient_innen pro Inzidenzpunkt während der Wellen. Mitte August, als die Inzidenzen kräftig anzogen, haben wir vielleicht auch mal 10 touchiert, was zu erwarten wäre, wenn die Basisrate 30 wäre und um die zwei Drittel der Leute geimpft sind. Angesichts der dramatischen Altersabhängigkeit der Hospialisierung von SARS-2 sind solche Überlegungen aber ohne demographische Betrachtungen unsinnig.

    Der Anstieg ganz am rechten Rand des Graphen dürfte übrigens zumindest in diesem Ausmaß ein Artefakt sein, denn ich rechne hier wie gesagt mit dem, was das RKI als Referenzdatum angibt (wo das Infektionsdatum das Meldedatum ersetzt, wenn das rauszukriegen ist), und es kann so sein, dass aus den letzten zwei Wochen Fälle in die weitere Vergangenheit gewandert sind, die, die sie in Zukunft aus der Gegenwart bekommen werden, aber noch nicht da sind; das würde die Inzidenz unterschätzen und mein int/inc überschätzen.

    Nehmen wir trotzdem an, wir hätten mit der derzeitigen Virenpopulation, Infektionsdemographie und Impfquote im Gleichgewicht 20 Intensivpatient_innen pro Indizenzpunkt. Wenn wir dann unter 6000 Intensivpatient_innen bleiben wollen, ist eine 300er-Inzidenz das äußerste, was mit viel Glück zu stemmen wäre. Wenn also nicht mein int/inc drastisch runtergeht – als Faustregel dürfte taugen, dass jede Halbierung des Anteils der ungeimpften Erwachsenen auch eine Halbierung von int/inc nach sich ziehen würde –, wird es noch lang dauern, bis die (relativ) strikte Kontrolle von SARS 2 aufhören kann.

    Eine 300er-Inzidenz in der RKI-Rechnung heißt ja, dass jede Woche 300 von 100000 Menschen SARS-2 hinter sich bringen. Bis dann alle mal SARS-2 hatten (und alle werden es irgendwann gehabt haben, dauerhaft sterile Impfungen gibts bei Atemwegserkrankungen nicht), dauert es logischerweise 100000/300, also gut 300 Wochen. Oder grob sechs Jahre.

    Sorry, liebe Ungeimpfte: so lange will ich echt nicht warten, bis ich nicht mehr an jeder Ecke damit rechnen muss, Namen und Geburtsdatum (im Impfzertifkat) von mir nicht annähernd kontrollierbaren Rechnern überantworten zu müssen.

    Technics

    Der Code, der das erzeugt, ist nicht spannend; mit corona.py sieht die Inzidenzberechnung so aus:

    def get_incidences(tuples):
        """returns a mapping of dates to 7-day incidences from RKI tuples
        as yielded by corona.iter_counts.
        """
        tuples.sort(key=lambda r: r[0])
        incidences = {}
        queue = collections.deque([0], maxlen=7)
        cur_date = None
    
        for tup in tuples:
            if tup[0]!=cur_date:
                if len(queue)==7:
                    incidences[cur_date] = sum(queue)/830
                queue.append(0)
                cur_date = tup[0]
    
            queue[-1] += tup[2]
    
        incidences[cur_date] = sum(queue)/83e4
        return incidences
    
       with open(corona.DATA_DIR
              +"Aktuell_Deutschland_SarsCov2_Infektionen.csv") as f:
          all_rows = list(corona.iter_counts(f, True))
      incidences = get_incidences(all_rows)
    

    Das Zusammenfummeln mit den DIVI-Daten nimmt meine aus den RKI-Berichten gescreenscrapten Daten. Das ist an sich Quatsch, und ihr solltet die Daten einfach von der DIVI selbst ziehen, wenn ihr das reproduzieren wollt.

    Mit dem zusammengefummelten Daten (Spalten: Datum, int/inc, Intensivbelegung und referenzdatenbasierte Inzidenz) könnt ihr aber selbst Plots machen. Das Bild oben kommt aus diesem Gnuplot-Skript:

    set size ratio 0.375
    set key inside left top
    set xdata time
    set yrange [5:200]
    set ytics (10,22,47,100)
    set timefmt "%Y-%m-%d"
    set xrange ['2020-08-01':'2021-08-31']
    set logscale y
    set xtics format "%Y-%m-%d" time
    set term svg size 800,300
    set out "int-vs-inc.svg"
    plot "int-vs-inc.txt" using 1:2 with lines title "int/inc"
    

    ElektronikbastlerInnen werden die Ticks auf der y-Achse wiedererkennen. Logarithmen sind überall.

  • 66 ist das neue 50

    Ich sage es nicht gerne, aber: Entweder wir machen im Winter wieder einen Lockdown oder wir kriegen ein übles Gemetzel.

    Ich hatte ja schon im Januar erzählt, warum ich die Intensivbelegung für die aussagekräftigste Zahl halte, die in den RKI-Berichten vorkommt (natürlich mit dem Nachteil, dass sie für Echtzeitsteuerung nicht taugt, weil sie so weit nachläuft). Und die sieht seit ein paar Wochen übel aus, nämlich praktisch so wie im letzten Oktober:

    Im September 2021 siehts aus wie im Oktober 2020

    SARS 2-Intensivbelegung seit Mitte letzten Jahres in einem Log-Plot (also: exponentielle Entwicklung ist eine Gerade). Zur Verdeutlichung habe ich die Kurve seit diesem Juli nochmal weiß unterlegt neben die Gesamtkurve seit August 2020 gestellt: mensch sieht, wie sich die Verläufe ähneln, abgesehen von der höheren Ausgangsbasis in diesem Jahr. Die grüne Kurve ist übrigens die Zahl der invasiv Beatmeten. Sie hört mittendrin auf, weil der RKI-Tagesbericht die entsprechenden Daten nicht mehr berichtet hat.

    Die Verdopplungszeit ist derzeit so rund drei Wochen; wir dürften also, wenn nicht ein Wunder geschieht, in sechs Wochen, Mitte Oktober, deutlich über 4000 liegen und damit in der Gegend der Notbremsenbelastung rund um Neujahr 2021.

    In der Tat scheint es, als habe die Impfkampagne enttäuschend wenig Einfluss auf diese Zahlen. Heute ist die SARS 2-Intensivbelegung laut RKI-Bericht 1169 bei einer Inzidenz von 80. Eine vergleichbare Belegung war am 23.10.2020 mit 1121 bei einer Inzidenz von 60. Von einer Entkopplung der Intensivbelegung von der Inzidenz kann also keine Rede sein, und schon gar nicht vom „200 ist das neue 50“, das Gesundheitsminister Spahn vor ein paar Wochen wagte. Dazu kommt, dass die Dunkelziffer angesichts des immer noch relativ engen Testregimes in diesem Jahr vermutlich niedriger ist als letztes Jahr und mithin die damalige Inzidenz nach oben korrigiert werden müsste, um mit aktuellen Zahlen vergleichbar zu sein. Selbst ohne so eine Korrektur ist allenfalls 50 ⋅ (80/60) = 66 das neue 50.

    Warum kaum ein Impfeffekt sichtbar ist in diesen Zahlen: Tja, das ist eine spannende Frage, und ich bin neugierig auf Christian Drostens Kommentare dazu, wenn es heute abend wieder ein neues Coronavirus-Update gibt (endlich!). Mein persönlicher Verdacht ist etwas gruselig. Wahrscheinlich stimmen die anekdotischen Berichte, dass aus den Alten- und Pflegeheimen in den ersten drei Wellen kaum Menschen in Intensivstationen überwiesen wurden und sie in aller Regel einfach an Ort und Stelle starben. Die jüngeren Menschen hingegen, die es jetzt vermehrt erwischt (auch wenn der Altersmedian weniger schwankt als ich glaubte), erhalten vermutlich erheblich häufiger Intensivpflege. Ich bin nicht sicher, ob ich da ein „hoffe ich“ dazu schreiben möchte.

    Ohne einen „Delta-Effekt“ wird diese Erklärung jedoch nicht auskommen, denn von den rund 1000 relativ jungen Menschen, denen im letzten Juni bei Tönnies SARS-2 reingedrückt wurde, landeten, soweit ich weiß, keine auf Intensivstationen – und jedenfalls starben keine. Bei vor drei Wochen (als sich heute eingelieferte so plusminus angesteckt haben werden) rund 30000 RKI-aktiven SARS-2-Fällen und einer derzeit vermutlich mit der Tönnies-Belegschaft vergleichbaren Demographie dürften die Intensivstationen eigentlich nicht volllaufen, wenn das Virus nicht eine ganze Ecke fieser geworden wäre.

    Wie dem auch sei: Meine Hoffnung, dass mit jüngeren Kranken und vielen Geimpften höhere Inzidenzen ohne Gemetzel durchhaltbar sind, war klar unbegründet. Das aber macht erneute Notbremsen ab Oktober (und vielleicht schon früher) zu einer praktischen Gewissheit. Ich vermute stark, dass diese Geimpfte anfangs ausnehmen werden. Ich nehme keine Wetten an zur Frage, ob das ausreichen wird. So'n Mist.

  • Wenn LektorInnen schlafen

    Als jemand, dem es schon in der BRD zu frömmelnd zugeht, bin ich ziemlich sicher nicht in Gefahr, allzu große Sympathien für die neue afghanische Regierung („Taliban“) zu hegen. Und trotzdem schmerzt so gut wie die gesamte Berichterstattung über das Regime, gerade im Vergleich zum doch recht gemäßigten Umgang mit Saudi-Arabien. Dort nämlich geht es nach innen hin wohl ziemlich ähnlich zu, doch die Taliban führen immerhin keinen Krieg nach außen, schon gar nicht einen in der Liga des Gemetzels im Jemen.

    Aber selbst wenn sich JournalistInnen in patriotischer[1] Botmäßigkeit verpflichtet fühlen, den Krieg zu rechtfertigen, den unsere Regierungen mit breiter publizistischer Unterstütztung in den letzten zwanzig Jahren „am Hindukusch“ geführt haben: Wenigstens etwas Sorgfalt sollten sie walten lassen. Auf Seite 9 der taz vom 24.8.2021 ist das ganz offenbar nicht passiert. Während Finn Mayer-Kuckuk vierspaltig einen „Rückfall in den Handel mit Drogen“ drohen sieht, stellt der Agenturartikel in der fünften Spalte klar, dass bereits das von „uns“ befreite Afghanistan 85% des Weltbedarfs an Opiaten gedeckt hat:

    Oben: „Es droht ein Rückfall in den Handel mit Drogen“.  Unten: „Afghanistan produziert UN-Angaben zufolge rund 85 Prozent des weltweit hergestellten Opiums“

    Rechte bei der taz; hier verwendet unter… Satireprivileg?

    EinE gutE LektorIn hätte es gemerkt.

    Wo ich schon über Afghanistan spreche, möchte ich noch kurz ein Standbild aus der Tagesschau vom 28.8.2021 zeigen:

    Eingang zum „Hamid Karzai International Airport“

    Rechte wahrscheinlich bei der Tagesschau.

    Das entscheidende Detail hier ist: Das alte Regime war unbescheiden genug, den Flughafen nach dem immerhin noch lebenden und (z.B. nach der Lebenserwartung der Untertanen bemessen) gewiss nicht sehr erfolgreichen Ex-Präsidenten Hamid Karzai zu benennen. Nur mal so als ein Datenpunkt zur Erklärung, warum die Regierung, die „wir“ dort 20 Jahre lang installiert hatten, noch vor „unserem“ Abzug so ostentativ kollabiert ist.

    Zum Abschluss hätte ich einen Buchtipp in dem Zusammenhang: Cockburn, A. und St. Clair, J., 1998: „Whiteout: The CIA, Drugs, and the Press“, London, New York: Verso (verfügbar in der Imperial Library of Trantor). Der Guardian hat es damals rezensiert mit:

    A history of hypocrisy and political interference the like of which only Frederick Forsyth in a dangerous caffeine frenzy could make up.

    Dem kann ich zustimmen.

    [1]Wo ich es schon von Patriotismus habe, will ich einen Aufkleber lobend erwähnen, den ich neulich in Hamburg-Wilhelmsburg gesehen habe: „Wer als Patriot*in losläuft, kommt als Faschist*in an“. Wenn nur das Wetter nicht so lausig wäre in der Gegend – mensch könnte da fast hinziehen wollen.
  • 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 …

« Seite 14 / 17 »

Letzte Ergänzungen