knuspermagier.de
Der privateste Blog von Philipp.

Vor Jahren bestellte ich mal diverse Reinigungsmittel bei Everdrop, weil ich es mal ausprobieren wollte. Davon geblieben ist nur das Geschirrspültab-Abo, was ja das sinnloseste ist — der USP ist ja eigentlich „weniger Transportkosten wegen Kram in Pulverform“. Die Tabs bekommt man ja auch ganz normal im Supermarkt, keine Ahnung, warum ich die als Abo hab.

Naja, nachdem mal wieder das Paket kam, was… 10x so viel Volumen hat, wie der Inhalt, werde ich das Abo mal kündigen, das ist echt Quatsch.

Es ist auch immer hart, wenn man merkt, dass man in so eine dumme Abofalle läuft. Gekauft mit irgendeinem Gutschein, und weil man schöne Dosen dazu bekam und nun habe ich wahrscheinlich seit einem Jahr viel zu viel Geld für Geschirrtabs ausgegeben, während ich alle anderen Reinigungsmittel schon lange wieder lokal kaufe, weil ich keine Lust habe, auf einer Webseite herumzuklicken und den besten Lieferintervall für Toilettenreiniger herauszufinden.

Es sparkt auch gar nicht so viel Joy wie gedacht, wenn man das Geschirrspülsalz, was eh nur für zwei Anwendungen hält, in einer schicken Metalldose hat.

c3cd15e4e22aacd9.jpeg
Zuerst auf Mastodon → erschienen.

Save & Publish-Button für Kirby

Eine klitzekleine Kleinigkeit, die ich mir bei Kirby 4 noch gewünscht hätte, wäre ein Hook um neue Buttons in die Buttonbar auf der Seite-Bearbeiten-Seite einfügen zu können. Ich hab mir nämlich schon vor Jahren mal ein Plugin geschrieben, dass einen "Save & Publish"-Knopf bereitstellt. Für alle, die Kirby als Blog benutzen ist das eine wichtige Sache, denn niemand klickt gerne "Save" um dann auch noch auf den Status-Chooser zu gehen um dort "Published" auszuwählen. Das sind mindestens drei oder vierhundert Klicks zu viel. Im Jahr.

Bisher war das Plugin allerdings ein Feld, das man im Blueprint irgendwo hingepackt hat, viel besser wäre es doch einfach wenn es sich neben dem normalen Speichern-Button befinden würde.

screenshot-2024-01-28-at-15.40.23.png
Mein alter Button, groß und hässlich.
screenshot-2024-01-28-at-15.35.22.png
Da soll er hin!

Leider ist das nicht möglich. Gestern hat der Kirby-Mastodon-Account dieses language-selector-Plugin erwähnt und ich hatte schon Hoffnung, etwas übersehen zu haben, doch das Plugin überschreibt einfach eine Komponente und injiziert damit seine Funktionalität. Smart, aber für meinen Button nicht zu gebrauchen, ich will ja nicht den language-selector durch meinen Button ersetzen.

Naja. Ich dachte also nochmal zehn Minuten darüber nach, wie man das kurz und schmerzlos reinklöppeln könnte und kam zu der folgenden, leicht schmutzigen, aber gut funktionierenden Lösung, indem ich meinen Button einfach ins DOM klöppel. Alle nötigen Funktionen zum Status ändern und Speichern sind durch window.panel zum Glück einfach global verfügbar. Vielen Dank!

window.onload = () => {
    const buttons = document.querySelector('.k-header-buttons .k-button-group');

    const template = `
        <button 
            data-has-icon="true" 
            data-has-text="true" 
            data-responsive="true" 
            data-size="sm" 
            data-theme="positive" 
            data-variant="filled" 
            type="button" 
            class="k-button k-page-view-status k-status-icon" 
            style="--icon-size: 15px;"
           >
            <span class="k-button-icon">
                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="k-icon" style="fill: black !important;"><path d="M9 7.53861L15 21.5386L18.6594 13H23V11H17.3406L15 16.4614L9 2.46143L5.3406 11H1V13H6.6594L9 7.53861Z"></path></svg>
            </span>
            <span class="k-button-text"> Save & Publish </span>
          </button>
    `

    const button = document.createElement('button');
    button.innerHTML = template;

    button.addEventListener('click', async () => {
        await panel.$vue.$store.dispatch("content/save");
        panel.$vue.$events.emit("model.update");
        panel.notification.success();

        await panel.$api.pages.changeStatus(panel.$view.path.replace('pages/', ''), 'listed', 0)
        panel.$vue.$reload({ silent: true });
    });

    buttons.appendChild(button);
}

Das landet einfach in der index.js in einem Plugin, ganz ohne Build-Prozess und schwupps:

screenshot-2024-01-28-at-15.37.43.png
Da isser!

(Wär natürlich jetzt noch schön, wenn er nur angezeigt werden würde, wenn der State dirty ist, das geht sicher auch, wenn ich auf ein paar Events höre, aber meine 10 Minuten für Quatsch sind heute aufgebraucht)

Update: Ich hab es doch mal auf Github gepackt (und noch einen Bug gefixt)

My First Mac

Schnell ein Stöckchen, bei dem ich mitmachen kann!

Mein erster Mac war ein weißes Macbook (2010?), dass die Firma, in der ich die Bachelor-Arbeit schrieb, als Testgerät kaufte. Wir bauten so eine Applikation, die DICOM-Bilder darstellte und die musste natürlich unter MacOS getestet werden.

img_0223.jpeg
Schlechtes Foto des Plastikbombers.

Nachdem ich vorher immer nur Windows genutzt habe war das meine erste Berührung mit MacOS und auch wenn es immer wieder ein paar Startschwierigkeiten gab, wie zum Beispiel die Gewöhnung an den Finder, wenn man vorher nur den guten alten Windows Explorer nutzte (der auch immer noch besser ist, zumindest der von Windows XP oder so), war ich eigentlich sofort verliebt. Natürlich war das auch genau die Zeit, in der Twitter immer weiter aufkam und ich einfach zu den coolen MacOS-Kids gehören wollte.

Als ich 2012 nach Hamburg kam wechselte ich auf ein starkes 15" MacBook Pro und vermisste Windows seit dem keine weitere Sekunde!

Zwischen zwei Sternen

Becky Chambers

Fand’s gut, vermisse aber die Crew aus dem ersten Buch. Anscheinend wird sie auch im nächsten Buch nicht mehr auftauchen? Mal sehen.

Nach den letzten, sehr guten Jubiläumsfolgen #100 und #132 (das war die Folge zum 40-jährigen) wartete ich mit Spannung auf die #150 und wurde ziemlich enttäuscht.

Letztendlich erwartet man in solchen Folgen ja immer ein Aufgebot von vielen Charakteren, die in alten Folgen schonmal da waren, und irgendetwas Besonderes. Letztendlich ist die Sprecherliste hier zwar auch recht lang, aber die ganze Geschichte hat einfach keinerlei Spannung oder etwas reizvolles.

Bibi verhext sich so dumm, dass man es schon merkt, während sie den Spruch aufsagt. Natürlich sind alle anderen Hexen gerade nicht da. Natürlich wächst die ungewollte Dornröschen-Hecke nach der ersten Nacht wieder und alle sind eingesperrt. Natürlich rufen sie einfach die Althexen, und sie hexen alles weg. Was ist das für eine Dornrösen-themed-Folge, in der nichtmal jemand einschläft?

Also klar, die Folge hat (fast) alle Jung- und Althexen und den letztens eingeführten Kilian Kerner, aber warum muss sich Bibi bei ihrer großen Dankesrede in er Mitte der Folge bei Personen wie Eddi Eddison bedanken, die in der Folge sprachlich gar nicht vorkommen? Sehr, sehr komisch.

Dann doch lieber die zweistündige 2023er Adventskalender-Folge.

Devlog #9 - bejou24

Wie wir ja wissen, baute ich vor einiger Zeit meine eigene Tagebuch-Webapp. Ich benutze sie auch recht viel und erfreue mich daran, doch der Zugriff über das Handy war nie wirklich spaßig. Zum Einen musste ich immer erst einen VPN-Tunnel öffnen, da ich alles lokal hoste und zum anderen habe ich die Webapp nie so hingedengelt bekommen, dass es sich im Browser/WKWebView irgendwie smooth anfühlt.

Warum ich immer erst zum VPN verbinden muss? Ich greife per Tailscale darauf zu, aber das saugt im Online-Zustand soviel Energie, dass ich es nicht einfach konstant laufen lassen kann

Nach tausend Versuchen (die 24 steht für 2024, nicht für den 24. Versuch), das mal schnell als native App zu bauen gelang es mir jetzt endlich mit SwiftUI und SwiftData etwas zusammen zu stöpseln, das funktioniert.

Beim Start kommt FaceID, er läd sich die letzten neuen Einträge (einzelne Token-geschützte API-Routen habe ich jetzt doch durch einen Proxy freigegeben, sodass ich ohne VPN drauf komme) und speichert sie lokal mit SwiftData. Neue Einträge werden auch direkt ans Backend gesynct. SwiftData, aber ohne iCloud!

bejou25.jpeg

Nach ein paar Tagen kann ich sagen, dass es grandios funktioniert und meine Tagebuchnutzfähigkeit auf dem iPhone verbessert hat. Also ich hasse es immer noch, mehr als drei Worte auf der iPhone-Tastatur zu tippen, eine Begebenheit die nunmehr seit… über zehn Jahren andauert, aber es funktioniert!

Als nächstes schaue ich mir mir mal an, wie ich schnell den Bild-Upload rein bekomme.

Frisch gestartet

Im letzten Jahr las ich in irgendeinem Blog im Internet von einer tollen Sache, die ich erst ein bisschen doof fand, nun aber doch angewandt habe: Im Neuen Jahr mit einem leeren dev-Ordner starten.

Wer kennt es nicht. Hier und da ein neues Projekt, ein Experiment, dies das und schwupps hat man 400 Ordner in dev und alles ist voll mit Kram und es fühlt sich auch wieder erstmal überfordernd an, wenn man aus Versehen in den Ordner geht, statt ein Projekt direkt zu öffnen.

In diesem Blog, dessen Namen ich vergaß, ging es jedenfalls darum. Die Lösung: Mit jedem Jahr den Ordner einfach leer machen und sollte man eins der Projekte aus dem alten Jahr brauchen, holt man es halt zurück. Ansonsten steht man aber immer erstmal vor einem schön aufgeräumten leeren Ordner. Wie toll!

Zuerst fand ich die Vorstellung etwas mühselig, weil es mich am Ende wahrscheinlich mehrere Sekunden kosten wird, bis ich die Projekte wieder zurückgeschoben haben werde, wenn ich sie doch noch brauche.
Nach etwas Überlegung kam ich aber zum Schluss, dass es das wohl wert sein wird. Nun habe ich die Minuten investiert, alles etwas herumgeschoben und bin froh. Ein fast ganz leeres Verzeichnis, bereit für 2024!

screenshot-2024-01-08-at-22.04.23.png
Nur Sachen, die ich in diesem Jahr schon angefasst habe!