Seit Monaten habe ich Marcels App Unhinged auf dem Handy. Es ist wirklich ein toller Mood-Tracker, den ich sehr empfehlen kann, ich habe bestimmt schon ein oder zweimal meine Stimmung damit getrackt.
Tatsächlich benutze ich die App auf eine etwas andere Art und Weise: Ich habe bei der Einrichtung die drei täglichen Erinnerungen, die Stimmung einzutragen auf 10, 18 und 23 Uhr eingestellt und freue mich seitdem täglich darüber, dass es um diese Uhrzeiten kurz am Arm vibriert. Das gibt dem Tag irgendwie Struktur.
Unhinged ist nicht die erste App, die ich auf diese Art und Weise benutze, ich bekomme auch Notifications von der App, die sagt, wann welche Mülltonne abgeholt wird. Da das immer an den gleichen Tagen passiert ist das eigentlich Quatsch, aber sobald es Dienstag um 19 Uhr vibriert, gibt mir es mir ein wohliges Gefühl, dass alles nach Plan läuft und am nächsten Tag planmäßig der Müll geholt wird.
Eine weitere App, die ich nur für die tägliche 10-Uhr-Notification nutzte war Close Up, damit könnte man täglich ein Selfie machen und hat dann nach 10 Jahren ein lustiges Video von sich. Leider bin zu 99% zu faul gewesen, die Notification anzuklicken und ein Foto zu machen, aber die kleine 10-Uhr-Erinnerung machte mich immer froh.
Jetzt sagt bitte nicht, dass ich der Einzige bin, dem es so geht.
Es gibt ja so ein paar Todos im Haushalt, die man in regelmäßigen Abständen mal erledigen sollte, wo es aber auch nicht so wichtig ist, dass es tatsächlich an einem bestimmten Tag passiert, wie zum Beispiel:
Geschirrspüler reinigen
Waschmaschine mal auf 95°C durchlaufen lassen
Kühlschrank putzen
Den Filter im Staubsauger putzen oder ersetzen
Jahrelang hatte mein Kopf Probleme damit, diese Sachen zu managen. Schreibt man sie gar nich auf, macht man es tendenziell nie. Oder halt, wenn die Waschmaschine anfängt zu riechen, aber dann hat man vielleicht gerade keine Zeit, oder keine Zitronensäure da, oder was auch immer. Zudem weiß man auch nicht mehr genau, wann man die Dinge zuletzt erledigte. Muss ich schon wieder den Kopf der Zahnbürste tauschen, war das nicht erst vor einer Woche?
Der normale Weg wäre es wahrscheinlich, diese Todos einfach in die normale Todo-App als wiederkehrende Aufgaben aufzunehmen, oder sie in den Kalender zu schreiben. Das regelte ich eine Zeit lang so, aber es machte mir einfach zu viel Druck, diese Todos immer zu sehen, wenn man seinem Tag nachgeht.
Alles erledigt für heute, aber der Geschirrspüler will noch gereinigt werden, was aber eigentlich auch nicht so wichtig ist. Hakt man es doch ab, um den Mental Load los zu sein, kommt es aber erst einen Monat später wieder, was vielleicht doch etwas spät ist.
Manche Todo-Apps haben vielleicht eine “Snooze” funktion, mit der man sowas mal drei Tage verschieben kann, das wäre vielleicht eine alternative Möglichkeit, der ich nicht nach ging
Wie gesagt geistert das wirklich lange in meiner “kann man mal kurz ausprobieren”-Liste im Kopf rum, aber ich wollte es immer als native iOS-App und da ist meine Hürde des “mal eben ausprobierens” immer recht hoch gewesen. Ihr könnt aber sicher schon ahnen, für wen die Hürde sehr gering ist, genau: Claude AI.
Ich legte also ein neues Xcode-Projekt an, nannte es AbUndZuTodo, was ich einen bestechend guten Namen finde, und ließ Claude mal mit folgendem Prompt loslegen:
Hello. I want to build an ios app for tracking todo items that only occur sometimes. stuff like cleaning the dishwasher or washing machine. stuff that you do maybe once a month but where it is not really important to do it exactly then. in the app i want to create tasks and give them a name and a rough range when to to ("once month", "once a week") and in the overview it should show when the task was done the last time and when it should be done again. the frontend should be swift ui the backend/storage layer swiftdata. please ask clarifying questions.
Er fragte noch ein paar Dinge, wie welche Farben ich möchte und ob es Notifications geben soll. Ich sagte erstmal ja zu allem. Nach wenigen Minuten hatte ich eine fertige App, die erstmal nicht kompilieren wollte. Nach ein Bisschen hin- und her und Fehlermeldungen kopieren, gab ich auf und kam auf die zeitsparende Idee:
can you try to compile the source yourself and fix all issues until it works?
Es funktionierte. Eine App, die ich starten kann! Die nächsten Stunden verbrachte ich damit, es auch auf meinem Handy zum Laufen zu bekommen, gegen das ganze Code Signing kann auch die beste AI nichts ausrichten.
Folgende Prompts schob ich noch nach um das Endergebnis zu erreichen. Ich hab sie jetzt einmal aus der JSON-Datei entnommen, die Claude dankenswerterweise speichert. Es wäre natürlich schön, hätte ich von jedem Step noch Screenshots, um das alles besser zu dokumentieren, aber mehr habe ich nicht!
Zuerst wollte ich einen Settingsscreen um mir Testdaten zu seeden:
please add a settings screen. on this screen add a button "delete all data and add demo data" the button should delete all data and add demo data (5 fitting tasks with fitting invervals, prefilled with some fitting completions in the past)
Als nächstes iterierte ich etwas in der Haupt-Übersicht. Zuerst waren erst alle AbUndZuTodos einfach untereinander. Ich ließ es ihn erstmal gruppieren. (Außerdem wollte ich keine stressigen Notifications mehr)
good. now update the main list. group the tasks in two groups: "open" (all tasks that are due now or in < 5 days) and "done" (all tasks that were recently completed). also remove all things relating to notifications, i do not want notifications anymore.
Claude hatte sich das etwas komisch überlegt. Nach links swipen öffnete ein Popover mit der zum Todo gehörenden Historie, nach rechts swipen löschte ihn, das wollte ich so nicht.
change the ui. use swipe to the left to complete the task. use a tap to open the "history". add the edit/delete buttons to the history sheet.
Hier gab es noch mehr Möglichkeit zum gruppieren, da mir immer mehr Todos einfielen und es unübersichtlich wurde. Außerdem wollte ich aktuell nicht relevante Todos nicht mehr sehen.
done tasks should be shown collapsed by default (add a "open" button to show them). all open tasks should be groupable by "area". add a propety "area" (like kitchen, garage, etc) to tasks. adjust the demo data accordingly
Da war noch so ein roter Punkt drin, der mir zu viel Druck machte.
remove the colored dot from the rows and make them a bit tighter
Letzte UI-Iteration: Aktuell nicht relevante Todos werden in einen anderen Tab ausgelagert.
another try: add a tabbar at the bottom with 2 tabs: active and done. put all the done tasks on the done tab
Das war es auch schon. Ich nutze die App jetzt schon seit ein paar Wochen, habe einige Todos angelegt und auch schon das ein oder andere tatsächlich erledigt, es ist quasi genau so wie ich es mir vorgestellt habe und insgesamt war es eine Arbeit von einer Stunde, davon 30 Minuten Code Signing und 25 Minuten auf Claude warten.
Ja, man müsste es mal noch etwas “hübsch” machen, das sieht doch etwas sehr langweilig grau aus.
Es ist schon eine verrückte Welt. Selbst, wenn ich jetzt feststellen würde, dass die App totaler Quatsch ist und ich es lasse, brauch ich nichtmal ein schlechtes Gewissen zu haben, dass ich Zeit für die Implementierung verschwendet habe.
Ja, okay, ich hab im Gegenzug auch nicht viel neues über Swift UI gelernt, da ich nicht tief in den Code einstieg, aber dafür hatte ich gefühlt mehr Zeit und Lust mir darüber Gedanken zu machen, wie die App funktionieren soll, ohne davon beeinflusst zu sein, dass etwas in mir sagt “ähh nee, ich bau das jetzt nicht um, das dauert viel zu lang, ich lass das jetzt in diesem halb-fertigen Zustand”.
Sollte sich die App weiter als nützlich herausstellen werde ich im nächsten Schritt versuchen da Cloudkit Sharing einbauen zu lassen, was ja recht nützlich sein könnte, wenn man nicht die Einzige Person im Haushalt ist, die sich um diese Dinge kümmert. Mal sehen, ob er das schafft. Wenn ja, könnte ich mich auch noch darum kümmern das ganze Rund zu machen und mal in den Store zu laden, vielleicht denkt ja noch jemand so wie ich.
Seit Jahren haben wir den Eiern abgeschworen aber zur Weihnachtszeit erzeugt das oft ein Problem. Wie klebt man das Lebkuchenhaus zusammen ohne Eiweiß? Tatsächlich gibt es dafür eine gute Lösung: Aquafaba, was ein fancy Name ist für “Das Wasser was beim Kichererbsenkochen entsteht”.
Leider fand ich es immer sehr anstrengend an den Rohstoff zu kommen. In den bekannten Dosen verschiedener Markenhersteller war immer nur sehr wenig Flüssigkeit drin und am Ende musste man drei Dosen Kichererbsen aufessen um an wenige Milliliter der goldbraunfarblosen Flüssigkeit zu kommen.
Doch, in diesem Jahr, haltet euch fest, entdeckten wir ein Knallerprodukt im REWE: Das Veggo Aquafaba. Man kann einfach einen halben Liter davon im Tetrapack kaufen. Warum entdeckten wir das erst jetzt! Wie viele Lebkuchenhäuser man mit einem halben Liter kleben kann! Die Möglichkeiten sind unbegrenzt.
(Falls ihr dieses tolle Produkt bereits kanntet, könnt ihr diesen Post ignorieren, für mich war es quasi Live-Changing.)
Ebenfalls ein schnell erklärtes und fluffiges Spiel, das man auch in großer Runde spielen kann: Passt nicht!. Hinter dem erstmal ablehnenden Namen versteckt sich ein Kartenspiel, bei dem man ausnahmsweise mal die Karten legt, die… nicht passen. Hat Spaß gemacht!
Man kann so lang seine Handkarten ablegen und neue ziehen, wie man nichts hat, was farblich oder von der Zahl her zu der aufgedeckten Karte in der Mitte passt. So versucht man so viele Punkte wie möglich zu sammeln. Ein Problem gibt es erst, wenn man eine Karte hat, die passt, dann muss man sie nämlich auf den Stapel legen und die schönen Punkte sind weg. Man kann auch ganz gut versuchen seine Mitspieler zu ärgern, in dem man ein bisschen taktisch ablegt, aber alles bleibt auf einem okayen Komplexitätslevel.
Vor ein paar Tagen spielten wir ein paar Runden Magic Maze und es war überraschend witzig. Der Twist ist, dass es ein Realtime-Spiel ist, also alle Beteiligten gleichzeitig spielen. Jeder hat eine Aktion, die er oder sie ausführen kann und man muss gut aufpassen, dass man immer zur Stelle ist, um das richtige zu tun, denn man spielt gegen die Sanduhr.
Das Spielbrett ergibt sich im Laufe des Spiels und besteht aus verschiedenen Labyrinth-mäßigen Kärtchen die zufällig aufgedeckt und aneinander gelegt werden. Zuerst sucht man die Waffe, die zur Spielerklasse gehört und als zweites flüchtet man aus dem… Kaufhaus. Irgendwie spielt man nämlich rollenspielmäßige Charaktere, die in einer Mall herumrennen, warum auch immer. Das wäre auch mein Kritikpunkt an der Sache: Allein visuell hätte ich die Box wohl im Regal stehen gelassen und die ganze Welt, die auf das Spielprinzip draufgeflanscht ist, ist irgendwie derbe egal.
Aber: Ich bin froh, dass wir es ausprobieren konnten, denn es machte Spaß, es ist schnell erklärt und die Runden sind auch schnell vorbei, sodass man auch mehrere Spielen kann, um richtig reinzukommen.
Das Licht der Phantasie
Terry Pratchett
Das zweite Buch der Zauberer-Reihe um Rincewind begeisterte mich wie das erste nicht so sehr. Mittlerweile sagten aber ein paar Leute, dass das vielleicht einfach nicht der beste Einstieg in die Scheibenwelt ist, daher gebe ich der Sache nochmal eine letzte Chance und mache in der Wachen!-Reihe weiter.
Wer meinen Jahresrückblick überflogen hat, wird sich vielleicht fragen, woher ich weiß, wie viele Liter Orangensaft ich im Jahr 2025 gekauft habe. Gerne beantworte ich das hier natürlich!
Tatsächlich ist es nämlich so, dass ich fast exklusiv über den REWE-Abholservice einkaufe. Das ist einfach so komfortabel. Ein bisschen klicken und am nächsten Tag holt man es einfach ab, ohne 90 Minuten lang durch den Supermarkt zu laufen. Nebenbei hat man auch noch den Vorteil, dass alle Bestellungen online abrufbar sind. Leider kann man sie nicht als CSV- oder JSON-Datei herunterladen, aber dafür können wir uns ja eben ein Script schreiben (lassen).
Ich habe das folgendermaßen gelöst: Zunächst einmal habe ich mich bei REWE eingeloggt und bin auf unter meinem Konto auf “Meine Einkäufe” gegangen. Dort habe ich jeden einzelnen Einkauf in einem neuen Tab geöffnet über “Details anzeigen”. Auf jedem der einzelnen Tabs habe ich mein von Claude erstelltes Bookmarklet gedrückt, das die Seite parst und als .json herunterläd. Ja, man hätte den Schritt vorher auch schon automatisieren können, aber die paar Tabs öffnen, hat mich jetzt auch nicht umgebracht.
Die heruntergeladenen .json-Files habe ich in einem Verzeichnis gesammelt und Claude gebeten, mir ein Python-Script zu schreiben, dass die Daten in eine SQLite-Datenbank importiert und daraus spannende und lustige Statistiken erstellt, in Form einer .html-Datei.
in this folder there are jsons with orders from my supermarket. build a sqlite database structure and import the json to then generate some statistics from it. there should be a script that returns some statistics like: most popular products, products with big price changes in the different purchases, etc. be creative
one last thing: please make an alternative script that does not generate console output, but a sleek looking web page (saved as report.html) with tailwind css (loaded from cdn)
Das war es auch schon. Lustige Statistiken! Vom groben überfliegen passte zahlenmäßig auch alles, nur mit den Zucchini hat er irgendwie Probleme, ich denke nicht, dass ich wirklich 80.000 Stück gegessen habe, vielleicht schaue ich mir das nächstes Jahr nochmal an.
Falls es jemand ausprobieren will, es wohnt auf Codeberg.
In regelmäßigen Abständen kopiere ich Dinge auf mein NAS. Backups, kennt ihr, ne? Bisher machte ich das immer mit einem relativ simplen rsync-Kommando:
rsync -aPr [quelle] /Volumes/dump/[ziel]
An sich funktionierte das auch, aber es war, sobald die Verzeichnisse größer wurden, z.B. dann 25.000 Fotos in meinem 2025er Lightroom-Katalog, dauerte es etwas, weil er natürlich bei jedem Bild erstmal prüft, ob es schon da ist, und ob es sich verändert hat und so weiter. Alles Dinge, die ich nicht brauche. Er soll einfach nur alle neuen Dateien auf die NAS bügeln und sich nicht soviel anstrengen.
rsync -a --ignore-existing --no-perms --no-owner --no-group --size-only --progress [quelle] /Volumes/dump/[ziel]
Nach etwas Diskussionen mit ChatGPT, bin ich mittlerweile bei diesem Kommando angekommen. Nach ersten Tests scheint das etwas schneller aber insgesamt ist es doch immer noch nervig langsam, vor allem bei tiefen, verschachtelten Verzeichnisstrukturen.
In einem kurzen Test habe ich gestern auch noch ausprobiert es mit unison zu lösen, da ich einen Weg suchte, wo er sich irgendwie merkt, was er beim letzten Mal rübergepeitscht hat, und beim Nächsten ausführen nur noch neue Dateien kopiert, ohne zu gucken, was auf dem Zielsystem schon vorhanden ist, aber so richtig zufriedenstellend und schnell funktionierte das leider auch nicht, da unison immer noch viel zu viele Vergleiche anstellt.
Entweder bin ich zu blöd, die richtige Lösung zu finden, oder sie existiert nicht. Die Alternativen wie restic, was ich für meine Server-Backups benutze, möchte ich hier nicht, da ich auf dem NAS eine 1:1-Kopie meiner Dateien als… Dateien haben will und nicht irgendein Repository mit de-duplizierten Datei-Chunks, die man erst wieder restoren muss.
Hat noch jemand eine Idee, wie man das beschleunigen könnte?
Wir hatten gestern den Need… Tage zu zählen, in einem Kalender. Erst wollte ich dafür ein Excel-Template raussuchen, doch ich ließ es schnell von Claude bauen, was wahrscheinlich weniger Zeit brauchte, als Numbers zu starten.
Falls ihr auch mal blaue und rote Tage zählen wollt, habe ich es unter tools.philippwaldhauer.com/calendar hochgeladen. Außerdem ist es auf Codeberg, da wollte ich mir eh mal einen Account machen, falls ich mal Lust habe, meine bedeutungslosen Repositories von Github zu entfernen.
Sobald ich mich von meinen Stars auf ein zehn Jahre altes, unbenutztes Projekt, verabschieden kann. :xheul: