Nachrichten

Willkommen dem neuen Ansel-Maintainer

Jiyoné (Guillaume Stutin) hat die Wartung von Ansel seit Oktober 2025 übernommen. Das aktuelle Ziel ist es, Ansel in eine Genossenschaft  zu verwandeln, in der die Nutzer Mitglieder werden und die Ausrichtung und Prioritäten des Projekts demokratisch bestimmen können, aber auch eine faire Vergütung und ein sicheres Arbeitsumfeld für diejenigen garantieren, die ihre Arbeitskraft in das Projekt einbringen. Ich habe die Beschreibung des Problems und die vorgeschlagene Lösung auf der Seite Demokratie dargelegt.

Änderungen bei der Distribution der Ansel-Pakete

Entwicklung

Target Clones

Das native Kompilieren der Software auf dem Rechner verbesserte die Laufzeiten auf der CPU früher um etwa 30 % gegenüber vorgefertigten Paketen. Der Grund ist, dass der Compiler spezifische Optimierungen für die Zielhardware vornimmt, auf der er kompiliert wird, während vorgefertigte Pakete generisch bleiben und um der breiten Unterstützung willen konservativere Optimierungen auslösen müssen. Beachten Sie, dass OpenCL-Kernel ohnehin für Ihre bestimmte GPU über Ihren OpenCL-Treiber kompiliert werden, sodass die Sache dort anders liegt.

Farbregler endlich korrekt

Development Design

Einführung

Werkzeuge vs. Maschinen, Handwerk vs. Industrie

In seinem Buch The Technological Society (1954) stellt Jacques Ellul den Unterschied zwischen der vor- und der nachindustriellen Revolution wie folgt dar:

Die vorindustrielle Ära ist die Herrschaft des Werkzeugs und des Handwerks. Die vornehmste Eigenschaft von Werkzeugen ist es, generisch, vielseitig und anpassungsfähig zu sein. Es obliegt dem Handwerker, seine Fähigkeiten zu entwickeln, um die Werkzeuge seiner Absicht folgen zu lassen, sodass die Hand die Grenzen des Instruments ausgleicht. Dieses Konzept ist Musikern noch heute wohlbekannt: Man muss üben, lernen, versuchen, scheitern, erneut versuchen … es gibt keine Abkürzungen. Ellul betont den Gedanken der Sparsamkeit, der mit Werkzeugen einhergeht: Ressourcen sind begrenzt, sodass Ihr Werkzeugbestand im Grunde dadurch bestimmt ist, was Sie sich leisten, tragen, meistern und vor Ort bauen können. Trends ändern sich langsam und sind lokal, weil sie lokale Ressourcen nutzen und sich an lokale Bedürfnisse anpassen, und Werkzeuge folgen demselben Muster. Werkzeuge sind Erbstücke, die vom Meister an den Lehrling, von den Eltern an das Kind weitergegeben werden. Sie werden nicht inkompatibel oder veraltet.

Neugestaltung des Leuchttisches und des Mipmap-Caches

Entwicklung Redesign Performance

Zwischen Januar 2022 und März 2026 hat Ansel 297 Non-Merge-Commits eingebracht, die das Leuchttisch-Raster, seine Vorschaubilder sowie deren Rendering-Pipeline und Caching betreffen. Ich habe versucht, so lange wie möglich mit dem schludrigen Leuchttisch-Code von Darktable auszukommen, nur entfettet, aber leider war das reine technische Schulden und es war quälend langsam.

Tatsächlich „bewältigt" Darktable die Miserabilität seines Leuchttisches, indem es dessen Größe reduziert: Die linke und rechte Seitenleiste beanspruchen viel Anzeigefläche, wodurch dem Leuchttisch noch weniger Fläche zum Neuzeichnen bleibt. Da Ansel die rechte Seitenleiste entfernt und ihren Inhalt mit der linken und dem globalen Menü zusammengeführt hat, gab es mehr Fläche zu zeichnen, mehr CPU-Arbeit zu leisten, und das furchtbare Design des Leuchttisches wurde umso schädlicher.

Komplette Überarbeitung der Pipeline

Development

Seit ich um 2012 herum begann, Darktable zu benutzen, war ich immer überrascht, wie wenig RAM es verwendete. Die Leute halten es für eine gute Sache, wenn eine Anwendung sparsam mit dem Speicher umgeht, und das trifft sicherlich zu, wenn wir von Ihrer Desktop-Umgebung sprechen. Aber wenn wir von einer Produktionssoftware sprechen, die aufwendiges Pixel-Rendering an Bildern von 12 bis 54 Mpixel durchführt, dann bedeutet das, dass dieselben aufwendigen Berechnungen immer wieder durchgeführt werden, anstatt gespeichert zu werden, um später wiederverwendet zu werden. Genau dafür ist ein Cache da: um teure Berechnungen zu vermeiden. Und er sollte dafür den gesamten verfügbaren RAM nutzen, denn Rechnen bedeutet Energieverschwendung, und das hat konkrete Auswirkungen, wenn Sie im Akkubetrieb arbeiten. Außerdem haben Sie für diesen RAM bezahlt, und ihn zu nutzen leert Ihren Akku nicht. Die CPU/GPU hingegen…

Verlaufszusammenführung robust und vorhersehbar gemacht

Development

Memoiren eines Typen, der zu viel Zeit damit verbracht hat, den Mist anderer Leute wegzuräumen und für ihre schlechten Entscheidungen zu bezahlen, Folge #zu viele.

Verlauf und Stile per Kopieren/Einfügen zu übertragen, sind Kernfunktionen in Ansel und diejenige, die ihm den Titel „Workflow-App" verdient (oder auch nicht). Aber es ist auch eine der intern am schwersten korrekt umzusetzenden. Nutzer sehen eine Liste von Bearbeitungen, doch unter der Haube hängen diese Bearbeitungen von der Reihenfolge der Pipeline, den Modulinstanzen und den Masken ab. Wenn zwei Bilder unterschiedliche Pipeline-Topologien haben, kann naives Kopieren von Bearbeitungen zu Inkonsistenzen führen.

Tastaturkürzel (Accelerators) von Grund auf neu schreiben

GUI Usability

In meinem grundlegenden Beitrag Darktable: crashing into the wall in slow-motion habe ich das Desaster dargestellt, das der neue „Great MIDI turducken" war. Der Zweck dieses Turduckens1 war es, das System der Tastaturkürzel neu zu schreiben, um es auf MIDI-Geräte zu erweitern.

Bis heute bin ich immer noch wütend über dieses Unternehmen der Massenzerstörung, hier eine Zusammenfassung der Gründe:

  1. es ersetzte 2021 ein System der Tastaturkürzel, das ziemlich gut, funktional vollständig, gut getestet, stabil und in weniger als 1500 Zeilen (Kommentare inbegriffen) programmiert war,
  2. …um Unterstützung für MIDI-Geräte und PlayStation-Gamepads hinzuzufügen (!?!)…
  3. …aber in meiner Darktable-Umfrage von 2022, ein Jahr nach dieser neuen Funktion, gaben von über 1251 teilnehmenden Nutzern an:
    • 81 % der Nutzer hatten kein MIDI-Gerät und planten nicht, sich eines anzuschaffen,
    • 2 % wussten nicht einmal, was ein MIDI-Gerät ist.
    • 8 % der Nutzer hatten ein MIDI-Gerät, verwendeten es aber nicht mit Darktable,
    • 6 % erwogen, sich vielleicht in Zukunft ein MIDI-Gerät anzuschaffen,
    • 2 % der Nutzer hatten ein MIDI-Gerät, das sie tatsächlich in Darktable verwendeten,
  4. der Code war absolut furchtbar, in Bezug auf:
    • Codequalität: unleserliche if/switch-case-Anweisungen, auf 4 Ebenen verschachtelt, inmitten von Funktionen mit 1000 Zeilen (Beispielausschnitte habe ich in meinem Artikel gepostet),
    • Codevolumen:
      • 3546 Zeilen Code für Darktable 4.0,
      • 4397 Zeilen Code für Darktable 5.0,
      • die Zunahme des Volumens ist eine direkte Folge des Versuchs, Bugs in einer Architektur zu beheben, die nicht behoben werden kann, weil ihre Komplexität weitere Komplexität fördert. All das rührt vom Design her, aber Probleme, die durch Komplexität verursacht werden, durch das Hinzufügen von mehr Komplexität zu lösen, ist keine Lösung.
    • Codekomplexität:
      • zyklomatische Komplexität :
        • 1088 für Darktable 4.0,
        • 1245 für Darktable 5.0 (Details ),
      • kognitive Komplexität :
        • 1885 für Darktable 4.0,
        • 2098 für Darktable 5.0 (Details ).
      • es ist mit Abstand die komplexeste Funktion der Software, obwohl sie nicht auf Bildern operiert. Zum Vergleich: die zweitkomplexeste Funktion ist die Dekodierung der EXIF-Metadaten, die eine kognitive Komplexität von 1348 hat.
  5. es dekodiert von Grund auf keine Tastenmodifikatoren, sondern behandelt nur Hardware-Tastenanschläge, was bedeutet:
    • eine „1"-Eingabe vom Ziffernblock wird als Keypad End dekodiert,
    • eine „1"-Eingabe von einer französischen AZERTY-Tastatur wird als Shift+& dekodiert, oder als Shift+" auf BÉPO,
    • Sie müssen daher alle Ihre zahlenbasierten Tastenkürzel für jede Art der Zahleneingabe duplizieren und darauf gefasst sein, dass das Einstellungsfenster für die Tastenkürzel keine einzige echte Zahl in den Tastenkombinationen enthält.
  6. das nutzerseitige Design ist absolut furchtbar, mit viel zu vielen zu konfigurierenden Aktionen und Emulationen („Effekte"), die selbst 4 Jahre später nicht einmal vollständig dokumentiert sind (was ist „ctrl-toggle"? „right-activate"?), und die Konfiguration der Tastenkürzel verwendet ein seltsames geteiltes Fenster, das keinerlei Sinn ergibt,
  7. die Implementierung ist ebenfalls furchtbar: die Funktion kennt die gesamte GUI der Software, und die GUI der Software kennt den Code der Tastenkürzel. Hier gibt es keine Modularität, und eine Änderung an irgendetwas im Code der Tastenkürzel kann unerwartete und unerwünschte Auswirkungen an jeder Stelle der Software haben.2 Sehen Sie sich nur den Abhängigkeitsgraphen unten an,
  8. mehrere „Tastenkürzel" (oder MIDI-Bindungen) können an dieselbe Aktion angehängt werden, was bedeutet, dass jede Nutzerinteraktion die gesamte Liste der verfügbaren Aktionen durchsuchen muss, was eine sehr ineffiziente Handhabung der Tastenkürzel, in manchen Fällen GUI-Verzögerungen und in eigentümlichen Fällen „unbekannte Tastenkombination"-Falschmeldungen verursacht.
image
Nicht dekodierte Zifferntasten und seltsame Fensteraufteilung zwischen „action" und „shortcut".
image

Der Abhängigkeitsgraph von src/gui/accelerators.c (Great MIDI turducken) vor der Neufassung. Raten Sie, warum wir das „Spaghetti-Code " nennen… Das macht deutlich, dass es eine beidseitige Abhängigkeit zwischen dem Accels-Code und dem restlichen GUI-Code gibt. Das ist ein Albtraum in der Wartung.

Willkommen, Ansel GPT !

Ankündigung

Nachdem ich endlich die gesamte Website und die Dokumentation in einen wasserdichten Übersetzungs-Workflow (unter Verwendung von po4a über Hugo) integriert hatte, der zufällig das exakt gleiche Toolset und die gleiche Logik wie die Ansel-Anwendung verwendet, kam mir die Idee, leere Übersetzungen zu automatisieren, zuerst aus den Software-Übersetzungsdateien, dann über die ChatGPT-API, die bei der Übersetzung von Markdown-Syntax durchaus einen guten Job macht.

Wenn man allein arbeitet, kann man sich nicht auf soziale Faulheit  verlassen, also muss man clever sein. Du kannst die Liste der Dinge, die ich bereits im Hintergrund für Ansel automatisiert habe, sehen.

Willkommen, Entwicklerdokumentation!

Entwicklung

Im Dezember 2019 habe ich darum gebeten, dass jemand die Erstellung von AppImages-Paketen für Darktable übernimmt. Der offensichtliche Vorteil wäre gewesen, frühe Tests zu ermöglichen, vor der Veröffentlichung, von Menschen, die den Quellcode nicht selbst erstellen können, um hoffentlich frühes Feedback zu liefern und beim Debuggen vor der Veröffentlichung zu helfen. Dies war nie eine Priorität, was bedeutet, dass es in Ordnung war, einen Vorveröffentlichungs- und eine Nachveröffentlichungsspur zu haben, um Bugs zu beheben.

Den Cache der Pipeline und 10 Jahre alte Bugs beheben

Entwicklung

Zusammenfassung der vorherigen Episoden

  1. Zwischen 2020 und 2022 durchlief Darktable ein Massenvernichtungsunternehmen, betrieben von einer Handvoll Typen mit mehr Freizeit und Wohlwollen als tatsächlichem Können,
  2. 2022 begann ich, eine störende Verzögerung zu bemerken  zwischen GUI-Interaktionen mit Schieberegler-Steuerungen und der Rückmeldung/Aktualisierung besagter Regler. Mangels einer Rückmeldung, dass die Wertänderung erfasst wurde, konnten die Benutzer sie erneut ändern, wodurch zusätzliche Pipeline-Neuberechnungen ausgelöst und ihr Computer faktisch eingefroren wurde, weil die dumme GUI nie sagte „verstanden, warte jetzt einen Moment".
  3. Ich entdeckte, dass Aufträge zur Pipeline-Neuberechnung zweimal pro Klick ausgelöst wurden (einmal beim Ereignis „Taste gedrückt", einmal beim Ereignis „Taste losgelassen") und nochmals bei jeder Mausbewegung, aber auch, dass die GUI-Zustände scheinbar erst nach der Pipe-Neuberechnung aktualisiert wurden.
  4. Ich habe das behoben, indem ich die benutzerdefinierten GUI-Steuerelemente (Bauhaus-Bibliothek) nahezu neu geschrieben habe. Ich dachte, dass das Verhindern rücksichtsloser Neuberechnungsaufträge die Verzögerung beheben würde: Tat es nicht. Dann entdeckte ich, dass das Anfordern einer neuen Pipeline-Neuberechnung, bevor die vorherige beendet war, auf das Ende der vorherigen wartete, trotz eines vor vielen Jahren implementierten Abschaltmechanismus, der eigentlich hätte funktionieren sollen.
  5. Ich habe das behoben, indem ich einen Kill-Switch-Mechanismus für Pipelines implementiert habe, gemäß Kommentaren im Code aus den 2010er Jahren und internen Hilfsmitteln, die möglicherweise nie funktioniert haben. Das funktionierte nicht immer, weil der Kill-Befehl oft mit merklicher Verzögerung eintraf. Auch hier wurde die GUI-Verzögerung nicht behoben.

Neuschreiben des Import-Werkzeugs

Entwicklung Redesign

Ansel erbt von Darktable seine Datenbankgrundlage: Die nicht-destruktiven Bearbeitungshistorien werden pro Bild in einer SQLite-Datenbank gespeichert, zusammen mit Metadaten und anderen benutzerdefinierten Daten. Das Bewusstmachen der Datenbank für neue Bilder erfolgt durch das „Importieren“ von Bildern von einer Festplatte oder einer Speicherkarte. Hier kommt das Importwerkzeug ins Spiel.

Leider ist der Darktable-Importer eine weitere Sache, die um das Jahr 2020 verstümmelt wurde und sich in etwas äußerst Verstörendes verwandelte, da er ein Datei-Browser ist, der keinem zuvor bekannten Datei-Browser ähnelt und grundlegende Funktionen (wie Strg+F oder EXIF-Vorschau) vermisst, während er dennoch mit nutzlosen Funktionen überladen ist (siehe unten). Hier verlieren wir viele potenzielle zukünftige Benutzer, und es ist nur der erste Schritt des Workflows. Was für ein großartiges Beispiel dafür, was eine „Workflow-App“ leisten kann!

Implementierung eines Abbruchschalters in der Pipeline

Entwicklung

Ich habe lange gedacht, dass es einen Abbruchmechanismus in der Pixel-Pipeline gibt. Der Anwendungsfall ist folgender:

  1. Sie ändern einen Modulparameter,
  2. die Vorschaubilder (die zentrale Dunkelraumvorschau und das Thumbnail im linken Bereich, das auch für Histogramm und Farbwähler verwendet wird) rechnen ihre Pipeline neu, um diese Änderung zu berücksichtigen,
  3. eines der Vorschaubilder endet mit dem Rendern vor dem anderen, und das Ergebnis ist offensichtlich nicht das, was Sie wollten,
  4. Sie ändern erneut den Modulparameter, ohne darauf zu warten, dass die Neuberechnung abgeschlossen ist.

In diesem Fall möchten Sie alle aktiven Pipelines beenden, weil deren Ausgabe nicht verwendet wird, und alles sofort mit neuen Parametern neu berechnen. Außer Darktable tut das nicht, es lässt die Pipeline beenden, bevor sie neu startet, und angesichts der Kommentare im Quellcode scheint es sich um eine relativ neue Regression zu handeln und nicht um das ursprünglich beabsichtigte Verhalten.

Das Ent-Darktable-ing der GUI-Kontrollen

Entwicklung

Darktable hat seine eigenen GUI-Widgets-Bibliothek für Schieberegler und Kombinationsboxen (auch Drop-Down-Menüs oder Auswahllisten genannt), genannt Bauhaus (im Quellcode unter src/bauhaus/bauhaus.c). Während sie Gtk als Backend verwenden, sind Bauhaus benutzerdefinierte Objekte. Und wie vieles bei Darktable, gleich benutzerdefiniert verfault.

Im Jahr 2022 bemerkte ‍ich Parasiten-Neuzeichnungen und Lags  bei deren Nutzung, was zu einem frustrierenden Benutzererlebnis führte: Das Widget-Neuzeichnen schien darauf zu warten, dass Pipeline-Berechnungen abgeschlossen waren, was bedeutete, dass Benutzer nicht wirklich sicher waren, ob ihre Wertänderung registriert wurde, was sie dazu bringen könnte, es erneut zu versuchen, einen weiteren Zyklus teurer Neuberechnungen zu starten, und ihren Computer tatsächlich für mehrere sehr frustrierende Minuten nutzloser Zwischenpipeline-Berechnungen einfror.

Änderungen in der Verteilungsunterstützung für das Linux AppImage-Paket

Ankündigung

Rawspeed (die Bibliothek, die die Decoder für Kamera-Rohdateien bereitstellt) hat die Unterstützung für GCC < 12 eingestellt. Infolgedessen kann ich das AppImage nicht mehr auf Ubuntu 20.04 (mithilfe von Github-Runners) erstellen, sondern muss es auf 22.04 erstellen.

Das bedeutet, dass jede Linux-Distribution mit einer älteren libc als 2.35 das neue AppImage ab heute nicht mehr starten kann. Das sollte die meisten Benutzer nicht betreffen, die Distributionen verwenden, die 2021 oder neuer aktualisiert wurden. Ubuntu 20.04 und andere LTS/alte stabile Distributionen (Debian stable) könnten betroffen sein.

Erklärung des Redesigns der Ansel-Modulgruppen

Design

Wenn Sie von Darktable kommen, sind Sie vielleicht an dies im Dunkelkammer-Modus gewöhnt:

image

während Ansel Ihnen dies bietet:

image

Dies ist kein Unfall, und es ist an der Zeit zu erklären warum, und warum dies nicht mit Anpassungsoptionen erweitert wird.

Neue Build-Optionen für Linux

Entwicklung

Ich habe zufällig entdeckt, dass das Linux-Build-Skript eine „Paket“-Build verwendet, was bedeutet, dass die CPU-Optimierungen auf allgemeine beschränkt sind, um portable Binärdateien zu produzieren, die auf jeder x86-64-Plattform installiert werden können. Mit “Verwendung” meine ich, dass die Paket-Build-Option nicht explizit deaktiviert war, sodass sie standardmäßig aktiviert war.

Wie dem auch sei, dies ist nun standardmäßig deaktiviert, da die tatsächlichen Pakete (.exe und .appimage) nicht durch dieses Skript erstellt werden, das in erster Linie für Endbenutzer gedacht ist. Um das vorherige Verhalten wiederherzustellen, müssen Sie Folgendes ausführen:

Entwicklungstagebuch #2: Vorstellung von Chantal

Entwicklung

2022 war in Bezug auf Junk-Emails und Lärm so schlecht, dass ich Virtual Secretary  gestartet habe, ein Python-Framework, um intelligente E-Mail-Filter zu schreiben, indem Informationen aus mehreren Quellen kombiniert werden, um herauszufinden, was eingehende E-Mails sind und ob sie wichtig/dringend sind oder nicht. Wenn ich von Junk-Mails spreche, sind das auch Github-Benachrichtigungen, Pings auf pixls.us (Gott sei Dank habe ich mein Konto in diesem dummen Forum geschlossen), YouTube und direkte E-Mails von Menschen, die hoffen, privat Hilfe zu bekommen.

Dev-Tagebuch

Entwicklung

Es sind ungefähr 3 Monate her, dass ich “R&Darktable” (was niemand richtig zu verstehen schien) in “Ansel” umbenannt habe, dann den Domainnamen gekauft und die Website von Grund auf mit Hugo erstellt habe (ich hatte zuvor nie in Golang programmiert, aber es ist hauptsächlich Template-Code).

Dann habe ich insgesamt 70 Stunden darauf verwendet, die nächtlichen Paketbuilds für Windows und Linux für kontinuierliche Lieferung vorzunehmen, etwas, was Darktable nie richtig gemacht hat (“Sie können selbst bauen, es ist nicht schwer”), nur um zu sehen, wie der Bug-Tracker nach Veröffentlichung explodiert (nichts besseres als den Vorveröffentlichungs-Spurt mit einem Nachveröffentlichungs-Spurt zu verkürzen, um Ihre Lebenserwartung zu reduzieren).

Darktable: Im Zeitlupentempo gegen die Wand krachen

Was passiert, wenn eine Gruppe von Amateurfotografen, die zu Amateurentwicklern wurden, zusammen mit einer Reihe von Back-End-Entwicklern, die Bibliotheken für Entwickler entwickeln, entscheiden, ohne Methode oder Struktur an einer Industriessoftware für Endbenutzer zu arbeiten, deren Kernkompetenz (Kolorimetrie und Psychophysik) irgendwo zwischen einem College-Abschluss in Fotografie und einem Master-Abschluss in angewandten Wissenschaften liegt, während sie versprechen, zwei Veröffentlichungen pro Jahr ohne Projektmanagement zu liefern? Ganz zu schweigen davon, dass die Gründer und die erste Generation von Entwicklern weitergezogen und geflüchtet sind?

Search

You can also ask Chantal, the AI search engine.