Da ich gerne wissen wollte, was ich eigentlich so bei Amazon bestelle und das verlinkt mit den Transaktionen in Firefly speichern wollte, brauchte ich einen Weg um die Daten herauszubekommen. Leider hat Amazon dafür natürlich keine API, also suchte ich etwas halb-automatisches und bat, mal wieder, Claude um Hilfe. Mein Prozess ist nun folgendermaßen:
Mittlerweile hat Amazon zum Glück die Order-ID mit in der Kreditkartenabbuchung drin. Daraus erzeugt mir Firefly automatisch den Link zu den Bestelldetails: https://www.amazon.de/gp/css/summary/edit.html?orderID=$orderId
Ich drücke mein von Claude erzeugtes Bookmarklet1, dass mir ein JSON in die Zwischenablage speichert, in dem alle Daten drin sind
Ich packe das JSON ins Notizfeld der Transaktion und Firefly erstellt daraus automatisch die entsprechenden Produkte und verlinkt sie damit.
Das dauert pro Transaktion so drei Sekunden und funktioniert schon ein paar Wochen. Sollte Amazon das Markup ändern, ist es sicher auch schnell gefixt.
Auf der Suche nach weiteren versteckten persönlichen Blogs wie meinem, wurde ich mal wieder von Jan auf den UberBlogr-Webring aufmerksam gemacht, bei dem ich mich auch direkt mal angemeldet habe. Ich werde mich da die nächsten Tage mal durchklicken!
Immer wenn ich so Rezept-Ausprobier-Videos auf Youtube gucke, finde ich zwar meistens ein paar Sachen lecker, vergesse es aber auch sofort. Diesmal habe ich es tatsächlich geschafft mir etwas, wait for it, aufzuschreiben (also um genau zu sein machte ich einen Screenshot) und daher gelang es mir heute tatsächlich dieses Gericht aus der New York Times nachzukochen. (Ich sah es in diesem Video von Fabi)
Es besteht aus drei Teilen:
Einer Basis aus Cashewmus und Seidentofu, was unglaublich lecker schmeckt, dafür dass es nur zwei Zutaten (+ Salz / Pfeffer) sind
Gebackener Brokkoli mit Sojasauce (ich hab ihn erst kurz gekocht, damit es im Ofen schneller geht)
Eine Mischung aus gehackten Cashews,Panko (ich nahm normales Paniermehl) und knusprigem Chili-Öl, was ich endlich mal schaffte zu kaufen.
Wer viel baut, wirft auch viel weg, das kennt man ja auch von Google. Wer trauert nicht Wave oder Reader hinterher. Schrecklich.
Ähnlich wie Google habe ich in den letzten Jahren ein paar Sachen gebaut, bei denen sich gezeigt hat, dass sie am Ende zu wenig Nutzen und Nutzer (nämlich null, statt wie erwartet einen) haben und damit abgeschaltet werden müssen, um nicht weiterhin Mental- und CPU-Load zu verbrauchen. Hier eine Liste aktueller Einstellungen, die niemanden außer mir betreffen:
logsock
Ich wollte einen kleinen Service, dem ich leicht Events schicken kann, die ich dann per Push-Notification bekomme. Funktionierte an sich gut, der einzige Nachteil war, dass diese Web Push-Geschichte unter iOS leider nicht ganz so zuverlässig funktioniert. Irgendwann geht etwas nicht mehr und man bekommt einfach keine Notifications mehr, bis man die Web-App mal neu installiert. Das ist natürlich dumm. Abgelöst wurde das Thema jetzt von meinem Matrix-Server, dem ich ähnlich leicht Dinge schicken kann.
mey
Mein Ersatz für last.fm und so. Lief eigentlich ganz gut im Hintergrund und hat sich meine History von Spotify gezogen und angezeigt, aber einerseits hatte ich nie die Energie meine alten Exports von last.fm korekt zu importieren (So Song-Namen wie “Intro” machten aufgrund der Export-Datenstruktur immer Zuordnungsprobleme) und andererseits ging mein Interesse für die Daten nie über ein “ja, das ist jetzt aber ganz witzig das zu haben” hinaus. (Ich hab auch hier mal darüber gebloggt, aber mein interaktives Tool geht natürlich nicht mehr)
Doch das größte Problem in diesem Zusammenhang ist wahrscheinlich, dass ich aktuell leider weniger Musik höre, da Podcasts und Hörbücher schon meine Ohren beanspruchen und wenn, dann mache ich das wohl auf Youtube.
Mey kann also wohl erstmal Weg und in 60 Jahren wieder ausgegraben werden, wenn ich nochmal wissen will, wie oft ich “Mach die Augen zu” von die ärzte hörte.
cms
Äh ja, ich hab tatsächlich mal angefangen eine Art CMS / Bloggingsystem zu bauen. Ich wollte etwas für pwa.io und philipps.photos, was perfekt an die jeweiligen Seiten angepasst ist um dort so schnell und friktionslos wie möglich Inhalt veröffentlichen können. Tatsächlich gab ich das schon relativ schnell auf und integrierte die beiden Seiten einfach hier in den Kirby-Blog. Tatsächlich habe ich seit dem auf beiden Seiten nichts veröffentlicht, haha.
serenity
Damals schnell angefangen, weil mir Firefly III nicht so richtig gefallen hat. Leider habe ich es nicht fertig gemacht, also auch nicht wirklich benutzt. Die Daten in Firefly wuchsen weiter an und dank Claude kann ich es mir ja jetzt so anpassen, wie ich es will, ohne, dass ich eine komplette Neuentwicklung machen muss.
Das waren jetzt nur die Projekte, die ich tatsächlich auch mal deployed und kurz benutzt habe. Dazu kommen natürlich noch tausend, die nichtmal ein git init gesehen haben und schon voher abgesägt wurden, aber daran erinnere ich mich natürlich auch nicht mehr.
Nachdem in den letzten Monaten mein Youtube voll war mit n8n-Tutorials habe ich es mir über Weihnachten doch mal installiert, das geht ja ganz fix und auch ausprobiert. Mein “Problem” war bisher ja immer, dass ich gar keine Ahnung hatte, was ich jetzt dringend noch automatisieren muss. Ich hab zwar ein paar Dinge, die laufen, aber das Zeug läuft ja, dafür muss ich ja jetzt nichts Neues installieren.
Nachdem ich meinen Matrix-Server aufgesetzt hatte, hatte ich aber doch kurz die Idee, mir vielleicht so einen Bot zu bauen, der mir morgens die wichtigsten Infos zum Tag schickt. Warum auch nicht. Im Großen und Ganzen handelt es sich dabei um Sonnenauf- und Untergang und das Wetter. Ja, äh, sehr spannend.
Am Anfang war ich schon relativ überrascht, wie einfach und geschmeidig das alles funktioniert. Quasi, wie in allen Tutorials. Dann wurde es allerdings doch kurz frustrierend. Als alter Programmierer, dachte ich, ich lege die ganzen Tasks, die Daten sammeln (Wetter, Sonnenaufgang) parallel an und werfe die ganzen Outputs dann in die “Schick eine Nachricht bei Matrix”-Node und er kümmert sich schon um die Concurrency.
Leider wurde ich da anscheinend enttäuscht. Zum Ersten braucht man, wenn man mehrere Sachen parallel anlegt am Ende Noch “Merge”-Nodes, die Sachen zusammenführen und außerdem führt er den Kram gar nicht parallel aus, sondern einfach nacheinander. Vielleicht bin ich etwas dumm, aber ich hab noch keinen Weg gefunden, dass er mehrere Sachen gleichzeitig macht.
Nach ein bisschen herumprobieren hatte ich es aber geschafft und mittlerweile bekomme ich seit mehr als zwanzig Tagen jeden morgen eine Nachricht von meinem Matrix-Bot und weiß endlich, wann die Sonne aufgeht. Toll!
Da mir das ständige Eintauchen in die Docker-Container, um mal eben die laravel.log zu öffnen etwas nervte, suchte ich schon seit ein paar Woche nach einem guten, zentralen, Errorlog-Tool. Der Platzhirsch wäre natürlich Sentry, aber das habe ich vor zehn Jahren schon probiert und natürlich war es ein Pain es zu installieren. Als einzelner Entwickler von ein paar Quatschprojekten, brauche ich auch 99% der Features gar nicht. Ich recherchierte also mal nach ein paar Alternativen und präsentiere hier meine Findings, nach dem ich mich mit jedem der Tools zwischen zehn Sekunden und zwei Stunden beschäftigte.
Meine Anforderungen waren die folgenden:
Leicht zu installierende Self-Hosting-Variante mit möglichst kleiner docker-compose-Datei.
Kompatibel zum Sentry-SDK, damit man es überall einfach einbinden kann
Sieht ganz spannend und leichtgewichtig aus, kostet aber 250$, was mir etwas zu teuer ist. Aber an sich natürlich ein nettes Finanzierungsmodell, das ich vielleicht nochmal anschauen werde, wenn ich sowas für Projekte brauche, die auch Geld bringen.
Ein Produkt aus den Niederlanden von einem Solo-Dev. Sehr sympathisch. Die docker-compose-Datei ist übersichtlich und enthält nur Postgres und die Bugsink-App. Ich hab es also eben gestartet, eine App angebunden, einen Fehler gesendet und es funktioniert. Es ist jetzt nicht das schönste Tool auf dem Planeten, aber sieht auch nicht schlimm aus.
Die einzigen zwei Problemchen: Man kann keinen Open ID-Provider einbinden und Notifications für die Errors gehen auch nur per E-Mail raus.
Das wurde mir unter anderem letztes Jahr schon von Daniel empfohlen und die Webseite sieht ganz ganz cute aus. Die Compose-File war mir im ersten Moment etwas viel, da neben Postgres auch noch valkey und zwei weitere Services inkludiert waren, daher legte ich es erstmal zur Seite und probierte Bugsink.
Allerdings kann Glitchtip Login via Open ID und das ist ein Punkt der dafür spricht, es zu verwenden. Ich startete es also, probierte aus ob Events ankommen und freute mich! Die Open ID-Anbindung an Authentik funktionierte auch problemlos.
Update: Ich fand gerade heraus, dass man auch Notifications per Webhook verschicken kann und nicht nur per E-Mail, supi!
Ich werde nun also mal die nächsten Monate schauen, wie es sich so schlägt!
🧼 Sauber: Letzten Sonntag vermisste ich meinen rechten Airpod. Nach etwas überlegen fiel mir ein, dass ich nach dem Mittagessen die Tischdecke schnell zusammenlegte und in die Waschmaschine packte, weil da ein frischer Fleck war. Die Tischdecke. Mit dem etwas wirren Muster. Schnell zusammengelegt. Aaaah. Ein Blick auf die Waschmaschine offenbarte, was ich mir schon dachte: Der Airpod ist jetzt sauber. Eine Nacht in Basmati-Duftreis gebettet später funktioniert er allerdings wie am ersten Tag!
🧺 Aufgeräumt: Wie schon in den letzten Jahren habe ich zum Jahreswechsel meinen aktuellen Dev-Ordner entsorgt und einen ganz frischen angelegt. Es ist immer wieder ein gutes Gefühl im neuen Jahr ohne die ganzen Ordner mit Tests und alten Projekten aus dem Vorjahr zu starten.
⬆️ Upgedated: Livewire 4 und Filament 5 sind raus! Da ich jetzt, dank Claude, alle meine Projekte auf dem aktuellen Stand habe, kann ich da jetzt auch direkt updaten und die neusten Features genießen!
🗓️ Täglich: Die nächste Woche mit täglichem Bloggen ist erledigt. In so einer normalen Arbeitswoche wird es aber schon anstrengend, das muss ich sagen, aber auch, weil ich mir das Ziel setzte meistens wirklich was zu schreiben, und nicht nur einen Link oder ein Musikstück zu posten. Ich werde mal sehen, wie es sich in der nächsten Woche entwickelt und ob der Spaß nachlassen wird.
🏚️ Un-Smart: Diese Woche habe ich mich noch etwas mit meinen Switchbot-Plugs herumgeärgert. Ich kaufte die, weil sie günstig waren, aber sie sind echt nicht so gut angebunden, da die SwitchBot Cloud-Integration echt panne ist (super langsam und oft nicht erreichbar) und sie direkt per Bluetooth ansprechen ist bisher auch nur wackelig, trotz Bluetooth-Gateway direkt daneben. Nervig.
📚 Gelesen & Gehört: In dieser Woche hörte ich ein Buch von Martin Suter und las weiter am aktuellen Hunger Games Prequel. Ich hab im Kindle mittlerweile die Prozentanzeige abgeschaltet, weiß also nicht, wie weit ich bin, aber es ist ganz nett, leider schlafe ich weiterhin nach so zwei Seiten ein.
🤖 Vibe-Update: Diese Woche habe ich hauptsächlich das Tagebuch und die Rezepte-App verbessern lassen. Beide Sachen erhielten sehr gute Updates, sodass ich beides direkt viel umfangreicher nutze. Ich bin weiterhin sehr erfreut darin, was alles schon möglich ist und motiviert mich noch weiter damit zu beschäftigen und zu schauen, wie ich Claude jetzt motiviert bekomme, alles noch etwas weniger Spaghetti-mäßig zu bauen.
🎶 Sandmännchen: Klaus Kauker ist ja schon seit ein paar Monaten zurück auf Youtube und hat ein informatives Video zu dem Sandmännchen-Lied veröffentlicht, für alle, denen es auch schon immer komisch vorkam.
Damals gab es ein Video, in dem ein Teenager den Canon in D von Pachelbel in einer Rock-Version darbot und es war schon eines der wichtigsten Videos für mich damals, denn danach wollte ich unbedingt eine Gitarre.
Mittlerweile gibt eine neue Version, die irgendeine Firma in Auftrag gegeben hat und sie brachte mich mal wieder dazu, das Lied zehn mal anzuhören und mich zu freuen, wie toll es ist.
Zwischen diesen Videos liegen zwanzig Jahre und damals kaufte ich mir von meinem ersten Zivildienstgeld auch eine Gitarre. Leider habe ich es in all den Jahren nie geschafft auch nur einen Takt des Lieds zu lernen, denn nach dem ruhigen Intro knallt es auch einfach direkt so rein, dass es wahrscheinlich gleichzeitig die frustrierendste Lernerfahrung direkt am Anfang meiner Gitarrenkarriere war. Also, wenn ich jetzt noch einmal in die Guitar Pro-Datei reinschaue, sieht es wieder gar nicht so komplex aus, aber es ist halt sehr schnell und erfordert ein sehr sauberes spielen, was einfach nicht geht, wenn man gerade erst eine Gitarre gekauft hat.
Die Guitar Pro-Datei von damals habe ich natürlich auch noch!
Hätte ich beim Gitarrespielen lernen mehr Ausdauer als eine Eintagsfliege, wäre ich vielleicht weiter gekommen, aber mittlerweile begnüge ich mich damit, dass ich einfach drei Stundenlang die Canon-Akkorde spiele, das ist auch schön, wenn auch nicht ganz so… fancy.
D A Bm F♯m / G D G A
(Ich hab in den zwanzig Jahren das ein oder andere Lied gelernt, aber insgesamt bin ich sehr gut darin alles auf fehlendes Talent zu schieben, statt darauf, dass ich einfach gar keine Lust habe zu üben)
Ich habe ja eigentlich aufgegeben, meine Blogposts, für die ich keine Bilder habe, mit schlechten KI-Bildern aufzuwerten, aber ich hatte gerade Claude offen und ich mag die Pelikane von Simon Willison immer so sehr, daher dachte ich, ich probiere es hier doch einmal:
please generate a svg of a man with long curly hair playing guitar sitting in his bedroom at the desk. also can you add some css to animate the svg in a cute way?
Ich hatte noch keine Zeit, mir das neue Album von Betterov genauer anzuhören, sollte ich aber demnächst mal machen. Diese Woche lief dafür der Titeltrack sehr häufig durch meine Ohren.
Du interessiert dich doch für Goethe, hier kommt meine Faust
In den letzten Tagen habe ich hauptsächlich einige Sachen in meine Tagebuch-App eingebaut und ich muss sagen, dass es natürlich zu einem gewissen Featurecreep einläd, wenn man einfach alles machen lassen kann, was einem einfällt.
Ich schrieb ja schon von dem Transkriptionsfeature für meine Voice Memos. Ich kann mein sinnloses Gestammel hochladen und daraus schnell Text-Einträge machen, juchu!
Besonders schön hat er das hier nicht gemacht.
Als nächstes baute ich einen Habit Tracker ein. Jahresanfangsmotivation lässt grüßen. Bisher läuft es immerhin ziemlich gut mit dem abhaken, was aber auch ein bisschen daran liegt, wie gut dieses 1-Prompt-Feature tatsächlich funktioniert. Zusätzlich zur Tagebuch-App lasse ich mir die Habit-Liste auch direkt auf meiner Browser-Startseite (die ich mir auch letztens habe bauen lassen) anzeigen und habe es somit immer im Blick.
New feature: habit tracker. add a new menu point habit tracker. add a new model habit that can be edited in the filament admin panel. the habit tracking page should display the habits in some kind of horizontal table with the days of the year as columns and a green dot if the habit has been done, and a gray dot if not. the dot is clickable to mark the habit as done. the table should be horizontally scrollable to show the whole year sometime. it should always be scrolled to the current day.
Sieht ganz nett aus. Den Kram unten hat er sich allerdings selber überlegt.
Nachdem ich seit ein paar Wochen (auch hier lässt das neue Jahr grüßen), wieder ab und zu joggen gehe, war es natürlich der nächste logische Schritt, dass ich die Läufe ebenfalls im Tagebuch anzeige. Natürlich automatisch. Ich ließ Claude Code also eine Anbindung an Runtastic bauen, was er auch schnell fertig stellte. Leider musste ich feststellen, dass ich gar nicht Runtastic, sondern Runkeeper auf dem iPhone nutze, also musste er nochmal ran und etwas umbauen. Zu guter Letzt merkte ich, dass beide Apps gar keine öffentliche API haben. Das war 2014 aber noch etwas verbreiteter!
i want a new section (yes, again..) thats called "external services" that will contain links to external services that can be used to import new types of stuff. the first will be an integration of the RUNTASTIC api. after connecting with oauth it should show a list of my 10 most recent runs with runtastic.
since runtastic does not even have an api remove all the runtastic things. you can leave the abstract "external services" stuff in, we may need it later
Es gibt aber ja noch einen weiteren Ort, wo alle Läufe gespeichert sind: In Apple Health. Dank der tollen Auto Health Export-App kann ich mir meine Workouts und, warum auch nicht, meine Heart Rate-Daten, da in regelmäßigen Abständen an eine API schicken lassen. Ich machte einmal einen manuellen Export um an das Schema der Daten zu kommen, und instruierte Claude damit, eine API zu bauen, die Daten in dem Format annimmt, speichert und das alles schön inklusive einer Karte und Graphen für die Herzrate anzeigt. Fertig! Schön.
look at the workout_export.json, build a api endpoint that accepts a json in this format. create a table called workouts. fields: foreign_id, location, distance, intensity, elevationUp, start, end, stepcount (just a summed up stepcount from the “stepCount” array in the data), activeEnergyBurned, duration, heartRateRecovery (put the heartRateRecovery json array from the export here), route (put the route json array from the export here), heartRateData (put the heartRateData json array from the export here)
add a “workouts” page in the frontend, that shows the workouts.
create a detail page. add a map using leaflet and openstreetmaps that displays the route. add a chart that display heartRate and heartRateRecovery. use charts.js for the chart
https://github.com/DantSu/php-osm-static-api use this library to render a static version of the map when importing a workout. add a field (static_map_path) to the workout model. adda command to re create static maps for workouts who have non
revise the layout of the detail page. put the static map small on the right side of the stats. put both graphs side by side. make the whole page only 80% width
okay, a fun one: for each heart rate reading, try to find a route point and try to get the elevation. add the elevation as a second y axis to the heart rate chart
in heartrate.json there is an example heartrate export. build an api that can parse this json. create a heartrate model to save the heartrate readings. create a new section to show daily graphs for the heartrate. the heart rate charts should show the whole day ( 0 - 24) and if there is no reading for a bigger time period there should be no line, just space
Ein wundervolles anderes Feature ist, dass ich loggen kann, was sich zum Mittag hatte, und zwar nicht nur als Freitext-Feld, sondern ich kann einfach ein Rezept aus meiner Rezepteverwaltung auswählen, wie cool ist das denn! Dann läd der das da einfach inklusive Vorschaubild rein. Toll. Ein hoch auf APIs.
Außerdem habe ich die ganze Startseite überarbeiten lassen und endlich so einen mitscrollenden Kalender an die Seite gepappt
Das sind nur Testdaten, ich hab nicht wirklich gemalt.
Mir macht das alles viel Freude und es macht auch Spaß in der Benutzung, aber ein paar Sachen stoßen mir schon übel auf und in den nächsten Tagen werde ich versuchen, ob ich Claude davon überzeugen kann, manches etwas anders anzugehen. Natürlich sind meine Prompts bisher auch sehr… dünn und ich lasse ihn erstmal machem, was er für richtig hält, das muss man natürlich bedenken.
Dinge, von denen ich ihn noch überzeugen will:
Wenn neues Javascript eingebunden wird, dann über npm und nicht einfach wild CDN-script-Tags ins Template hauen.
Ebenfalls, wenn JavaScript benötigt wird, das schön in eine AlpineJS-Komponente auslagern und entsprechend einbinden und nicht wild ins Tempalte hauen
Allgemein nicht einfach riesige Blöcke von PHP ins… Template hauen
Bei allen gebauten Sachen darauf achten es in kleinere Blade-Komponenten aufzuteilen und sie auch wiederzuverwenden. In einem Projekt habe ich drei verschiedene Autocomplete-Implementierungen.
Abgesehen davon würde ich mir wünschen, dass er es irgendwie schafft sich konsistenter an das… Design zu halten. Also, nicht, dass meine Tagebuch-App irgendwie ein Design hätte, ich hab das ja auch nur eben mit Tailwind zusammengeklöppelt, aber teilweise sieht jedes Feature im ersten Anlauf komplett anders aus und fügt sich schlecht ein. Das wäre natürlich das i-Tüpfelchen, wenn das etwas besser laufen würde.
Ich habe bei der Recherche gerade auch entdeckt, dass Laravel mit Boost selber sogar ein paar Hilfestellungen anbietet, das werde ich wohl gleich mal installieren.