<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[NachtSieb]]></title>
  <link href="https://nachtsieb.de//atom.xml" rel="self" />
  <link href="https://nachtsieb.de/" />
  <updated>2026-07-19T18:19:27+02:00</updated>
  <id>https://nachtsieb.de/</id>
  <author>
    <name><![CDATA[Martin Steinbach]]></name>
    <email><![CDATA[martin@nachtsieb.de]]></email>
  </author>
  <generator uri="https://github.com/jmacdotorg/plerd">Plerd</generator>


  <entry>
    <title type="html"><![CDATA[Homöopathie bei gesetzlichen Krankenkassen]]></title>
    <link href="https://nachtsieb.de/2021-05-31-krankenkassen.html"/>
    <published>2021-05-31T11:39:00+02:00</published>
    <updated>2021-05-31T11:46:02+02:00</updated>
    <id>https://nachtsieb.de/2021-05-31-krankenkassen.html</id>
    <content type="html"><![CDATA[<p><strong>Bei welchen Krankenkasse sind in den Regelleistungen Behandlungen mit Homöopathie möglich?</strong>
Die folgende Übersicht versucht die Frage für einige gesetzlichen Krankenkassen
zu beantworten. Es sind nur die mitgliederstärksten Krankenkassen verzeichnet. Die
Erhebung wurde im Mai 2021 durchgeführt und es besteht keine Garantie auf
Vollständigkeit.</p>

<p>Das Ergebnis ist sehr unerfreulich, es sind eindeutig zu viele Krankenkassen die
Homöopathische “Behandlungen” bezahlen. Am dreistesten ist sicherlich die HKK, welche
es unter den Namen <em>Naturarzneimittel</em> in ihrem Katalog aufführt.</p>

<p>Wählt weise!</p>

<h4 id="krankenkassendieteilweisealternativemedizinanbieten:">Krankenkassen die teilweise alternative Medizin anbieten:</h4>

<ul>
<li><a href="https://www.kkh.de/leistungen/alternativmedizin">KKH</a>
<ul>
<li>Heilpraktikerbehandlung nur über Bonusprogramm</li>
<li>Akkupunktur nur bei chronischem Leiden</li>
<li>Ostheopathie</li>
</ul></li>
<li><a href="https://www.die-ikk.de/leistungen-a-bis-z/klassische-leistungen/osteopathie">IKK</a>
<ul>
<li>Pro Jahr maximal 150 Euro für Ostheopathie</li>
</ul></li>
<li><a href="">Debeka BKK</a>
<ul>
<li>Akkupunktur bei zertifizierten Ärzten</li>
<li><strong>Keine</strong> Behandlung bei Heilpraktikern</li>
<li>Ostheopathie: maximal sechs Sitzungen pro Kalenderjahr, jedoch nicht mehr als 40 EUR je Sitzung</li>
</ul></li>
<li><a href="https://www.aok.de/pk/nordost/leistungen-services/leistungen-von-a-z/">AOK</a>
<ul>
<li>Akkupunktur (chronische Schmerzen, Vertragsarzt)</li>
</ul></li>
</ul>

<h4 id="krankenkassendiehomopathieuntersttzen:">Krankenkassen die Homöopathie unterstützen:</h4>

<ul>
<li><a href="https://www.barmer.de/unsere-leistungen/leistungen-a-z/alternative-medizin">Barmer</a></li>
<li><a href="https://www.tk.de/techniker/leistungen-und-mitgliedschaft/informationen-versicherte/leistungen/weitere-leistungen/alternative-medizin/alternative-behandlungsmethoden/kosten-homoeopathie-2002136">TK</a></li>
<li><a href="https://dak.de/dak/leistungen/homoeopathie-was-sie-wissen-sollten-2074970.html#/">DAK</a></li>
<li><a href="https://www.hkk.de/leistungen-und-services/hkk-leistungen/spezielle-behandlungsangebote/naturarzneimittel">HKK</a>
<ul>
<li>getarnt unter dem Deckmantel <em>Naturarzneimittel</em></li>
</ul></li>
<li><a href="https://www.hek.de/erstklassige-leistungen/leistungen-a-z/detail/alternative-heilmethoden-und-naturheilverfahren/">HEK</a></li>
<li><a href="https://www.bkk24.de/leistungen-beitraege/leistungen-a-z/homoeopathie.html">BKK24</a></li>
<li><a href="https://www.heimat-krankenkasse.de/unser-angebot/leistungen/leistungen-a-z/homoeopathie/">Heimatkrankenkasse</a></li>
<li><a href="https://www.novitas-bkk.de/leistungen/leistungen-von-a-z/h-i-j/homoeopathie/">Novitas BKK</a></li>
<li><a href="https://www.knappschaft.de/DE/LeistungenGesundheit/AlternativeMedizin/Homoeopathie/homoeopathie_node.html">Knappschaft</a></li>
<li><a href="https://www.svlfg.de/Homoeopathie">Landwirtschaftskrankenkasse</a></li>
<li><a href="https://mobil-krankenkasse.de/leistungen-und-vorteile/alternative-medizin-und-therapien/homoeopathie.html">BKK-Mobil</a></li>
</ul>
]]></content>
  </entry>

  <entry>
    <title type="html"><![CDATA[Impfdosen: geliefert und verimpft<br />


]]></title>
    <link href="https://nachtsieb.de/2021-04-06-impfdosen.html"/>
    <published>2021-04-06T12:08:27+02:00</published>
    <updated>2021-04-10T12:45:01+02:00</updated>
    <id>https://nachtsieb.de/2021-04-06-impfdosen.html</id>
    <content type="html"><![CDATA[<p>Das <a href="https://impfdashboard.de/">Impfdashboard</a> des Bundesministeriums für Gesundheit
bietet viele Informationen zum Impffortschritt. Jedoch fehlt ein Vergleich der
Bundesländer und ihrer verimpften Dosen im Verhältnis zu den gelieferten Dosen.</p>

<p>Die folgende Grafik bietet diesen Vergleich und wird täglich aktualisiert. Als Quellen
dienen die zur Verfügung gestellten Daten des Impfdashboards. Sie ist auch im Bereich
<a href="https://nachtsieb.de/covid-19.html">covid19-plots</a> hinterlegt.</p>

<p><a href="/img/doses_delivered_vaccinated_ratio.png"><img src="/img/doses_delivered_vaccinated_ratio.png" alt="ration delivered to vaccinated doses" id="rationdeliveredtovaccinateddoses" /></a></p>
]]></content>
  </entry>

  <entry>
    <title type="html"><![CDATA[Pandemieverlauf in Rostock]]></title>
    <link href="https://nachtsieb.de/2021-03-16-pandemieverlauf.html"/>
    <published>2021-03-16T14:17:50+01:00</published>
    <updated>2021-03-17T18:09:36+01:00</updated>
    <id>https://nachtsieb.de/2021-03-16-pandemieverlauf.html</id>
    <content type="html"><![CDATA[<p>Im Bereich <a href="https://nachtsieb.de/covid-19.html">covid19-plot</a> wurde eine neues Diagramm
hinzugefügt. Es zeigt den bisherigen Verlauf der Pandemie anhand der Inzidenz
(Fälle pro 100.000 Personen) für Rostock, Mecklenburg-Vorpommern und Deutschland.</p>

<p><a href="/img/pandemic_course.png"><img src="/img/pandemic_course.png" alt="pandemic course" id="pandemiccourse" /></a></p>
]]></content>
  </entry>

  <entry>
    <title type="html"><![CDATA[Kompression von serialisierten Python-Objekten (Benchmark)]]></title>
    <link href="https://nachtsieb.de/2021-03-10-compression.html"/>
    <published>2021-03-10T20:48:03+01:00</published>
    <updated>2021-03-11T10:47:22+01:00</updated>
    <id>https://nachtsieb.de/2021-03-10-compression.html</id>
    <content type="html"><![CDATA[<p>Für ein zukünftiges Projekt würde ich gerne die Qualität von Kompressionsalgorithmen
für das folgende Problem bewerten: Es sollen viele kleine Objekte mit
<a href="https://docs.python.org/3/library/pickle.html">pickle</a>
serialisiert und über ein Netzwerk
übertragen werden. Die Objekte können sich in ihrer Größe unterscheiden,
werden aber grundsätzlich nicht zu komplex. Auch ganze Warteschlangen, bestehend
aus diesen Objekten sollen übertragen werden. Für die Vergleiche werden
folgende Objekte zufällig generiert (als BNF notiert):</p>

<pre><code>Objekt      = id, timestamp, {value}, description
id          = ? int64 ?
timestamp   = ? int32 ?
value       = float
description = {Character}
Character   = ? printable ascii characters ?
</code></pre>

<p>Als Kompressionsalgorithmen kommen zlib, zstd, lz4 und lzo in Frage. bz2 und lzma
reduzieren den benötigten Platzbedarf zwar am meisten, sind aber auch erheblich langsamer
als der Rest. Die benötigte Zeit ist das ausschlaggebende Kriterium.
Da mich das Verhalten im Zusammenspiel mit Python3 interessiert wurden die
Vergleiche auch mit Python3 (3.9.1) durchgeführt. Dabei wurden folgende externe
Module verwendet:</p>

<ul>
<li><a href="https://github.com/python-lz4/python-lz://pypi.org/project/zstd/">zstd</a></li>
<li><a href="https://pypi.org/project/python-lzo/">lzo</a></li>
<li><a href="https://pypi.org/project/lz4/">lz4</a></li>
</ul>

<p>Die Module zlib, bz2 und lzma sind teil der Standardbibliothek.</p>

<h2 id="kompressioneineseinzelnenobjektes">Kompression eines einzelnen Objektes</h2>

<p>Die folgende Grafik zeigt die benötigte Zeit (Millisekunden), um ein Objekt
einzeln und innerhalb einer Liste zu komprimieren.</p>

<p><a href="/img/compression-benchmark/compress_1_time.png"><img src="/img/compression-benchmark/compress_1_time.png" alt="single time" id="singletime" /></a></p>

<p>Hier wird die Größe in Byte nach der Kompression gezeigt. <em>None</em> ist die Größe der
Quelldaten.</p>

<p><a href="/img/compression-benchmark/compress_1_byte.png"><img src="/img/compression-benchmark/compress_1_byte.png" alt="single bytes" id="singlebytes" /></a></p>

<h2 id="kompressionvon100.000objekten">Kompression von 100.000 Objekten</h2>

<p>Nachfolgende Plots zeigen die aufsummierte Zeit und Datenmenge, wenn 100.000 Objekte
einzeln komprimiert werden und zusammen als liste.</p>

<p><a href="/img/compression-benchmark/compress_100000_time.png"><img src="/img/compression-benchmark/compress_100000_time.png" alt="stream time" id="streamtime" /></a></p>

<p><a href="/img/compression-benchmark/compress_100000_byte.png"><img src="/img/compression-benchmark/compress_100000_byte.png" alt="stream bytes" id="streambytes" /></a></p>

<h2 id="dekompressionderobjekte">Dekompression der Objekte</h2>

<p>Zum Schluss wird noch die benötigte Zeit für die Dekompression der Daten verglichen.</p>

<p><a href="/img/compression-benchmark/decompress_1.png"><img src="/img/compression-benchmark/decompress_1.png" alt="single decomp" id="singledecomp" /></a></p>

<p><a href="/img/compression-benchmark/decompress_100000.png"><img src="/img/compression-benchmark/decompress_100000.png" alt="stream decomp" id="streamdecomp" /></a></p>

<h2 id="fazit">Fazit</h2>

<ol>
<li><p>Pickle arbeitet sehr schnell und legt die serialisierten Daten effizient ab. Wenn
100K Objekte in einer Liste verpackt werden, benötigen diese nur 1/3 des Speicherplatzes,
als wenn jedes Objekt einzeln serialisiert wird.</p></li>
<li><p>Einzelne Objekte (Events) zu komprimieren und sie im Anschluss zu übertragen scheint
ineffizient zu sein, der eingesparte Speicherplatz für diese kleinen Objekte ist einfach
zu gering. Bei größeren Objekten könnte eine Kompression wieder wieder sinnvoll sein.
Man könnte größere Objekte soweit Komprimieren, dass sie in ein einzelnes
TCP/UDP-Segment passen.</p></li>
<li><p>zlib ist einfach zu langsam, auch mit dem niedrigstem Kompressionslevel (zlib_1). zstd
eignet sich überhaupt nicht um kleine Datenmengen zu komprimieren, schneidet aber bei
größeren Datenmengen hervorragend ab. zstd reduziert den benötigten Speicherplatz am
besten, benötigt zur Kompression aber mehr Zeit als lzo und lz4, ist jedoch bei der
Dekompression nur minimal langsamer als diese beiden sehr schnellen Algorithmen. zstd
wäre damit der beste Kandidat um komplette Warteschlangen zu komprimiert zu übertragen.</p></li>
<li><p>Soll eine Kompression von einzelnen Events erfolgen, ist lz4 der favorisierte
Kandidat. Er komprimiert und dekomprimiert einfach am schnellsten.</p></li>
</ol>
]]></content>
  </entry>

  <entry>
    <title type="html"><![CDATA[LUCA-App: Geofencing ohne Funktion<br />


]]></title>
    <link href="https://nachtsieb.de/2021-03-07-luca.html"/>
    <published>2021-03-07T17:47:45+01:00</published>
    <updated>2021-04-21T12:48:29+02:00</updated>
    <id>https://nachtsieb.de/2021-03-07-luca.html</id>
    <content type="html"><![CDATA[<p>Eine kurze Kritik über die <strong>automatisch Auschecken</strong>-Funktion der LUCA-App und warum
diese unter Android derzeit nicht funktionieren kann, sowie die Konsequenzen die daraus
für Nutzer der Luca-App und Betreiber entstehen können.</p>

<p><strong>Update</strong></p>

<p><strong>[26.03.2021]</strong> Seit heute ist im
<a href="https://play.google.com/store/apps/details?id=de.culture4life.luca">Google-Playstore</a>
die Berechtigung für den Standortzugriff ausgewiesen (Version 1.4.12).
Wenn man die App allerdings
installiert, existiert diese Berechtigung nicht. Damit ist die App immernoch nicht in der
Lage einen automatischen Checkout vorzunehmen.</p>

<p><strong>[21.04.2021]</strong> Seit dem 26.03.2021 Hat sich am Zustand der App nichts geändert.</p>

<h3 id="luca-appinmecklenburg-vorpommern">LUCA-App in Mecklenburg-Vorpommern</h3>

<p>Mecklenburg-Vorpommern ist das erste Bundesland das eine
<a href="https://www.ndr.de/nachrichten/mecklenburg-vorpommern/Corona-Einzelhandel-im-ganzen-Land-kann-wieder-loslegen,coronavirus4544.html">Betreiberlizenz</a>
für die <a href="https://luca.app">LUCA-App</a> erworben hat. Es wird offensiv mit der Nutzung
der App geworben. Der Preis dieser Lizenz ist unbekannt.</p>

<h3 id="allgemeinekritikanderluca-app">Allgemeine Kritik an der Luca-App</h3>

<p>Ich beziehe mich im folgenden auf die Android-Version der LUCA-App.</p>

<p>Ich befürworte ausdrücklich die Nutzung von IT-Lösungen zum Zweck der
Kontaktnachverfolgung. Die Corona-Warn-App ist ein gutes Beispiel für
eine datenschutzfreundliche und offene Lösung, der Entwicklungsprozess
ist komplett transparent und auch das zugrundeliegende <em>Exposure Notification Framework</em>
von Google ist mittlerweile im Quellcode verfügbar. Zudem gibt es einen Google-freien
Nachbau des Frameworks  vom <a href="https://microg.org/">MicroG-Projekt</a> und auch einen Fork der
originalen Corona-Warn-App namens
<a href="https://f-droid.org/de/packages/de.corona.tracing/">Corona Contact Tracing Germany</a>
, die das MicroG-Exposure-Framework verwendet. Der einzige Kritikpunkt an der
Corona-Warn-App könnten die hohen Entwicklungskosten sein. Wie viel die
Luca-Lizenzen in Summe kosten ist aber auch noch unklar. Aus Datenschutzgründen hat
man sich im November 2020 entschieden, keine Kontaktnachverfolgung im Sinne der LUCA-App
in die Corona-Warn-App zu integrieren, um nicht das Vertrauen in die App zu verspielen.
Stattdessen nehmen wir einfach eine nicht überprüfte Software von einem Berliner
Start-up?</p>

<p>Genau die oben beschriebenen Vorteile, die auch das Vertrauen in die Luca-App stärken
würden, da unabhängige Experte sich den Code anschauen könnten und
<strong>Verbesserungsvorschläge</strong> einreichen können, fehlen in der LUCA-App komplett.
Stattdessen setzt man offensichtlich auf eine strikt proprietäre Lösung,
die nicht einmal einen <strong>Audit</strong> durch externe Firmen
erfahren hat. Zudem werden Lizenzverhandlungen hinter verschlossenen Türen durchgeführt.</p>

<h3 id="luca-appverwendetgeofencing-oderdochnicht">LUCA-App verwendet Geofencing - oder doch nicht?</h3>

<p>Seit Montag, dem 01.03.2021, ist es Frisören in MV wieder erlaubt zu öffnen. Natürlich
mit der Bitte die LUCA-App zu verwenden. Eine Frisörmeisterin aus Rostock hat
im Lokalradio von ihren Erfahrungen mit der LUCA-App berichtet.
Sinngemäß wurde die Möglichkeit gelobt im Betreiber-Modus einen Radius zu erstellen, aus
dem man automatisch ausgecheckt wird:
Ist ein Nutzer mit der LUCA-App im Frisörsalon eingecheckt und verlässt
den voreingestellten Radius, wird er automatisch ausgecheckt. Für die Frisörmeisterin
eine hervorragende Funktion, Kunden müssen sich somit nicht manuell auschecken.</p>

<p><strong>Wie funktioniert das automatische Auschecken?</strong></p>

<p>Ganz einfach: <strong>Die Position des Smartphones muss zu jedem Zeitpunkt bekannt sein.</strong>
Kurz gesagt, die LUCA-App braucht Zugriff auf die <strong>Ortungsfunktionen</strong> des Smartphones.
Ortungen mit metergenauer Auflösung könnte folgendermaßen durchgeführt werden:</p>

<ol>
<li>Verwendung des GPS/GLONASS/GALILEO - Empfängers des Smartphones
<ul>
<li>sehr genau</li>
<li>nur außerhalb von Gebäuden</li>
</ul></li>
<li>Ungenaue Ortung mittels bekannten Netzwerken (WiFi, Cell-Based)
<ul>
<li>Externe Datenbanken müssten angefragt werden (Google-Services)</li>
<li>Genauigkeit hängt von der Datenqualität der entsprechenden Region an</li>
</ul></li>
<li>Ortung mittels Funkfeuer (zum Beispiel mittels Bluetooth-Low-Energie-Beacons)
<ul>
<li>Stark begrenzte Reichweite (wenige Meter)</li>
<li>Ungenau</li>
<li>Smartphone des Betreibers oder spezielle BLE-Sender  müsste BLE-Beacons aussenden</li>
</ul></li>
</ol>

<p>Alle drei Verfahren benötigen aber Zugriff auf die <strong>Standortdaten</strong> des Android-Smartphones.
Das automatische auschecken auf Basis von Standortdaten scheint optional zu sein, das
wird aber im Betreiber-Modus, während der Eintragung eines Radius nicht erwähnt.</p>

<p>Zusätzlich existiert noch die Möglichkeit eine sehr grobe Standortbestimmung mittels
IP-Adressen vorzunehmen. Dieses Verfahren ist aber für die metergenaue Bestimmung
unbrauchbar und auch nicht zuverlässig. Je nach Qualität der Daten kann man
lediglich die Region (z.B. Stadt) bestimmen in der man sich aufhält. Diese Bestimmung
benötigt keine gesonderten Berechtigungen auf dem Smartphone.</p>

<p>Nur die FAQ auf der Homepage bietet eine kurze Bemerkung, aber nicht
<strong>wie Geofencing in der LUCA-App umgesetzt ist</strong>.</p>

<p style="text-align: center;">
<img src="img/luca-faq-geofencing.jpg" alt="LUCA-FAQ Geofencing">
</p>

<h4 id="automatischesauscheckenkannzurzeitunterandroidnichtfunktionieren.">Automatisches Auschecken kann zur Zeit unter Android nicht funktionieren.</h4>

<p>Wie schon erwähnt, müsste die LUCA-App Zugriff auf die Standortdaten haben um überhaupt
das metergenaue automatische Auschecken zu ermöglichen. Derzeit wird diese Funktion durch
die Android-App (Version 1.4.9) überhaupt nicht angeboten. Die Berechtigungen der App im
<a href="https://play.google.com/store/apps/details?id=de.culture4life.luca">Play-Store</a> gibt
eindeutig Auskunft darüber:</p>

<p style="text-align: center;">
<img src="img/luca-playstore.jpg" alt="LUCA-App Playstore Berechtigungen" style="width:400px;">
</p>

<p>Auch nach der Installation der App existiert keine Möglichkeit der Standortabfrage:</p>

<p style="text-align: center;">
<img src="img/luca-screenshot-berechtigungen.jpg" alt="LUCA-App Berechtigungen Android 9" style="width:200px;">
</p>

<p><strong>Wie soll metergenaues auschecken unter Android so möglich sein? Gar nicht!</strong></p>

<p>Die iOS-Version der App (Version 1.3.1) scheint die Möglichkeit der Standortabfrage
zu bieten.</p>

<p>Abseits großer datenschutzspezifischer Bedenken, dass ein Unternehmen somit
in der Lage wäre Bewegungsdaten tausender Menschen zu erfassen, kann diese Funktion
einfach nicht benutzt werden.</p>

<h3 id="konsequenzen">Konsequenzen</h3>

<p><strong>Das automatische Auschecken wird im Betreiber-Modus der
LUCA-Web-App zentral beworben, kann aber nicht funktionieren. Wenn sich technisch nicht
versierte Betreiber und Gäste auf diese Funktion verlassen, ist das in meinen Augen
ein schwerer Fehler. Es kann sogar dazu führen das eigentlich unbeteiligte Betreiber
in Quarantäne müssen und so eventuell ihren Geschäftsbetrieb einstellen oder
einschränken müssen, da sich Gäste eigentlich woanders infiziert haben, aber nicht
ausgecheckt waren. Das kann natürlich auch Gäste treffen die sich auf das automatische
Auschecken verlassen und später eine Quarantäne Aufforderung bekommen, obwohl sie
schon lange nicht mehr vor Ort waren.</strong></p>

<h3 id="forderungandieentwicklerderluca-app">Forderung an die Entwickler der LUCA-App</h3>

<ol>
<li><p>Rücknahme der Geofencing-Funktionen aus <strong>Datenschutzgründen</strong> und aufgrund
unvollständiger Unterstützung des eigenen Softwarestacks.</p></li>
<li><p>Klare und detaillierte Beschreibung der Architektur.</p></li>
<li><p>Audit des gesamten LUCA-Softwarestacks durch mindestens zwei unabhängige Unternehmen.</p></li>
</ol>

<h3 id="forderunganregierungenundstdtedieeineluca-lizenzerworbenhaben">Forderung an Regierungen und Städte die eine LUCA-Lizenz erworben haben</h3>

<ol>
<li><p>Veröffentlichung von Preislisten oder gezahlten Preise für Lizenzen.</p></li>
<li><p>Druck auf die Entwickler erhöhen, den Code (Apps + Server) zu publizieren (<strong>public money public code!</strong>).</p>

<ul>
<li>Zum Beispiel kauf des Start-up und Umwandlung in Bundes-/Landeseigene Unternehmung</li>
</ul></li>
</ol>
]]></content>
  </entry>

  <entry>
    <title type="html"><![CDATA[COVID-19 Plots]]></title>
    <link href="https://nachtsieb.de/2021-01-04-covid-19-impfmonitoring.html"/>
    <published>2021-02-11T07:00:00+01:00</published>
    <updated>2022-06-11T11:45:33+02:00</updated>
    <id>https://nachtsieb.de/2021-01-04-covid-19-impfmonitoring.html</id>
    <content type="html"><![CDATA[<h1 id="impfmonitoring">Impfmonitoring</h1>

<p><strong>Alle Grafiken werden stündlich aktualisiert, sofern neue Daten zur verfügung stehen.</strong></p>

<p>Der Quellcode steht auf <a href="https://github.com/meetunix/covid19-plots">github</a> zur Verfügung.</p>

<p>Folgender Plot zeigt den nach Bundesländern aufgeschlüsselten Impffortschritt an.
Als Quelle dienen Daten vom <a href="https://impfdashboard.de">Impfdashboard</a>.</p>

<p><a href="/img/current_vaccination.png"><img src="/img/current_vaccination.png" alt="Vaccination in Germany" id="vaccinationingermany" /></a></p>

<h1 id="pandemieverlaufinrostock">Pandemieverlauf in Rostock</h1>

<p>Folgender Plot basiert auf den Daten aus Pavel Meyers
<a href="https://pavelmayer.de/covid/risks/">Covid-Risiko-Tabelle</a>. Das erzeugende Skript
kann beliebige Landkreise, Städte, oder Länder plotten und ist auf
<a href="https://github.com/meetunix/covid19-plots/tree/main/pandemieverlauf">github</a> veröffentlicht.</p>

<p><a href="/img/pandemic_5rd_wave.png"><img src="/img/pandemic_5rd_wave.png" alt="pandemic course starting at 2022-02-15 wave" id="pandemiccoursestartingat2022-02-15wave" /></a></p>

<p><a href="/img/pandemic_4rd_wave.png"><img src="/img/pandemic_4rd_wave.png" alt="pandemic course starting at 2021-10-15 wave" id="pandemiccoursestartingat2021-10-15wave" /></a></p>

<p><a href="/img/pandemic_3rd_wave.png"><img src="/img/pandemic_3rd_wave.png" alt="pandemic course starting at 3rd wave" id="pandemiccoursestartingat3rdwave" /></a></p>

<p><a href="/img/pandemic_2nd_wave.png"><img src="/img/pandemic_2nd_wave.png" alt="pandemic course starting at 2nd wave" id="pandemiccoursestartingat2ndwave" /></a></p>

<p><a href="/img/pandemic_course.png"><img src="/img/pandemic_course.png" alt="pandemic course" id="pandemiccourse" /></a></p>

<h3 id="updates"><strong>Updates</strong></h3>

<p><strong>[11.06.2022]</strong> Neue Plots für die Zeiträume vom 15.10.2021 und 15.02.2022</p>

<p><strong>[06.04.2021]</strong> Plot zum Verhältnis von gelieferten zu verimpften Dosen hinzugefügt.</p>

<p><strong>[16.03.2021]</strong> Plot zum Pandemieverlauf hinzugefügt.</p>

<p><strong>[11.02.2021]</strong> Es wird nach Erst- und Zweitimpfung unterschieden.</p>

<p><strong>[19.01.2021]</strong> Umstrukturierung der RKI-Tabelle, inkompatibel zur vorherigen Version
Es existiert jetzt eine Aufschlüsselung nach Impfpräparaten.</p>

<p><strong>[04.01.2021]</strong> Das RKI stellt seit heute auch die Impfquote pro 1000 Einwohnern und
die Gesamtanzahl der Impfungen der letzten Tage in ihrer Excel-Tabelle bereit.</p>

<h3 id="alternativen:"><strong>Alternativen:</strong></h3>

<p><a href="https://www.rki.de/DE/Content/InfAZ/N/Neuartiges_Coronavirus/Daten/Impfquoten-Tab.html">RKI - Impfmonitoring</a></p>

<p><a href="https://www.zeit.de/wissen/gesundheit/2020-12/corona-impfungen-deutschland-impfquoten-bundeslaender-landkreise-karte">Die Zeit</a></p>

<p><a href="https://gfx.sueddeutsche.de/apps/e623417/www/index.html">Sueddeutsche Zeitung</a></p>

<p><a href="https://www.spiegel.de/wissenschaft/medizin/coronavirus-infizierte-genesene-tote-alle-live-daten-a-242d71d5-554b-47b6-969a-cd920e8821f1">Der Spiegel</a></p>
]]></content>
  </entry>

  <entry>
    <title type="html"><![CDATA[wireguard VPN-Server mit IPv6]]></title>
    <link href="https://nachtsieb.de/2019-03-21-wireguard-vpn-server.html"/>
    <published>2019-03-21T00:00:00+01:00</published>
    <updated>2019-03-23T11:32:47+01:00</updated>
    <id>https://nachtsieb.de/2019-03-21-wireguard-vpn-server.html</id>
    <content type="html"><![CDATA[<p>Dieser Artikel beschreibt die Konfiguration eines <a href="https://www.wireguard.com/">Wireguard</a> - VPN-Servers auf debian 9 (stretch,stable).
Sämtlicher IPv4- als auch IPv6-Verkehr eines <a href="https://en.wikipedia.org/wiki/Road_warrior_(computing)">Roadwarriors</a>
soll durch Wireguard getunnelt werden. Als Server kommt ein <a href="https://www.hetzner.de/cloud">Hetzner-Cloud-server CX11</a>
zum Einsatz. Für 2,96€ im Monat bekommt man genügend Leistung, eine fixe IPv4-Adresse und ein IPv6-Netz (/64) zugewiesen.</p>

<p><strong>Wireguard</strong> ist eine moderne VPN-Lösung mit einer sehr schmalen Codebasis. Wireguard implementiert nur wenige, dafür aber aktuelle
Verschlüsselungsverfahren und läuft, anders als zum Beispiel OpenVPN, im Kontext des Kernels. Eine detaillierte Beschreibung des Protokolls und eine
Übersicht über die verwendeten kryptografischen Verfahren kann man im Wireguard-<a href="https://www.wireguard.com/papers/wireguard.pdf">whitepaper</a> nachlesen.
In den nächsten Monaten (stand März 2019) soll Wireguard Aufnahme in den Linux-Kernel finden. Für debian 10  <em>testing</em>
und <em>unstable/sid</em> stehen aktuelle Pakete in den debian-repositories bereit. Die Installation auf allen gängigen Linux-Distributionen und BSD-Systemen
ist auf der Wireguard-Homepage <a href="https://www.wireguard.com/install/">beschrieben</a>. Als Transportprotokoll setzt Wireguard ausschließlich auf
UDP, möchte man stattdessen TCP einsetzen (einziger Grund wäre eine Blockierung von UDP), muss man Wireguard zum Beispiel über
<a href="https://kirill888.github.io/notes/wireguard-via-websocket/">WebSockets tunneln</a>.</p>

<h3 id="dasszenario">Das Szenario</h3>

<ol>
<li>Sämtlicher Verkehr soll über einen Tunnel geroutet werden.</li>
<li>Die DNS-Auflösung und das Caching soll vom VPN-Server übernommen werden.</li>
<li>Die Konfiguration auf dem VPN-Server soll persistent sein.</li>
<li>Die Clientkonfiguration soll per QR-Code auf Apple-IOS/Android übertragen werden.</li>
</ol>

<h3 id="installation">Installation</h3>

<p>Da Wireguard ein Kernelmodul benötigt, muss das System zu dessen Übersetzung vorbereitet werden:</p>

<pre><code>sudo apt-get install linux-headers-$(uname -r) build-essential
</code></pre>

<p>Für debian 9 <em>stretch/stable</em> existieren noch keine Pakete im offiziellen repository, daher muss
das <em>unstable</em>-repository auf dem System verfügbar gemacht werden. Bei debian 10 kann dieser Schritt übersprungen werden.
Dabei werden alle Pakete aus <em>unstable</em> jedoch so niedrig priorisiert, dass alle Pakete aus <em>stable</em> bei
Updates den Vorzug erhalten, außer explizit installierten Paketen aus <em>unstable</em>:</p>

<pre><code>$ sudo echo "deb http://deb.debian.org/debian/ unstable main" &gt; /etc/apt/sources.list.d/unstable.list
$ sudo printf 'Package: *\nPin: release a=unstable\nPin-Priority: 90\n' &gt; /etc/apt/preferences.d/limit-unstable
</code></pre>

<p>Im Anschluss wird Wireguard installiert und das Kernelmodul wird automatisch übersetzt und geladen:</p>

<pre><code>$ sudo apt update &amp;&amp; apt install wireguard
</code></pre>

<p>Ob das Kernelmodul geladen ist, lässt sich leicht überprüfen:</p>

<pre><code>$ sudo lsmod | grep wireguard
</code></pre>

<h3 id="routingaktivieren">Routing aktivieren</h3>

<p>Damit der VPN-Server IPv4 und IPv6 Pakete weiterleitet muss diese Funktionalität dem Kernel mitgeteilt werden:</p>

<pre><code>$ sysctl net.ipv4.ip_forward=1
$ sysctl net.ipv6.conf.all.forwarding=1
</code></pre>

<p>Um diese Einstellungen auch nach einem Neustart zu setzen, sind folgende Zeilen zur Datei <code>/etc/sysctl.d/99-sysctl.conf</code> zu ergänzen:</p>

<pre><code>net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
</code></pre>

<h3 id="erstellenderschlssel">Erstellen der Schlüssel</h3>

<p>Wireguard basiert auf dem Konzept des <em>Crypto-Routing</em>. Jeder Kommunikationsteilnehmer an einem VPN besitzt ein asymmetrisches Schlüsselpaar,
der jeweilige öffentliche Schlüssel wird demjenigen Kommunikationspartner mitgeteilt, der über den Kommunikationskanal kommunizieren darf. Die
Schlüssel sind sehr kurze base64-kodierte <a href="https://www.wireguard.com/protocol/">ECDH</a>-Schlüssel. Die Schlüssel können auf jedem System, auf
auf dem Wireguard verfügbar ist, generiert werden.</p>

<p>Schlüsselpaar für den <strong>VPN-Server</strong>:</p>

<pre><code>$ wg genkey &gt; vpn-server.seckey
$ wg pubkey &lt; vpn-server.seckey &gt; vpn-server.pubkey
</code></pre>

<p>Schlüsselpaar für einen weiteren Kommunikationsteilnehmer:</p>

<pre><code>$ wg genkey &gt; mobile.seckey
$ wg pubkey &lt; mobile.seckey &gt; mobile.pubkey
</code></pre>

<p><strong>Optional</strong> ist die Generierung eines weiteren <em>pre shared keys</em> um eine weitere Schicht symmetrischer Verschlüsselung hinzuzufügen.
Gründe hierfür werden in Abschnitt 5.2 des <a href="https://www.wireguard.com/papers/wireguard.pdf">Wireguard-Whitepapers</a> erläutert.</p>

<pre><code>$ wg genpsk &gt; vpn.psk
</code></pre>

<h3 id="wireguard-konfigurationdesvpn-servers">Wireguard-Konfiguration des VPN-Servers</h3>

<p>Es existieren zwei Möglichkeiten Wireguard zu betreiben, man kann mithilfe von <code>wg</code> einen Tunnel
etablieren und Kommunikationspartner (<em>peers</em>) hinzufügen. Alternativ dazu hat man die Möglichkeit eine Konfigurationsdatei zu erstellen,
welche später von <code>wg-quick</code> eingelesen wird. Die zweite Möglichkeit hat den Vorteil, dass sich <code>wg-quick</code> auch gleich um die Erstellung
und Konfiguration der Wireguard-Netzwerkschnittstelle (im Beispiel: <code>wg0</code>) kümmert. Zudem bringt das Debian-Paket auch gleich ein 
Systemd-Interface-Template mit, was ein Start des VPNs erleichtert und keine zusätzlichen Systemd-Kenntnisse erfordert.</p>

<p>Bevor die Konfiguration von Wireguard erfolgen kann, noch einige Worte zur IP-Adresskonfiguration von Hetzner. IPv4-Adressen
werden durch Hetzner per DHCP vergeben, sind aber persistent. IPv6 Adressen werden stattdessen statisch konfiguriert, Hetzner
verwendet dazu auf ihren debian Cloud-Servern die debian <em>networking-scripte</em>. Die IP-Adresskonfiguration findet sich unter:
<code>/etc/network/interfaces.d/50-cloud-init.cfg</code>.</p>

<p>Exemplarisch sind folgende Adressen auf dem Interface <code>eth0</code> konfiguriert:</p>

<pre><code>IPv4: 203.0.113.1/32
IPv6: 2001:db8:ffff:ffff::1/64
</code></pre>

<p>Da Wireguard über das virtuelle Tunnelinterface <code>wg0</code> kommuniziert, müssen, jeweils für IPv4 und IPv6, interne Tunnel-Netze und Adressen
vergeben werden. Für <strong>IPv4</strong> wählt man ein privates Netz gemäß RFC1918, in diesem Beispiel verwenden wir <code>172.16.100.0/24</code>. Dem VPN-Server
wird später die erste Adresse aus diesem Bereich zugewiesen.
Die Adressen aus diesem privaten IPv4-Bereich müssen später noch einer Adressumsetzung auf die öffentliche Adresse <code>203.0.113.1</code> unterzogen werden.</p>

<p>Bei <strong>IPv6</strong> hingegen reicht es aus das öffentliche Netz <code>2001:db8:ffff:ffff::/64</code> zu segmentieren. Zum Beispiel kann man das Netz in
256 Subnetze unterteilen: <code>2001:db8:ffff:ffff::/72</code>. Die IPv6-Adresse auf <code>eth0</code> ändert sich dadurch nicht, lediglich die Netzgröße.
Daher muss diese in der Datei <code>/etc/network/interfaces.d/50-cloud-init.cfg</code> angepasst werden:</p>

<pre><code>#address 2001:db8:ffff:ffff::1/64
address 2001:db8:ffff:ffff::1/72
</code></pre>

<p>Im Anschluss muss die Konfiguration neu eingelesen werden:</p>

<pre><code>$ sudo systemctl restart networking.service
</code></pre>

<p>Das zweite Netz aus dem IPv6-Bereich (<code>2001:db8:ffff:ffff:100:/72</code>) wird für die internen Tunneladressen verwendet.</p>

<p>Die Konfigurationsdatei von Wireguard muss nach dem Wireguard-Interface benannt benannt werden: <code>/etc/wireguard/wg0.conf</code>.
In diesem Beispiel lauscht der Wireguard-VPN-Server auf dem Port <code>upd/443</code> auf <code>eth0</code>. Lediglich die Schlüssel müssen noch ergänzt werden:</p>

<pre><code>[Interface]                                                                                  
Address = 172.16.100.1/24                                                                     
Address = 2001:db8:ffff:ffff:100::1/72                                                       
SaveConfig = true                                                                            
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 443                                                                             
PrivateKey = [vpn-server.seckey]                                   

[Peer]
PublicKey = [mobile.pubkey]
PresharedKey = [vpn.psk]
AllowedIPs = 172.16.100.0/24, 2001:db8:ffff:ffff:100::/72
</code></pre>

<p>Wireguard kann nun mittels <code>wg-quick</code> gestartet werden:</p>

<pre><code>$ sudo wg-quick up /etc/wireguard/wg0.conf
</code></pre>

<p>Sollte der VPN-Server ohne Probleme starten, kann man die Konfiguration mittels Systemd persistent machen:</p>

<pre><code>$ sudo systemctl enable wg-quick@wg0
</code></pre>

<h3 id="dns-auflsungaufdemvpn-server">DNS-Auflösung auf dem VPN-Server</h3>

<p>Die Teilnehmer am VPN-Netzwerk sollen DNS-Anfragen durch den Tunnel an den VPN-Server richten können. In diesem Beispiel wird
<strong>dnsmasq</strong> verwendet, aber auch andere resolver wie unbound können verwendet werden.</p>

<p>Eine exemplarische Konfiguration für dnsmasq (<code>/etc/dnsmasq.conf</code>):</p>

<pre><code># Quad9 - Initiative https://www.quad9.net/
server=9.9.9.9
server=149.112.112.112
server=2620:fe::fe
server=2620:fe::9

listen-address=127.0.0.1,172.16.100.1
bind-interfaces

cache-size=1000
</code></pre>

<p>Neustart von dnsmasq:</p>

<pre><code>$ systemctl restart dnsmasq.service
</code></pre>

<p>Damit DNS-Anfragen an <code>dnsmasq</code> gerichtet werden, müssen auf dem VPN-Server die Nameserver in der Datei <code>/etc/resolv.conf</code>
auf eine Loopbackadresse verweisen. Dazu wird in der Datei <code>/etc/dhclient/dhclient.conf</code> folgende Zeile auskommentiert:</p>

<pre><code>#prepend domain-name-servers 127.0.0.1;
prepend domain-name-servers 127.0.0.1;
</code></pre>

<p>Im Anschluss muss die Konfiguration neu eingelesen werden:</p>

<pre><code>$ sudo systemctl restart networking.service
</code></pre>

<h3 id="wireguard-konfigurationdesclients">Wireguard-Konfiguration des Clients</h3>

<p>Die Datei kann auf einem beliebigen System erstellt werden:</p>

<pre><code>[Interface]
Address = 172.16.100.2/24, 2001:db8:ffff:ffff:100::2/72
PrivateKey = [mobile.seckey]
DNS = 172.16.100.1

[Peer]
PublicKey = [vpn-server.pubkey]
PresharedKey = [vpn.psk] 
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = 203.0.113.1:443
</code></pre>

<p>Diese Datei kann nun als QR-Code kodiert werden und mithilfe der Android-/IOS-App eingelesen werden</p>

<pre><code>$ qrencode -t ansiutf8 &lt; client.conf
</code></pre>
]]></content>
  </entry>

  <entry>
    <title type="html"><![CDATA[certificate update]]></title>
    <link href="https://nachtsieb.de/2019-01-10-cert-update.html"/>
    <published>2019-01-10T16:48:07+01:00</published>
    <updated>2019-01-10T16:48:07+01:00</updated>
    <id>https://nachtsieb.de/2019-01-10-cert-update.html</id>
    <content type="html"><![CDATA[<p>Das neue Zertifikat ist gültig bis zum 15.01.2020.</p>

<p><strong>services:</strong></p>

<ul>
<li>web</li>
<li>jabber</li>
<li>owncloud</li>
</ul>

<p><strong>fingerprints</strong></p>

<p>SHA256: </p>

<pre><code>51:49:8D:68:E8:2E:94:67:33:26:88:D5:14:85:16:60:65:D2:8E:F8:01:48:37:1D:1D:0C:87:6D:B6:89:84:87
</code></pre>

<p>SHA1:</p>

<pre><code>DE:C8:CC:B4:2F:E7:6F:7C:92:1F:5B:B3:53:58:A8:C2:D0:83:03:5B
</code></pre>
]]></content>
  </entry>

  <entry>
    <title type="html"><![CDATA[certificate update]]></title>
    <link href="https://nachtsieb.de/2018-01-14-cert-update.html"/>
    <published>2018-01-14T08:55:57+01:00</published>
    <updated>2018-01-14T08:55:57+01:00</updated>
    <id>https://nachtsieb.de/2018-01-14-cert-update.html</id>
    <content type="html"><![CDATA[<p>Das neue Zertifikat ist gültig bis zum 15.01.2019.</p>

<p><strong>services:</strong></p>

<ul>
<li>web</li>
<li>jabber</li>
<li>owncloud</li>
</ul>

<p><strong>fingerprints</strong></p>

<p>SHA256: </p>

<pre><code>18:44:C1:49:24:32:82:C5:DC:11:C8:23:6E:9C:42:6A:AE:AC:9E:C8:D6:60:B0:4C:CA:19:7D:05:6A:A5:41:03
</code></pre>

<p>SHA1:</p>

<pre><code>5D:E1:83:5F:DD:C9:BF:E4:1E:5D:59:86:57:8E:6D:2D:64:DE:F1:4E
</code></pre>
]]></content>
  </entry>

  <entry>
    <title type="html"><![CDATA[Programmierung in Latex]]></title>
    <link href="https://nachtsieb.de/2017-07-04-latex.html"/>
    <published>2017-07-04T21:13:48+02:00</published>
    <updated>2018-02-20T15:05:51+01:00</updated>
    <id>https://nachtsieb.de/2017-07-04-latex.html</id>
    <content type="html"><![CDATA[<p>In Latex2e ist es möglich simple Programmierung durchzuführen, ohne
das auf eine andere Programmiersprache zurück gegriffen werden muss.
Nichtsdestotrotz unterstütz Latex natürlich eine Fülle an 
Programmierschnittstellen für alle gängigen Sprachen (z.B. Lua, Python,
Perl, Bash …).</p>

<h3 id="dasgrunddokument">Das Grunddokument</h3>

<p>Als Grunddokument dient folgender Aufbau, dass Paket <em>ifthen</em> stellt
grundlegende Kontrollstrukturen, Vergleichsoperatoren und Schleifen
zur Verfügung:</p>

<pre><code>\documentclass[a4paper,10pt]{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage{ifthen}

\begin{document}

...

\end{document}
</code></pre>

<h3 id="einfachefunktionenundvariablen">Einfache Funktionen und Variablen</h3>

<p>Man kann einfache Funktionen definieren, indem man neue Kommandos erzeugt.
Im folgenden Beispiel wird ein Kommando mit zwei Pflichtargumenten erzeugt:</p>

<pre><code>\newcommand{\distanz}[2]{Geben Sie die Distanz zwischen #1 und #2 an!\\\\}
</code></pre>

<p>Das Kommando kann auch noch nachträglich verändert werden:</p>

<pre><code>\renewcommand{\distanz}[3]{Geben Sie die Distanz zwischen #1, #2 und #3 an!\\\\}
</code></pre>

<p>Eine einfache String-Variable wird ebenso angelegt und verändert:</p>

<pre><code>\newcommand{\zielort}{Bonn}
\renewcommand{\zielort}{Berlin}
</code></pre>

<p>Die Funktion kann nun aufgerufen werden:</p>

<pre><code>\distanz{Kiel}{Hannover}{\zielort}
</code></pre>

<p><strong>Ausgabe</strong></p>

<pre><code>Geben Sie die Distanz zwischen Kiel, Hannover und Berlin an!
</code></pre>

<h3 id="ganzzahligevariablen">ganzzahlige Variablen</h3>

<p>Ganzzahlvariablen (auch negativ) heißen in Latex <em>counter</em> und werden
folgendermaßen deklariert und mit einem Wert versehen:</p>

<pre><code>\newcounter{zaehler}
\setcounter{zaehler}{100}
</code></pre>

<p>Der Wert eines <em>counters</em> kann auch inkrementiert werden:</p>

<pre><code>\stepcounter{zaehler}   %zaehler++ -&gt; 101
</code></pre>

<p>Das Addieren und Subtrahieren geht ebenso:</p>

<pre><code>\addtocounter{zaehler}{10}  %111
\addtocounter{zaehler}{-11} %100
</code></pre>

<h3 id="kontrollstrukturenundschleifen">Kontrollstrukturen und Schleifen</h3>

<p>Jetzt kommt das Paket <strong>ifthen</strong> zum Tragen. Es bietet eine if-then-else-Anweisung
und eine while-Schleife. Die Gesamtdokumentation dieses Paketes findet man
<a href="https://ftp.fau.de/ctan/macros/latex/base/ifthen.pdf">hier</a>.</p>

<p>Um lesend auf eine Variable/einen <em>counter</em> zuzugreifen, z.B. für einen Vergleich,
dient folgende Anweisung:</p>

<pre><code>\value{zaehler}
</code></pre>

<p>Möchte man stattdessen den aktuellen Wert als Dezimalzahl ausgeben:</p>

<pre><code>\arabic{zaehler}
</code></pre>

<p>Um die Anwendung der Schleife und der if-Kontrollstruktur zu verdeutlichen dient folgendes
Beispiel:</p>

<pre><code>\newcounter{i}
\setcounter{i}{100}

\whiledo{\value{i} &gt; 0}{
    \noindent Wie viele Flaschen Bier sind noch da?\\
    \addtocounter{i}{-1}

    Es sind noch \textbf{\arabic{i}} Flaschen Bier im Kühlschrank.\\\\

    \ifthenelse{\value{i} = 0}{\textbf{Es ist kein Bier mehr Da!}}

}
</code></pre>

<p><strong>Ausgabe</strong></p>

<pre><code>Wie viele Flaschen Bier sind noch da?
Es sind noch 99 Flaschen Bier im Kühlschrank.

Wie viele Flaschen Bier sind noch da?
Es sind noch 98 Flaschen Bier im Kühlschrank.

...

Wie viele Flaschen Bier sind noch da?
Es sind noch 0 Flaschen Bier im Kühlschrank.

Es ist kein Bier mehr Da!
</code></pre>
]]></content>
  </entry>


</feed>
