Wilkommen!

Ich bin Martin HĂ€cker, ein Softwareentwickler mit 23 Jahren Erfahrung. Ich kann bei allen Aspekten der professionellen Softwareentwicklung unterstĂŒtzen.

In meinem Blog geht es um Software, Liquid Democracy, Go / Baduk / Weiqi, Kochen, Chor-Singen, Bouldern, Billiard, Gleitschirmfliegen, Kiten, Jonglieren und eben alles was mich interessiert. Schau dich um, benutze meinen Code und abonniere meinen Feed, um mein Blog bequem in einem Reader zu lesen.

WĂ€hrend meine Webseite zweisprachig ist, sind meine Blog-Posts in der Regel einsprachig deutsch oder englisch.

Neueste EintrÀge:

Was sagt mir ein Covid-Schnelltest Ergebnis?

written by Martin HĂ€cker on

Inspiriert von diesem Video von 3Blue1Brown, hat sich mein VerstĂ€ndnis wie man ĂŒber Covid-Tests nachdenkt, grundsĂ€tzlich gewandelt.

Zwar war mir schon sehr lange Bewusst, dass Test-Ergebnisse kontra-intuitiv sein können, weil sie eben auch Gesunde als krank erkennen können.

Das ist einfach nachzuvollziehen, wenn man einen Covid-Schnelltest anschaut. Die GĂŒte dieser Tests wird fast immer mit zwei Zahlen angegeben: SensitivitĂ€t (wie viele der tatsĂ€chlich Kranken werden erkannt) und SpezifizitĂ€t (wie viele der Gesunden werden auch als Gesund erkannt). Nehmen wir an unser Test hat jetzt 90% SensitivitĂ€t und 90% SpezifitĂ€t (fiktive Zahlen fĂŒr leichteres Rechnen - echte Zahlen kommen spĂ€ter).

Wende ich diesen Test jetzt auf 100 menschen in einem Land an, das Zero-Covid hat. Dann sollten trotzdem 10 Personen als Krank gemeldet werden. Was heißt das jetzt? Logischerweise nix, denn es sind ja alle Gesund.

Gehe ich stattdessen ins Krankenhaus auf die Covid-Station und mache den Test dort mit 100 Personen, dann sollten trotzdem 10 Personen als Gesund gemeldet werden. Was heißt das jetzt? Logischerweise auch nix, die Leute sind ja schon wegen Covid in Behandlung und nicht durch den Test plötzlich gesundet.

Und das ist die wichtige Denk-Änderung die 3Blue1Brown in seinem Video motiviert - man muss beim nachdenken ĂŒber Testergebnisse einfach immer auch darĂŒber nachdenken wie wahrscheinlich es ist das man tatsĂ€chlich Krank ist. (Bayes lĂ€ĂŸt grĂŒĂŸen)

Und jetzt kommt der Dreh - alles wird viel einfacher, wenn man von vorne herein nicht denkt dass der Test mir sagt ob ich gesund oder Krank bin, sondern:

Jeder Test hat ein Vorhersagekraft, und dieser Faktor verÀndert meine Wahrscheinlichkeit Krank zu sein.

Es wÀre also viel Einfacher, wenn man bei Tests nicht SensitivitÀt und SpezifizitÀt angibt, sondern daraus die Vorhersagekraft des Tests berechnet. Damit kann man dann nÀmlich plötzlich viel einfacher Denken und verstehen. Und insbesondere ist es viel einfacher eine 'Vorhersagekraft' nicht mit 'Wahrscheinlichkeit das ich Krank bin' zu verwechseln, was einfach jeder tut der sich mit dem Thema nicht intensiv auseinander setzt.

Und das beste: Wenn man nicht in Prozent, sondern in VerhÀltnissen rechnet, dann ist das sogar prÀzise!

Wie kommt man jetzt auf diese Vorhersagekraft (auch Bayes Faktor genannt)

Jeder Test ist durch zwei Zahlen (SensitivitÀt[welcher Anteil der Kranken wird erkannt], SpezifitÀt[welcher Anteil der Gesunden wird als Gesund erkannt]) bzw. durch die Komplemente davon (Falsch-Negativ-Rate, Falsch-Positiv-Rate) bestimmt.

Interessiert man sich jetzt fĂŒr die Frage was ein Positiver-Test aussagt, kann man aus dem Quotient von SensitivitĂ€t geteilt durch Falsch-Positiv-Rate die Vorhersagekraft eines Positiven Tests und aus dem Quotient von Falsch-Negativ-Rate geteilt durch SpezifitĂ€t die Vorhersagekraft eines Negativen Tests erhalten.

Ein Beispiel: Angenommen ein Test hat SensitivitĂ€t 90% und SpezifitĂ€t 95% (also Falsch-Negativ-Rate 10%, Falsch-Positiv-Rate 5%). Dann ist die Vorhersagekraft eines Positiven Tests 90%/5%=18. Das heißt, wenn ich einen Positiven Test habe, dann weiß ich, dass sich die Wahrscheinlichkeit das ich Krank bin 18 mal vergrĂ¶ĂŸert hat zu dem wie sie vorher war. Und umgekehrt: Ein Negativer Test 10%/95%≈  1/10. In Worten: Ein Negativer Test verkleinert meine Chance krank zu sein um etwa eine GrĂ¶ĂŸenordnung.

đŸ€Ż

Rechnet man in Prozent ist das leider nur eine AbschÀtzung, aber wenn man das ganze in Chancen) rechnet wird aus der AbschÀtzung eine prÀzise Formel!

đŸ€Ż đŸ€Ż

Schauen wir also mal auf ein paar reale Zahlen an.

In Berlin (stand 13. Mai 21, sind nach Pavels Covid Tabelle) derzeit einer von 394 Personen Ansteckend.

FĂŒr einen Covid-Test den ich gerade da habe findet sich hier eine SensitivitĂ€t ~93,5% und SpezifitĂ€t ~98%.

Die Vorhersagekraft eines Positiven Tests ist 93,5%/2% ~47. Demnach wĂ€chst meine Chance heute ansteckend zu sein von 1/394 um das fast fĂŒnfzigfache auf etwas mehr als 1/4.

Die Vorhersagekraft eines negativen Tests ist 6,5%/98%~0,06. Demnach wĂ€chst meine Chance Gesund zu sein um fast zwei GrĂ¶ĂŸenordnungen von 1/394 auf etwa 6,5/38.612.

Oh wie schön wĂ€re es, wenn das auch ĂŒberall so kommuniziert wĂŒrde


Open Source Flugelektronik 2 - BLE und Serial

written by Martin HĂ€cker on

Langsam nĂ€here ich mich meinen Soft-RF-GerĂ€ten an. Ich kann jetzt auch ĂŒber Bluetooth Low Energy (BLE) mit dem GerĂ€t reden. Das Python Framework Bleak war dabei unglaublich hilfreich, da ich fast den ganzen BLE-Code sehr plattform-neutral Scheiben kann. I.e. der Code ist zwar nur auf MacOS getestet, wird aber sehr wahrscheinlich auch unter Linux funktionieren. Der Code zu diesem Post liegt auf github.

Wie lÀuft das jetzt? Zuerst braucht man einen BLE-Scanner, um die Adresse des GerÀts zu finden. Bei mir sieht das so aus:

% ./ble_scanner.py
........................................
[...]
0975FAB7-6F50-4B60-A0D8-9F11C817FB6D: SoftRF-f0c010-LE
[...]

Mit dieser Adresse kann man dann reden um sich anzuschauen welche BLE-Services sie anbietet:

% ./ble_explore_device.py 0975FAB7-6F50-4B60-A0D8-9F11C817FB6D
Connected: True
[Service] 0000ffe0-0000-1000-8000-00805f9b34fb (Handle: 40): Vendor specific
    [Characteristic] 0000ffe1-0000-1000-8000-00805f9b34fb (Handle: 41): Vendor specific (read,write-without-response,notify), Value: b',,,,,,,,,99.99,99.99'
        [Descriptor] 00002901-0000-1000-8000-00805f9b34fb (Handle: 43): Characteristic User Description) | Value: b'HMSoft'
        [Descriptor] 00002902-0000-1000-8000-00805f9b34fb (Handle: 44): Client Characteristic Configuration) | Value: b'\x00\x00'

Was heißt das? Das gerĂ€t bietet den Service 0000ffe0-* an und darauf eine Characteristik 0000ffe1-* die wiederum zwei Deskriptoren enthĂ€lt. 00002901-*und 00002902-*. Nicht das ich BLE vollstĂ€ndig verstehe, aber zumindest weiß ich das ein Service der GrundsĂ€tzliche BehĂ€lter fĂŒr alle BLE Interaktionen ist und eine Charactreristik einen lese und schreibbaren Wert darstellt. Deskriptoren können darin verschachtelt sein und sind entweder zusĂ€tzliche lese und schreibbare Werte oder haben einen technischen Sinn. In diesem Beispiel ist der zweite Descriptor notwendig um auf der Charakteristik nicht nur lesen und schreiben, sondern auch Notify zu implementieren -> und das braucht es fĂŒr die Serielle Schnittstelle.

Entscheidend ist hier die Service-Charakteristik 0000ffe1-0000-1000-8000-00805f9b34fb Hier spielt die ganze Musik. Die Serielle Ausgabe des SoftRF kann man mittels Notify davon auslesen und man kann auf die Serielle Schnittstelle schreiben indem man darauf schreibt. Soweit so simpel. Und damit kriegt man auch schon ein sehr primitives UART hin:

% ./ble_uart.py 0975FAB7-6F50-4B60-A0D8-9F11C817FB6D
Connected, start typing and press ENTER...
0.00,0000.0000,N,00000.0000,E,0,00,100.0,0.0,M,0.0,M,,*5C
$GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30
$PFLAU,0,0,0,1,0,,0,,,*4F
$GPRMC,,V,,,,,,,,,,N*53
$GPGGA,000000.00,0000.0000,N,00000.0000,E,0,00,100.0,0.0,M,0.0,M,,*5C
$GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99$PFLAU,0,0,0,1,0,,0,,,*4F
$GPRMC,,V,,,,,,,,,,N*53
$GPGGA,000000.00,0000.0000,N,00000.0000,E,0,00,100.0,0.0,M,0.0,M,,*5C
$GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30
$PFLAU,0,0,0,1,0,,0,,,*4F
$GPRMC,,V,,,,,,,,,,N*53

Yay!

NĂ€chste Tasks: das NMEA Encoding verstehen und mal schauen ob ich damit eine erste simple Visualisierung hinbekomme.

Open Source Flugelektronik mit Lora

written by Martin HĂ€cker on

Inzwischen gibt es mehrere Projekte die Lora Funktechnik fĂŒr Ad-Hoc-Netzwerke in der Luft (und am Boden) verwenden.

SoftRF ist vermutlich das bekannteste, da es mit gĂŒnstiger Hardware eigentlich alle Standards unterstĂŒtzt. Dieses fĂŒr in der Luft und und dieses als GegengerĂ€t am Boden und fĂŒr Experimente - jeweils in der in Europa zugelassenen 868Mhz Variante - habe ich mir besorgt, da sie nur jeweils ~25€ Kosten.

SoftRF kommt darauf sogar schon vorinstalliert, das ist wirklich sehr komfortabel.

In Betrieb lassen sich die GerĂ€te auch ganz gut nehmen, einfach via USB an den Rechner anschließen, bei dem einen geht dann ein WLAN auf ĂŒber das man es Konfigurieren kann, bei dem anderen hat man direkten Zugriff ĂŒber die serielle:

$ pip install pyserial
$ python -m serial.tools.list_ports
[...]
$ python -m serial.tools.miniterm /path/to/port

Konfigurieren kann man das GerĂ€t dann ĂŒber eine Config-String, den man in diesem Web-Interface generieren kann.

Easy peasy.

Next Tasks:

  • NMEA Nachrichten Parsen und lesbar Ausgeben
  • Das zweite GerĂ€t ĂŒber Bluetooth Low Energy verbinden
  • BLE mit einem meiner Flug-Computer-Smartphone Apps verbinden - FlySkyHy oder eVario
  • Herausfinden was es braucht um da noch einen guten Barometrischen Sensor mit einzubauen
Weitere BeitrÀge