Froschs Blog

Computer und was das Leben sonst noch so zu bieten hat

Zur Website | Impressum

GIMP-Filter „heal selection“

Montag, 10. Juli 2023

Ich vermisse seit dem Upgrade auf Devuan 4 bzw. Debian 10 schmerzlich das GIMP-Werkzeug „heal selection“ (hier sehr gut beschrieben von Ralf Hersel). Das ist nicht mehr in Debian, weil das Paket gimp-python nicht mehr in Debian ist. gimp-python ist nicht mehr in Debian, weil das wohl in Python 2.x geschrieben ist, insofern verständlich.

Manche schreiben von einem Plugin namens resynthesizer, das im Paket gimp-plugin-registry enthalten sein soll, aber abgesehen davon, daß ich den in meiner deutschen Version nicht finde, soll das wohl auch nicht dasselbe sein.

:~$ apt search gimp plugin resynthesizer
Sortierung… Fertig
Volltextsuche… Fertig
gimp-plugin-registry/stable,now 9.20200927 amd64  [installiert]
  repository of optional extensions for GIMP

Ich will Sensorflecken aus buchstäblich tausenden von Fotos aus der Canon EOS 350D entfernen. Deren Sensor ließ sich einfach nicht ordentlich reinigen, und „heal selection“ ist genau das richtige Werkzeug dafür. Die Flecken in diesem Beispiel-Bild habe ich rot markiert: (mehr …)


Das Piwigo-Desaster

Donnerstag, 5. Januar 2023

Zum Betrieb meiner Media-Site verwende ich seit gut fünf Jahren Piwigo. Da liegen nun mittlerweile gut 35.600 Medien, ganz überwiegend natürlich Fotos, aber auch Scans von Tickets etc. und einige Videodateien. Von den Fotos sind fast 32.000 öffentlich zugänglich. So weit, so gut.

Schon im November war mir eher zufällig aufgefallen, daß sich die Videodateien dort nicht mehr abspielen ließen. Den Grund konnte ich erstmal nicht feststellen. Erst später bemerkte ich, daß die Fotos nur noch in der jeweiligen Alben-Übersicht und generell in den kleineren Formaten angezeigt wurden, aber nicht mehr in der Einzeldarstellung. Da stand nur noch der ursprüngliche Dateiname. Nach etwas Sucherei konnte ich die Änderung an einem Datum festmachen: Am 12. November früh morgens hatte ich bei Piwigo einige Updates eingespielt. Das waren zum einen zwei oder drei Plugins gewesen und zum anderen ein Versions-Update, und zwar von 13.2.0 auf 13.4.0 (die 13.3.0 hatte ich verpeilt gehabt).

Und in dieser Update-Routine gab es einen bösen Fehler, der dazu führte, daß das Upload-Verzeichnis einfach mal weg war. Und damit alle Dateien, die ich in den letzten fünf Jahren hochgeladen hatte. Natürlich mache ich von der Datenbank von Piwigo – wie von allen Datenbanken auf diesem Server – täglich ein Backup. Von den hochgeladenen Bildern habe ich das bislang nicht gemacht. Ja, das war wohl ein Fehler, den ich gerade zähneknirschend korrigiere. Unter anderem. (mehr …)


Canon-Kameras, Python-PIL und die EXIF-Daten

Mittwoch, 12. Oktober 2022

Vorgestern Abend stieß ich auf ein … interessantes Problem.

Projekt: downscaler (Git-Repo: Downscaler; clonen geht derzeit noch nicht wieder, aber man kommt über den „snapshot“-Link an die Datei-Inhalte). Geschrieben in Python3 mit den externen Modulen PIL (pillow) und piexif.

Das recht einfache Python-Script rotiert die JPG-Dateien aus einem Verzeichnis (bei Bedarf) und skaliert sie dann – sofern das Original größer ist – so herunter, daß die breitere Seite 1200 px hat. Das Ergebnis wird unter demselben Dateinamen in ein anderes Verzeichnis gespeichert. Das Original wird dabei nicht verändert. So weit, so gut.

Bisher habe ich das beim Bearbeiten mit The GIMP direkt mitgemacht. Das bedeutet aber auch, daß ich selbst solche Fotos, an denen ich sonst gar nichts editieren will, in GIMP holen, ggf. rotieren, runterskalieren und wieder abspeichern muß. Sich wiederholende Tätigkeiten sollte man doch besser einem Computer überlassen, weil der das schneller kann, nicht wahr? 🙂 (mehr …)


Kleine Diskussion mit MariaDB

Samstag, 8. Oktober 2022

Ich stand grad mal wieder auf dem Schlauch.

 MariaDB [piwigodb]> show columns from pwg_categories;
 +---------------------------+-----------------------------+------+-----+---------------------+
 | Field                     | Type                        | Null | Key | Default             |
 +---------------------------+-----------------------------+------+-----+---------------------+
 | id                        | smallint(5) unsigned        | NO   | PRI | NULL                |
 | name                      | varchar(255)                | NO   |     |                     |
 | id_uppercat               | smallint(5) unsigned        | YES  | MUL | NULL                |
 | comment                   | text                        | YES  |     | NULL                |
 | dir                       | varchar(255)                | YES  |     | NULL                |
 | rank                      | smallint(5) unsigned        | YES  |     | NULL                |
 | status                    | enum('public','private')    | NO   |     | public              |
 | site_id                   | tinyint(4) unsigned         | YES  |     | NULL                |
 | visible                   | enum('true','false')        | NO   |     | true                |
 | representative_picture_id | mediumint(8) unsigned       | YES  |     | NULL                |
 | uppercats                 | varchar(255)                | NO   |     |                     |
 | commentable               | enum('true','false')        | NO   |     | true                |
 | global_rank               | varchar(255)                | YES  |     | NULL                |
 | image_order               | varchar(128)                | YES  |     | NULL                |
 | permalink                 | varchar(64)                 | YES  | UNI | NULL                |
 | lastmodified              | timestamp /* mariadb-5.3 */ | NO   | MUL | current_timestamp() |
 | external_reference        | varchar(255)                | YES  |     | NULL                |
 +---------------------------+-----------------------------+------+-----+---------------------+

(mehr …)


Spaß mit Python3 und InnoDB

Donnerstag, 13. Januar 2022

Die Blogs, die ich betreibe bzw. administriere, laufen allesamt mit MariaDB, einem Fork von MySQL. Die beiden Datenbank-Systeme kennen zwei verschiedene Engines, um Daten zu verwalten: MyISAM (die ältere) und InnoDB (die neuere). Die Blogs, die ursprünglich mit WordPress gestartet waren, legten ihre Datenbank mit MyISAM an, und auch, wenn die Blogs mittlerweile auf ClassicPress umgestellt wurden, blieb dieses Format erhalten. Was ich neu direkt mit ClassicPress installiert habe, bekam jedoch eine Datenbank mit der InnoDB-Engine, die die Daten ein wenig anders ablegt. Im laufenden Betrieb insbesondere der relativ kleinen Blogs macht das erstmal keinen Unterschied.

Anders sieht das aus, wenn ich abseits vom Blogsystem (hier: mit Python3) in diese Datenbanken reingreifen möchte. Solange ich nur lesend reingehe, ist das weiterhin kein Problem. Will ich jedoch schreibend auf diese Datenbanken zugreifen, gibt es einen kleinen, feinen Unterschied, und der hat mich eine Weile beschäftigt. (mehr …)


Spaß mit EXIF und datetime-Objekten in Python3

Freitag, 7. Januar 2022

Seit Frühjahr 2009 fotografiere ich regulär mit digitalen Spiegelreflexkameras. Diese Kameras schreiben eine Menge interessante Informationen in die EXIF-Daten der Bilddateien – zum Beispiel den Zeitstempel der Aufnahme. Allerdings geht das so ein bißchen in die Hose, wenn man verpeiltermaßen vergißt, der Kamera zu erklären, wann Sommer- und wann Normalzeit ist. Dann hat man unter Umständen ein Foto, auf dem zufälligerweise eine Kirchturm- oder Bahnhofsuhr abgebildet ist mit einem Zeitstempel, der eine Stunde vorher oder danach anzeigt.

Das ist mir schon einige Male passiert, und ich habe jetzt nicht wenige Fotos, bei denen die EXIF-Zeitstempel halt nicht stimmen. Und so nebenbei dann auch die Dateinamen nicht, denn die kommen zwar als IMG_nnnn.JPG von den Kameras (wobei nnnn einfach eine laufende Nummer ist, die auf 0001 zurückspringt, wenn die 9999 erreicht wurde), aber direkt nach der Übertragung auf den PC lasse ich da bereits ein eigenes Python-Script drüberlaufen, das die Zeitstempel aus den EXIF-Daten ausliest und die Dateinamen ändert in yyyymmdd-hhmmss_nnnn.jpg. Die Aufgabe war also, zum einen die Zeitstempel direkt in den EXIF-Daten der Fotos zu korrigieren und zum anderen auch die Dateinamen anzupassen.

Hinweis: Das ist jetzt nicht so wirklich eine Anleitung, eher mal wieder so ein „Froschs Lernkurve war mal wieder sehr flach“. (mehr …)


Einfach und kompliziert

Sonntag, 28. März 2021

Schon während meiner Schulzeit fiel meinen Eltern wie auch den Lehrpersonen immer wieder – und für sie offenbar sehr irritierend – auf, daß ich eigentlich einfache Aufgaben oft sehr umständlich löste. Nicht falsch, aber eben umständlich und mit viel zu hohem und gar nicht vorgesehenem Aufwand. Diese Eigenschaft blieb mir leider treu und verschaffte mir und anderen während meines Lebens eine Menge Facepalms.

Als ich 14 war, wurde zum ersten Mal ganz offiziell mein IQ gemessen, und die zuständige Psychologin war halbwegs geschockt, als sie feststellte, daß die Kurve fast nicht mehr auf den vorgesehenen Papier-Bogen paßte. Das Ergebnis: 147. Es hieß damals, das könnte der Grund für das unnötig komplizierte Denken sein. Ob das heute noch so eingeschätzt würde, weiß ich nicht.

Da mir das Thema gerade unvorbereitet, aber durchaus willkommen, einen kleinen Hyperfokus angestoßen hat, wollte ich das mal ausführlicher zeigen, was in so einem Fall – Aufgabe einfach, aber Lösung erstmal viel zu kompliziert – bei mir abläuft. (mehr …)


Spaß mit pymysql

Dienstag, 19. Mai 2020

Ihr kennt das ja schon, wenn ich „Spaß mit $irgendwas“ in die Überschrift schreibe, hat mal wieder was nicht funktioniert, wie es sollte oder wie ich mir das dachte. In diesem Fall gab's aber tatsächlich eine recht schnelle Lösung.

Kürzlich habe ich auf zwei Servern ein Upgrade auf Devuan Beowulf durchgezogen. Dann entdeckte ich jeweils im daemon.log Einträge, die mir gar nicht gefielen:

May 18 16:32:01 seelilie mysqld: 2020-05-18 16:32:01 1852 [Warning] Aborted connection 1852 to db: '[$zensiert]' user: '[$zensiert]' host: 'localhost' (Got an error reading communication packets)

Und das alle paar Minuten seit dem 14. Mai früh morgens. Die Auslöser dieser Meldungen waren aufgrund der Zeitstempel schnell gefunden: Zwei per cronjobs aufgerufene Python-Scripte von mir, mit denen ich aus den Datenbanken der ClassicPress-Installationen unterschiedliche Daten aus den Wordfence-Tabellen auslesen lasse. Das eine wird alle fünf Minuten aufgerufen und greift bei jedem Aufruf in alle konfigurierten Datenbanken, das andere wird getrennt nach Blogs ein- bis zweimal pro Tag aufgerufen.

Ein wirkliches Problem schien aber gar nicht vorzuliegen, denn die Scripte bekamen nach wie vor die gewünschten Daten. Trotzdem wollte ich die Meldungen nicht ignorieren; es könnte ja etwas sein, was erst einmal keine sichtbaren Probleme macht.

Allerdings fingen die Meldungen nicht erst mit dem jeweiligen Upgrade an, sondern bereits vorher. Das schien es erst einmal komplizierter zu machen. (mehr …)


IMAP-Inbox von Thunderbird fixen

Freitag, 24. April 2020

Eine Nutzerin hatte ein IMAP-Postfach bei einem Provider A, das sie aber gekündigt hatte. Dann änderte sie die Zugangsdaten des Postfachs auf ihren neuen Mailprovider B, statt für diesen ein neues Postfach anzulegen. Thunderbird fand auf dem neuen Server natürlich nicht mehr die bisherigen Mails vor und ging einfach mal davon aus, daß diese – auch die lokalen Kopien davon – nicht mehr relevant seien. Well, Thunderbird irrte.

(Das hätte mir übrigens auch passieren können; ich benutze ja ausschließlich POP3-Postfächer, und da geht sowas tatsächlich, denn bei POP3 braucht Thunderbird ja keine korrespondierenden Abbildungen auf dem Mailserver.)

Damit ich mir das genauer ansehen konnte, hat mir die Nutzerin ihr gesamtes Thunderbird-Verzeichnis geschickt. Nach einer kurzen Inspektion war klar: Thunderbird hat die gesamte Korrespondenz aus diesem IMAP-Postfach auch nochmal lokal gespeichert. Damit hatte ich gleich eine gute Nachricht: Verloren ist nichts, Thunderbird zeigt die E-Mails nur einfach nicht mehr an. (mehr …)


Python: (Fast) alles ist eine Liste

Samstag, 16. November 2019

„In Python ist alles eine Liste“, erklärte mir zu Beginn Bison aus dem Chaosdorf, als ich gerade anfing, Python zu lernen. An die Denkweise konnte ich mich gut gewöhnen. In den letzten Monaten ist sie mir allerdings in einem, ähm, speziellen Fall so richtig auf die Füße gefallen, und zwar im Zusammenhang mit Feldabfragen in MySQL. Heute habe ich endlich die Lösung gefunden.

Seit einiger Zeit bauen mir die Scripte aus meinem Projekt htmlglue meine statische Website zusammen. Dabei bekommt die Startseite jedes Mal ein anderes Zufallsfoto, dessen Daten aus der Datenbank meiner Media-Website gezogen werden; die Bilder selbst stehen natürlich nicht in der Datenbank, aber die Datenbank kennt den jeweiligen Pfad im Filesystem. Die Media-Website läuft unter Piwigo, und dessen Datenbank ist, wie üblich, in MySQL angelegt (ich verwende allerdings MariaDB). Und mit den zusätzlichen Informationen zu den Bildern hatte ich gelegentlich so ein kleines, größeres Problem. (mehr …)


Apache-Workaround in Python

Donnerstag, 15. Dezember 2016

Nach mehreren Tagen in einem wirklich üblen Burnout habe ich nun wieder genug Konzentration zusammen, um an einem Programmierprojekt weiterzuarbeiten. Dabei geht es um einen Workaround für einen durchaus bekannten, acht Jahre alten Bug im Webserver apache, der nicht reproduzierbar ist und daher bislang auch nicht behoben werden kann.

Mir lief dieser Bug zum ersten Mal im Jahr 2009 über den Weg, als apache2 nach dem Upgrade von Debian Etch auf Debian Lenny plötzlich zum Speicherfresser wurde. Auch ein Wechsel des Hosts änderte daran nichts, und ich wechselte ja bis 2010 sogar zweimal. (mehr …)