Stabile Sessions für offline-fähige Web-Apps mit PouchDB

Oder: Der ewige Kreis – über zirkuläre Abhängigkeiten in Angular

Mit einer kleinen Gruppe von Studierenden entwickele ich im Rahmen von Aam Digital, einem Teilprojekt der Karlsruher Engineers Without Borders die Web-App NGO-DB, die es kleinen NGOs – vor allem unserem Partner H.E.L.G.O. – einfacher machen soll, ihre Daten zu verwalten.

Bei H.E.L.G.O. geht es dabei primär um das erfassen von Daten der Schüler, die das Projekt in Kalkutta fördert. Eine wichtige Anforderung ist hierbei die Offline-Fähigkeit der App, da Internet nicht immer verfügbar ist.

Als technische Basis wurden daher Angular, ein TypeScript-Framework mit Unterstützung für Progressive Web Apps, sowie PouchDB, ein JavaScript-Klon der dokumentenorientierten Datenbank CouchDB, die Features wie Offlinefähigkeit und Synchronisation zur Verfügung stellt, verwendet.

Dieser Blog-Post beschäftigt sich nun mit der Frage, wie eine User-Session von Login über Synchronisation der lokalen Datenbank-Replik bis hin zur Nutzung der Datenbank sinnvollerweise aussehen könnte. Dabei wird die ganz am Anfang des Projekts entwickelte, bestehende Session analysiert, um daraus für die neu zu gestaltende Session zu lernen.

Nebenbei wird es dabei auch in großer Tiefe um zirkuläre Abhängigkeiten in JavaScript-Modulen, bei Dependency Injection sowie zwischen Modulen in Angular gehen und um Strategien, wie diese Abhängigkeiten aufgelöst werden können.

Wer den Post nur für diesen Teil ließt, empfehle ich, direkt hinab zum Spaß zu springen: Zirkuläre Abhängigkeiten. Allen anderen empfehle ich auch gerne die nun folgende Einführung des Gesamtszenarios des Session-Handlings der Applikation.

Die bestehende Session

An der Session sind eine Reihe von Komponenten beteiligt, die in die folgenden Angular-Module aufgeteilt sind:

  • Database: Enthält eine Abstraktion über den Datenbankzugriff, eine Implementierung für eine lokale PouchDB sowie eine Mock-Datenbank. Außerdem ist ein DatabaseManagerService abstrakt und für die beiden Implementierungen enthalten, der den Angular-Provider für die Datenbank selbst hält. Die PouchDB-Implementierung, der PouchDatabaseManagerService hält intern Referenzen auf die lokale und entfernte PouchDB und stellt Methoden zum Login an der entfernten sowie zur Synchronisierung zwischen lokaler und entfernter Datenbank zur Verfügung. Aus prinzipiellen Gründen enthält die lokale Datenbank auch eine Kopie der User mit ihren gehashten Passwörtern.1
  • Entity: Enthält einen simplen EntityMapper zur Benutzung mit unserer Datenbankabstraktion. Andere Module implementieren die abstrakte Klasse Entity um in der Datenbank gespeichert werden zu können.
  • User: Der User ist eine solche Entity, die zudem Methoden zur Prüfung des Passworts beinhaltet.
  • Session: Die Session beinhaltet den SessionService, der alle Bestandteile zusammenhält und schlussendlich verwendet wird, um herauszufinden, welcher User angemeldet ist.

Services

Das folgende UML-Klassendiagramm stellt (etwas vereinfacht) die beteiligten Services und Klassen mit ihren wichtigsten Methoden dar. Gestrichelte Pfeile sind dabei Abhängigkeiten, durchgezogene Pfeile Injections durch Angular.

alles →

Hilfe, die Singularität kommt!

Oder: Warum mein intelligenter Staubsaugerroboter so schnell kein Bewusstsein entwickeln und die Weltherrschaft an sich reißen wird Künstliche Intelligenz ist in den letzten Jahren zu einem unglaublichen Trend geworden – jedes Produkt, das etwas auf sich hält, muss jetzt irgendwie „smart“ sein und Machine Learning beinhalten. Das geht von Smart-TVs über digitale Assistenten bis hin zu Stromspar-Features in den neuesten Versionen von Handy-Betriebssystemen. Und je tiefer sich die intelligente Software in unser Leben verankert, umso lauter werden die kritischen Stimmen, die vor dieser Software warnen, die wir nicht mehr verstehen.
alles →

Von Bäumen, Netzen und Maschinen

Drei Klassifizierungsverfahren

In einem vergangenen Post habe ich bereits über künstliche Intelligenz und maschinelles Lernen im Allgemeinen gesprochen. In diesem Artikel möchte ich nun drei ganz konkrete Verfahren des maschinellen Lernens vorstellen, genauer gesagt drei Klassifizierungsverfahren.

Klassifizierung ist ein Teilbereich des überwachten Lernens, bei dem aus einer Reihe von Eingabe-Ausgabe-Paaren eine Regel abgeleitet werden soll, die Eingabe auf Ausgabe abbildet.1 Diese Lernaufgabe wird im maschinellen Lernen auch „Funktionenlernen aus Beispielen“ genannt,2 die gelernten Regeln häufig „Modelle“. Bei den Eingabedaten spricht man auch von „feature variables“ oder einem Merkmalsvektor, bei den Ausgabedaten von „target variables“,3 die im Falle von Klassifizierung aus einer endlichen Wertemenge aus zuzuordnenden „Klassen“ oder „Labels“ stammen.1

Klassifizierungs-Algorithmen bestehen in der Regel aus drei Phasen: In einer Lern- oder Trainingsphase werden Regeln aus Beispielen (beschriftete Daten aus Eingabedaten mit zugeordneten Ausgabedaten), auch Trainingsdaten genannt, abgeleitet. Diese Regeln werden in einer Test- oder Validierungsphase auf andere, ebenfalls beschriftete Daten angewendet, damit geprüft werden kann, wie gut die gelernten Regeln bei anderen Eingabewerten funktionieren.3 Danach können die so trainierten Klassifikatoren in der praktischen Anwendung auf neue, unbeschriftete Daten angewendet werden. Dies ist ein Thema, mit dem sich die Literatur in der Regel nicht mehr beschäftigt.

Im Folgenden sollen drei großen Gruppen der Klassifizierungs-Algorithmen sowie ihre jeweilige Funktion beschrieben werden. Zuvor soll jedoch noch ein wichtiges allgemeines Konzept der Klassifizierung eingeführt werden. Lösungen für Klassifikationsaufgaben haben immer das Risiko der Überanpassung (englisch „Overfitting“), bei der die Entscheidungs-Regeln zu stark auf die Trainingsdaten angepasst wurden und somit bei den Validierungsdaten und damit in der späteren praktischen Anwendung nicht ausreichend gut funktionieren.

We will say that a hypothesis overfits the training examples if some other hypothesis that fits the training examples less well actually performs better over the entire distribution of instances.4

alles →

Tote Mädchen lügen

Über die zweite Staffel der Serie „13 Reasons Why“

Thirteen Reasons Why, bzw. in der deutschen Übersetzung „Tote Mädchen Lügen nicht“, ist ein 2007 erschienener Roman von Jay Asher. Die Handlung des erfolgreichen Jugendbuchs dreht sich um den Selbstmord der High-School-Schülerin Hannah Baker, die vor ihrem Tod die 13 Gründe für ihr Handeln auf Audiokassetten aufgenommen und mit dem Auftrag, sie den jeweils angesprochenen Personen der Reihe nach zukommen zu lassen, in Umlauf gebracht hat. Die Leser begleiten dabei den Ich-Erzähler und Klassenkameraden Hannahs Clay Jensen, der im Verlauf des Buches die Kassetten anhört und somit nach und nach erfährt, was Hannah zugestoßen ist.

Diese erzählerische Konstruktion bietet Raum für den Spannungsbogen des Buches. Die Leser werden nicht nur langsam immer weiter in den Strudel bis hin zur Vergewaltigung eskalierender Ereignisse gezogen, sondern haben eingangs mit Clay auch eine positive Identifikationsfigur mit ungewisser Geschichte: Es ist unklar, warum auch er die Kassetten erhalten hat, was ihn zu einem der 13 Gründe für den Selbstmord machen würde. Der Inhalt der Kassetten erzählt rückblendenartig die Geschichte um Hannah und lüftet die Geheimnisse um ihren Tod, während Clays Handlung in der Gegenwart auf das Gesagte unmittelbar (emotional) reagieren und es somit für die Leser weiter kontextualisieren kann. Die Frage, die sich dabei immer wieder stellt: Hätte man das alles früher erkennen und den Selbstmord vielleicht verhindern können?

Das Buch polarisiert seine Leser. Vielfach (z.B. hier und hier) werden die vielschichtigen Charaktere gelobt, und dass das Buch keine schlichte Schwarz-Weiß-Malerei der Situation betreibt, sondern stattdessen die Thematik als so komplex präsentiert, wie sie eben ist. Allerdings wird auch vor der Wirkung des Buches gewarnt: Stellt es den Selbstmord als zu heldenhaft dar und ermutigt damit eventuell weitere Jugendliche zum Suizid? Sollten Leser von den gewalttätigen Szenen klarer im Voraus gewarnt werden? Dem Erfolg des Romans tat das jedoch keinen Abbruch.

Die Serie

Knapp 10 Jahre nach seiner Veröffentlichung wurde der Roman in Form einer Mini-Serie auf Netflix verfilmt. Die Kritik am Umgang mit der behandelten Thematik entbrannte dadurch natürlich erneut, auch wenn sich die Macher mit Hinweisen auf dargestellte Gewalt und wiederholte Verweise auf Selbstmord-Hotlines der Kritik stellen. Aus meinem ganz persönlichen Umfeld konnte ich jedoch mitnehmen, dass die Serie im Großen und Ganzen als sehr positiv aufgefasst wurde. Das liegt in weiten Teilen sicherlich an der guten handwerklichen Umsetzung – die Serie ist hochwertig produziert und die Charaktere sind gut besetzt. Es liegt aber auch in nicht weniger großem Umfang an der Umsetzung der erzählerischen Struktur des Romans in filmischer Form.

Die Erzählweise des Buches wird nämlich schnell zu einer Herausforderung bei der Verfilmung: Erzählt man die Handlung wie im Buch aus der Sicht von Clay, hat man ein recht statisches Setting, in dem man jemanden beobachtet, der sich (quasi) ein Hörbuch anhört – filmisch nicht besonders spannend, insbesondere weil auch die Abwechslung zwischen den einzelnen Folgen der Serie fehlen würde. Die mehrteilige Erzählung ist jedoch nötig, um jeden Grund für den Selbstmord in entsprechender Tiefe aufarbeiten zu können: Ein zweistündiger Film zum Beispiel hätte jeder Seite der Kassetten nur weniger als 10 Minuten einräumen können.

alles →

Heimkehr nach Seriphos

   „Es ist eine Metapher, verstehst du?“
   „Bist du sicher? Glaubst du nicht, dass die Dinge nicht manchmal einfach genau das sind, was sie sind?“
   Ein warmer Sommerwind weht über den Hügel.
   „Ich habe schon lange nicht mehr einfach so die Sterne beobachtet.“
   „Danke, dass du mit mir hier bist, ihr Leuchten zu sehen.“


Ebenfalls erschienen im Neologismus 18-09