beeksnieder.dev

Projekte

Was ich gebaut habe

Vier Dinge, an denen ich gerade sitze — mit dem, was technisch dahintersteckt und was dabei schiefgegangen ist.

wsFloh — Flohmarkt-Helfer

Flutter (Android, Windows) · Node.js · SQLite · mehrere Preis-APIs

Man steht auf dem Flohmarkt vor einer Kiste Schallplatten oder einem anderen Gegenstand und hat keine Ahnung, ob der geforderte Preis in Ordnung ist. wsFloh beantwortet genau das: Foto machen, und die App sagt, worum es sich handelt und was vergleichbare Stücke zuletzt gekostet haben.

Architekturdiagramm von wsFloh: App, Backend, Bilderkennung und Preisquellen
Der Weg eines Fotos: von der App über die Bilderkennung zu den Preisquellen, die je nach erkannter Kategorie unterschiedlich ausfallen.

Wie es funktioniert

Das Foto geht an eine Bilderkennung, die daraus eine strukturierte Beschreibung macht: Kategorie, Hersteller, eine Kurzbezeichnung, mit der sich der Gegenstand auf Handelsplattformen wiederfinden lässt. Diese Kurzbezeichnung ist der eigentliche Knackpunkt: Sie muss so formuliert sein, wie jemand suchen würde, der das Objekt schon kennt. Dazu gebe ich der Antropic KI konkrete Vorgaben in welchem Format die Beschreibung zurückkommen soll.

Anschließend fragt das Backend die passenden Preisquellen ab. Welche das sind, hängt von der Kategorie ab. Schallplatten und CDs gehen an Discogs, Magic-Karten an Scryfall, Videospiele und LEGO-Sets an PriceCharting und BrickLink, alle Kategorien an SoldComps für verkaufte eBay-Angebote. Welche Quelle für welche Kategorie aktiv ist, lässt sich in der App umschalten.

Wie die App aussieht

Zwei Einträge aus der laufenden App: links eine Keramikvase, rechts eine Schallplatte. Bei der Vase gibt es keine Datenbank mit Katalognummern, also bleiben nur verkaufte eBay-Angebote als Vergleich. Bei der Platte kommt Discogs dazu. Gut zu sehen ist auch, warum die Ersteinschätzung der Bilderkennung nicht das Ergebnis ist, sondern nur der Einstieg: Bei der Platte schätzt sie 90 Euro, der Markt sagt 26. Die finale Einschätzung liegt immer noch in meiner Verantwortung, das Tool bündelt nur die Informationen.

Keramikvase · nur eBay als Quelle
Schallplatte · Discogs und eBay

Was dabei interessant war

MP3-Werkzeugkasten

Python · SQLite · Discogs-Datendump · diverse APIs

Angefangen hat es mit einer einzigen Frage: welche Alben meiner Bands fehlen mir eigentlich? Daraus ist ein gutes Dutzend Skripte geworden, die sich gegenseitig füttern: vom Scan der Sammlung über den Abgleich mit Discogs bis zum monatlichen Newsletter mit Neuerscheinungen, Konzertterminen und Nachrichten.

Datenflussdiagramm des MP3-Werkzeugkastens
Wie die Skripte zusammenhängen: links der Scan der eigenen Sammlung, rechts der Discogs-Dump, in der Mitte die Auswertungen und ganz unten der Newsletter, in dem alles zusammenläuft.

Der Kern: die eigene Sammlung gegen Discogs abgleichen

Ein Scanner läuft rekursiv über die MP3-Sammlung und baut einen Katalog: Interpret, Album, Titel. Auf der anderen Seite steht der offizielle Discogs-Datendump.

In der ersten Fassung wurde dieses XML bei jedem Lauf neu durchgestreamt. Das dauerte Minuten, und so einen Abgleich macht man nicht einmal, sondern ständig wieder. Also baut ein eigenes Skript daraus einmalig einen indizierten SQLite-Index. Dieser Aufbau kostet genauso lange wie ein kompletter Durchlauf, aber jeder Lauf danach ist nur noch eine indizierte SQL-Abfrage statt mehrerer Gigabyte Streaming.

Was daraus noch gewachsen ist

Wie der Newsletter aussieht

Farbschema und Layout sind unabhängig voneinander wählbar und werden beim Erzeugen der Mail kombiniert. Unten stehen drei von 150+ dieser Kombinationen, gefüllt mit zufälligen Bands.

Mitternacht · Poster
Fanzine · Fanzine
Sterne · Cards

Zwei Fallen, die Zeit gekostet haben

Bandnamen sind mehrdeutig. Die Nachrichtensuche nach „Ash Borer" liefert vor allem Meldungen über einen Schädlingskäfer. Zwei Filter beheben das: ein angehängtes „(Band OR Music)" und eine Whitelist von Musik-Nachrichtenseiten. Bemerkenswert dabei: die Whitelist wirkt als Filter nach der Suche besser als eine Einschränkung innerhalb der Suchanfrage, weil letztere die Relevanzgewichtung des Bandnamens verschlechtert.

Ortsnamen auch. Berlin gibt es in den USA, Las Vegas in Honduras. Die Auflösung bevorzugt deshalb zuerst Deutschland, dann Europa, dann den bevölkerungsreichsten Treffer.

Fossilienalarm

Python · OpenWeatherMap · SQLite

Fossilien findet man nicht bei schönem Wetter. Man findet sie, nachdem Regen und Wind die Fundstellen abgetragen haben. Erosion legt frei, was vorher im Hang steckte.

Das Skript prüft an mehreren hinterlegten Orten das aktuelle Wetter und schickt eine Mail, sobald Niederschlag und Wind über den eingestellten Schwellwerten liegen. Die Messwerte landen in einer SQLite-Datenbank.

Wie eine Alarmmail aussieht

Von den vier Projekten hier ist das am wenigsten weit. Die Mail unten stammt aus einem Testlauf mit erfundenem Ort und erfundenen Schwellwerten.

Alarmmail · Testlauf

Der Server dahinter

Ubuntu 24.04 · nginx · systemd · Let's Encrypt

Beide Anwendungen und diese Seite laufen auf einer eigenen virtuellen Maschine. Vorher hatte ich mit Linux nie ernsthaft gearbeitet, entsprechend war das Einrichten selbst ein Projekt: Benutzer und SSH-Schlüssel, Firewall, beide Dienste als systemd-Units, nginx als gemeinsamer Eingang, Zertifikate über Let's Encrypt.