Ein Fototool entsteht – Photography Toolbox Fortschritte im November 2020

Die Photography Toolbox reift – so kann man glaube ich gut das Ergebnis aus dem November beschreiben. Auch wenn die zweite Monatshälfte eine große Planänderung mit sich brachte..

Nachdem im Vormonat viele grundlegende Änderungen umgesetzt wurden, war in diesem Monat an vielen Stellen Detailarbeit angesagt. Diese kann man grob in die Themen:

  • Performance
  • Optimierung
  • Bugfixing
  • Neue Funktionen

gliedern, über die ich euch heute mit diesem Post auf dem laufenden halten will.

Performance

Die Arbeit mit den Bildern aus meiner Toskana-Fotoreise im Oktober hatte gezeigt, dass die Funktionalitäten in der Photography Toolbox per se schon gut ihren Zweck erfüllten. Aber an manchen Stellen fühlte sich das Programm noch etwas träge an. Ich sage bewusst „fühlte“, denn faktisch war es quasi auf dem Niveau von Lightroom. Ich wollte aber mehr, insofern bin ich auf die Suche gegangen nach Punkten, wo ich Zeit verliere. Und das war oft eine Jagd nach 10,20 oder 30 Millisekunden. Das mag jetzt nicht viel erscheinen, aber wenn eine Aufgabe 10x30ms braucht, merkt man das als Anwender schon im Vergleich zu 10x10ms.

Tatsächlich konnte ich einige Ansatzpunkte finden und so beim Wechseln zwischen Fotos sowie bei der Vergabe von Ratings und Labels wertvolle Millisekunden einsparen. Auch beim Laden eines Ordners konnte ich gut 20% Zeit einsparen, so dass 1500 Bilder statt in 7 Sekunden nun in 5,5s geladen waren.

Dann hatte ich aber noch ein Experiment gewagt: Testweise habe ich die komplette Architektur, wie ich Metadaten in der Datenbank speichere, von einer flexiblen JSON-Struktur auf eine klassische, spaltenweise Hinterlegung geändert. Und auch, wenn dies für Erweiterungen mehr Arbeit bedeutet, brachte dies einen solchen Geschwindigkeitsvorteil, dass ich das ganze Programm nochmal umgebaut hatte. Dies war eine schwierige, aber wichtige Entscheidung, denn jetzt gehen solche Dinge noch. Später sollten solche grundsätzlichen Änderungen der Architektur eher ausbleiben. Diese Änderung hatte dann aber den positiven Effekt, dass das Laden der Ordner auf rund die Hälfte verkürzt wurde und auch alle sonstigen Aktivitäten deutlich schneller gehen.

Ein letzter Punkt war das Entfernen der bisherigen Zoomansicht, welche durch zusätzliche Listenelemente ebenfalls Zeit kostete. Die Funktion ist aber dadurch nicht weggefallen, sondern wurde durch eine bessere Umsetzung ersetzt, die weniger Einfluss auf die Performance hat.

Damit ist das Arbeite mit dem Programm jetzt doch sehr flüssig möglich und auf dem Stand, mit dem ich auch leben kann.

Bugfixing

Der zweite wichtige Punkt im November bestand in der Beseitigung von Fehlern. Während der Tests in der zweiten Novemberhälfte waren doch einige Fehler aufgetreten, von denen zwar viele direkt behoben wurden, aber es gab halt auch ein paar Restanten für diesen Monat.

Ansonsten stand der Review der Umbenennen/Kopieren/Verschieben-Funktion und des DNG-Konverters an, wo beim Durchschauen und Testen auch noch einige Punkte aufkamen.

U.a. wurden folgende Fehler korrigiert:

  • Das im Parameterfenster im Importmodul angezeigte Bild wurde durch das Programm blockiert, so dass es nach dem Verschieben nicht gelöscht werden konnte
  • Autonummerierung hat beim Umbenennen nicht funktioniert
  • Beim Auslesen von Metadaten wurden nicht nach Dateityp genau unterschieden, wann die Daten aus einer XMP-Filialdatei oder aus der Originaldatei gelesen werden sollen
  • Die Option zum Löschen eines Filtertemplates war nicht umgesetzt
  • Beim Verschieben von Dateien in den „Selected“/“rejected“-Ordner in Browser-Modul wurde die Datenbank nicht korrekt aktualisiert, wenn die Datei bereits existiert hatte im Zielordner
  • Previewdateien waren nicht eindeutig, sofern zwei Bilder mit gleichem Namen aber unterschiedlicher Dateiendung existierten. Die Dateiendung ist nun Teil des Namens der Vorschaudatei
  • Mehrfache Imports&parallele Imports werden nun unterbunden
  • Beim Import wird nun verhindert, dass Quelle und Ziel identisch sind
  • Hinweisfenster erscheinen teilweise im Hintergrund und erwecken den Anschein, die Anwendung sei abgestürzt (da auf das Schließen des Hinweisfensters gewartet wird)

Optimierungen

Das Thema Optimierung bekommt der Nutzer der Anwendung zwar nicht wirklich mit, da weder Fehler beseitigt, noch neue Funktionen ergänzt werden und doch ist der Punkt in den letzten Monaten wichtig gewesen, um das Programm besser zu strukturieren und für die Zukunft besser erweiterbar zu halten.

In diesem Monat ging es dabei vor allem um folgende Funktionen:

  • Die Umbenennen/Verschieben/Kopieren-Funktion im Import-Modul.
    Die Funktionen wurden überarbeitet und der Start in den Hintergrund-Job verlagert, um die Aktionen in zeitlich korrekter Folge abzuarbeiten.
  • Die DNG-Konverter-Funktion im Import-Modul.
    Die Funktionen wurden überarbeitet und der Start in den Hintergrund-Job verlagert, um die Aktionen in zeitlich korrekter Folge abzuarbeiten.
  • Funktionen zum Hinzufügen/Entfernen von Elementen aus Wertelisten

Mittlerweile sind damit die meisten Funktionen in den Hintergrund-Job ausgelagert und belasten damit nicht mehr das Frontend. Ausstehend sind nun nur noch die GPS- und Cloud-Vision-Funktionen, die bislang nur teilweise im Hintergrund laufen.

Neue Funktionen

Das aus Anwendersicht beste kommt zum Schluss, denn auch diesen Monat gab es ein paar neue Funktionen, die zwar keine ganz großen Änderungen mit sich bringen, aber die bestehenden Abläufe optimieren/verbessern.

Größere neue Funktionen setze ich im Moment nicht mehr um, da der Fokus aktuell mehr darauf liegt, die Stabilität des Programmes zu verbessern.

Folgende Verbesserungen wurden aber trotzdem erreicht:

  • Die Tags beim Erstellen von Vorlagen für Dateinamen und Unterordnerstrukturen im Importmodul sind jetzt statt der Exiftool-Logik sprechender umgesetzt
  • Bei den Tags zum Erstellen von Vorlagen für Dateinamen und Unterordnerstrukturen im Importmodul können nun bis zu 9 Parameter abgefragt werden (bislang nur einer)
  • Bei der Autonummerierungsfunktion beim Umbenennen kann nun auch eine Startzahl vorgegeben werden
  • Neue Option im Importmodul, um automatisch doppelte Dateinamen zu vermeiden
  • Im Importmodul wird die Anzahl der Dateien nun angezeigt
  • Mit den Tastenkombinationen STRG+ bzw. STRG- kann im Browser-Modul nun die Bildgröße angepasst werden
  • Der Zoom-Modus (aktiviert durch die Leerzeichentaste) wurde verbessert. Die Bilder können im Zoommodus einfach mit der Maus verschoben werden. Dabei werden alle Bilder parallel verschoben.
  • Es wurde ein neuer Einzel-Vollbildmodus umgesetzt. Durch die Taste E wird das aktuelle Bild im Vollbildmodus angezeigt. Mit STRG-E wird das Bild im Vollbildmodus in der 100%-Ansicht angezeigt.
  • Neue Funktion um Vorschauen und Metadaten neu aus einem Foto zu lesen (im Kontextmenü der Bildliste enthalten =>rechte Maustaste zum Anzeigen)
  • Im Settings-Modul befindet sich eine neue Optionsgruppe zum Debugging. Hier kann ein Debugging-Modus aktiviert werden und Abfragen zum Lesen und Schreiben in der Datenbank abgesetzt werden. Lesende Abfragen werden dabei als txt-Datei ausgeben.

Die Kehrtwende

Nun hätte ich eigentlich mit dem Ergebnis aus dem November zufrieden sein können, doch irgendwie wurde mir mehr und mehr bewusst, dass die Umsetzung wie sie aktuell läuft ggf. nicht wirklich auf Dauer das Richtige ist. Damit meine ich nicht die Funktionalitäten des Programmes, sondern die dahinter liegende technische Infrastruktur.

WPF für die Oberfläche ist dabei noch nichtmal das Problem, sondern eher die Anbindung über Powershell. Auch wenn ich hier die letzten Monate viel geschafft habe und vieles umsetzen konnte, was ich am Anfang nicht für möglich hielt, blieb jedoch immer der Makel, dass Powershell für eine solche Anwendung eigentlich das falsche Tool ist.

Und so hatte ich einen Testballon gestartet und geschaut, ob ich mit C# und dem Net.Core-Framework zurechtkommen würde. Vor einigen Monaten war mir das noch etwas zu komplex, da ich noch nie in C der dem NET-Framework programmiert hatte, aber nach den ganzen neuen Erfahrungen wollte ich dem nochmals eine Chance geben. Und tatsächlich hatten die ersten Schritte Erfolg und ich habe schweren Herzens den Schritt beschlossen, die komplette Anwendung nach C# zu portieren.

Glücklicherweise sind die beiden Sprachen recht ähnlich, so dass auch der Code recht ähnlich ist und die Grundstrukturen erhalten bleiben, aber trotzdem muss jede Zeile per Hand übersetzt werden. Damit habe ich nun angefangen und habe im November schon fast 50% der Anwendung portieren können. Dabei muss man aber auch sagen, dass viel Zeit dabei vergangen ist, in der ich mich erstmal in bestimmten Themen in C# schlau machen musste. Dabei wurde auch mehr und mehr klar, wo die Vor- und Nachteile dieses Schrittes (bzw. die Vorteile von Powershell) liegen.

In folgenden Punkten war Powershell eindeutig besser:

  • Man musste nicht so genau sein, da Powershell sehr tolerant ist, inbesondere beim Konvertieren von Variablen und anonymen Datentypen
  • Man kann Daten sehr flexibel filtern, sortieren, selektieren, was in C# zwar mit Linq auch in der Art, aber nicht so flexibel und komfortabel geht
  • Das Arbeiten mit Dateien, Dateistrukturen ist deutlich einfacher

Dafür hat C# folgende Vorteile:

  • Der Quellcode wird schneller verarbeitet, da er kompiliert ist
  • Der Code ist aufgrund der strengen Typisierung weniger anfällig für versteckte Fehler
  • WPF ist deutlich besser bzw. direkt nativ angebunden
  • Es wird am Ende eine lauffähige exe-Datei erstellt (ging bei Powershell nur über Umwege und wird mehr und mehr durch Virenscanner blockiert).
  • Man kann einfach über Erweiterungen zugreifen
  • Multitasking ist deutlich einfacher zu realisieren
  • Das Abgreifen von Nachrichten aus Jobs ist viel einfacher
  • Das Arbeiten mit Klassen ist integrierter als in Powershell, sofern dort Klassen in eigenen Modulen liegen

Fazit

In Summe wieder ein erfolgreicher Monat, auch wenn ich am Ende etwas zurückgeworfen worden bin, da ich quasi nochmal einen Neustart gewagt habe. Das wird mich sicher 1 oder 2 Monate am Ende kosten, aber diese Architekturentscheidung ist aus meiner Sicht richtig und gerade noch zur rechten Zeit. Eine solche Aktion möchte ich nach der Beta-Phase eigentlich nicht nochmal wagen, zumal das ganze auch viel Zeit und Energie kostet. Auf der anderen Seite habe ich aber auch wahnsinnig viel bei dem Ganzen gelernt.

Für den Dezember ist es nun das Ziel, das Browser- und Einstellungs-Modul komplett nach C# zu migrieren. Im Januar soll dann das Import-Modul noch folgen, womit dann die Anwendung komplett übersetzt wäre.