Technik

PDF-Dateien mit Ghostscript komprimieren

13. April 2025 · Anwendungen · andreas · Kein Kommentar

Um PDF-Dateien zu komprimieren, reicht Ghostscript, das auf den meisten Linux-Systemen sowieso installiert ist. An einfachsten und schnellsten geht es über die Kommandozeile:

$ gs -sDEVICE=pdfwrite -dPDFSETTINGS=/screen -dNOPAUSE -dQUIET -dBATCH -sOutputFile=<AUSGABEDATEI.pdf> <EINGABEDATEI.pdf>

Mit dem Schalter “-dPDFSETTINGS” können verschiedene Qualitätsstufen vorgewählt werden. Eine detaillierte Übersicht über die dadurch gesetzten Einstellungen liefert die Tabelle “Distiller Parameters”, eine Änderung der Auflösung enthaltener Bilder kann über den Schalter “-dColorImageResolution” gesteuert werden:

$ gs -sDEVICE=pdfwrite -dPDFSETTINGS=/printer -dColorImageResolution=100 -dNOPAUSE -dQUIET -dBATCH -sOutputFile=<AUSGABEDATEI.pdf> <EINGABEDATEI.pdf>

App hat unerwartete Berechtigung: android.permission.OTHER_SENSORS

05. April 2025 · Betriebssysteme · andreas · 2 Kommentare

Bei der Installation des Fossify SMS Messenger aus dem F-Droid Store hat mich eine Meldung irritiert:

App hat unerwartete Berechtigung: android.permission.OTHER_SENSORS

Die Meldung wird von F-Droid in Zusammenhang mit GrapheneOS erzeugt, der zugehörige Hinweis findet sich in der Ankündigung zu F-Droid 1.22

  • show toast when APK has more permissions than expected (if your Android distro injects extra permissions, you’ll know)

in Kombination mit dem GrapheneOS-Forum:

The network and sensors permissions don’t exist on regular Android. They have been added by GrapheneOS. As such, apps don’t know how to request them. Leaving them on by default is done to maintain compatibility. [Quelle]

Für was Sensoren verwendet weren (können), kann man der Entwicklerdokumentation zu Android entnehmen:

Most Android-powered devices have built-in sensors that measure motion, orientation, and various environmental conditions. These sensors are capable of providing raw data with high precision and accuracy, and are useful if you want to monitor three-dimensional device movement or positioning, or you want to monitor changes in the ambient environment near a device. [Quelle]

Ob eine App tatsächlich Zugriff auf die Sensoren benötigt bzw. darauf haben soll(te), kann man bei GrapheneOS im Gegensatz zu anderen Android-Distributionen einstellen. Ein Entzug der Berechtigung kann allerdings zu Problemen führen, sollte eine App das Fehlen von Berechtigungen nicht abfangen.

2025-06-26: Herkunft und Grund der Meldung präzisiert, siehe Kommentar von Frederik.

WordPress-Kommentar zu einem anderen Beitrag verschieben

16. März 2025 · Anwendungen · andreas · Kein Kommentar

WordPress bietet standardmäßig keine Möglichkeit, einen Kommentar zwischen verschiedenenen Beiträgen zu verschieben. Das Vorgehen hierbei ist aber recht ähnlich dem Verschieben aller Kommentare.

Zunächt müssen die IDs der beiden Beiträge ermittelt werden, zwischen denen verschoben werden soll sowie die ID des zu verschiebenden Kommentars. Wer das nicht direkt in der Datenbank erledigen will, kann die WordPress-Oberfläche zu Rate ziehen: einfach beim jeweiligen Artikel bzw. Kommentar auf “Bearbeiten” klicken und die ID aus der URL entnehmen, z.B. “/wp-admin/post.php?post=4392&action=edit” und “/wp-admin/comment.php?action=editcomment&c=6493”.

Dann kann der Kommentar verschoben werden:

UPDATE wp_comments SET comment_post_ID = <ID_neuer_Beitrag> WHERE comment_ID = <ID_Kommentar>;

Anschließend muß noch die Anzahl der zu den Beiträgen vorhandenen Kommentare korrigiert werden, was mit zwei weiteren SQL-Befehlen erledig ist:

UPDATE wp_posts SET comment_count = (SELECT COUNT(*) FROM wp_comments WHERE comment_post_ID = <ID_alter_Beitrag> AND comment_approved = 1) WHERE ID = <ID_alter_Beitrag>; UPDATE wp_posts SET comment_count = (SELECT COUNT(*) FROM wp_comments WHERE comment_post_ID = <ID_neuer_Beitrag> AND comment_approved = 1) WHERE ID = <ID_neuer_Beitrag>;

rsync kopiert immer wieder alle Dateien neu auf USB-Stick

01. März 2025 · Anwendungen · andreas · Kein Kommentar

Gerade wenn es darum geht, daß nur ein Delta kopiert werden soll, ist rsync (gegenüber z.B. cp) mein Werkzeug der Wahl. Umso erstaunter war ich daß rsync bei einem

# rsync -av /meine-quelle /mnt/stick/

immer wieder alle Dateien neu auf den USB-Stick kopierte, auch wenn zwischenzeitlich an der Quelle keine Änderungen vorgenommen wurden.

Einen ersten Hinweis auf die Ursache liefert der Beitrag “rsync to USB flash drive always transferring all data” bei Stack Exchange, denn der Stick war tatsächlich mit exFAT formatiert.

Eine Suche nach Hintergrundinformationen führte zum Microsoft Dev Blog-Beitrag “Why does the timestamp of a file increase by up to 2 seconds when I copy it to a USB thumb drive?

This means that copying a file to a FAT-formatted device (typically a floppy drive or a USB thumb drive) can increase the timestamp by up two seconds.

in dem die Erklärung, warum immer aufgerundet wird, gleich mitgeliefert wird:

To avoid this infinite loop, the convention is always to round up, so that the copy of a file is never older than the original.

Zumindest der referenzierte Knowledge Base-Artikel “KB127830 - Time Stamps Change When Copying From NTFS to FAT” ist über die WaybackMachine des Internet Archive noch zu finden und erklärt den Mechanismus:

File time stamps on FAT drives are rounded to the nearest twoseconds (even number) when the file is written to the drive. The file timestamps on NTFS drives are rounded to the nearest 100 nanoseconds when thefile is written to the drive. Consequently, file time stamps on FAT drivesalways end with an even number of seconds, while file time stamps on NTFSdrives can end with either even or odd number of seconds.

When files are copied from NTFS drives to FAT drives, somefile time stamp rounding has to occur; the file time stamp is rounded up to the next even second.

Auch wenn sich das Beispiel auf NTFS vs. FAT bezieht, gilt das gleiche auch im Hinblick auf ext4 und FAT. Abhilfe schafft der Parameter “–modify-window” auf den auch die rsync-FAQ hinweist:

Another common cause involves sending files to an Microsoft filesystem: if the file’s modified time is an odd value but the receiving filesystem can only store even values, then rsync will re-transfer too many files. You can avoid this by specifying the –modify-window=1 option.

Mit dem Aufruf

# rsync -av --modify-window=1 /meine-quelle /mnt/stick/

lässt sich rsync von der Rundung nicht mehr aus der Ruhe bringen und verhält sich wie erwartet.


Portable Perl-Skripte unter Windows

15. Dezember 2024 · Programmierung · andreas · Kein Kommentar

Um ein Perl-Skript portabel zu machen, muß zusammen mit dem Skript auch die Perl Laufzeitumgebung sowie die benötigten Bibliotheken ausgeliefert werden.

Befragt man die Suchmaschine der Wahl, landet man meist bei der Empfehlung, einen Perl-Packer zu nehmen, von denen es im CPAN zwei Stück gibt: PAR-Packer und perlcc, wobei von der Verwendung von perlcc im produktiven Umfeld ganz klar abgeraten wird: “Use for production purposes is strongly discouraged.”.

Mit pp gibt es ein eigenes Skript, auf Basis von PAR ausführbare Dateien erzeugt und ein Skript mitsamt aller benötigter Bibliotheken in einer einzelnen .EXE-Datei verpackt.

Das Packen ist recht flexibel und schnell erledigt, die einzelnen Optionen können in der Dokumentation nachgeschlagen werden.

pp -o test.exe --gui --addfile=test.ini --addfile=test.ico test.pl -T test

Wer noch gerne ein schöne(re)s Icon für die erzeugte .EXE-Datei verwenden möchte, kann dies mit einem Einzeler hinzufügen:

perl -e "use Win32::Exe; $exe = Win32::Exe->new('test.exe'); $exe->set_single_group_icon('test.ico'); $exe->write;"

Als Ergebnis wird eine Datei “test.exe” erzeugt, die dann auf ein System ohne Perl-Laufzeitumgebung kopiert und dort ausgeführt werden kann. Die Beschreibung “perlcc that works without hassle” klingt erstmal gut und die Ergebnisse funktionieren, bringen aber leider in der Anwendung einige Probleme mit sich:

Technisch gesehen wandelt pp nicht wirklich das Skript in eine .EXE-Datei, sondern erzeugt ein selbstenpackendes Archiv, dessen Inhalt nach dem Entpacken letztendlich ausgeführt wird. Das Archiv wird standardmäßig ins TEMP-Verzeichnis des ausführenden Benutzers entpackt, was spätestens dann zu Problemen führt, wenn - aus guten Grund - unprivilegierten Benutzern das Ausführen von Code innerhalb des TEMP-Verzeichnis verboten ist.

Zum Entpacken wird ein Verzeichnis nach dem Muster “%TEMP%\par-USER\cache-GUID” angelegt, wobei USER durch eine Hex-Repräsentation des ausführenden Benutzers und GUID durch einen Hash der ausführbaren Datei ersetzt wird. Letzteres lässt sich mit Hilfe des Parameters “-T” durch einen festen Wert ersetzten, so daß der Pfad dann “%TEMP%\par-USER\cache-test” lautet.

Durch das Cachen der entpackten Dateien wird bei späteren Starts die Wartezeit deutlich verkürzt, je nach System und Anzahl der Benutzer können aber zahlreiche Dateileichen im Temp-Verzeichnis verbleiben.

Manuelle Paketierung

Abgesehen von der suboptimalen Ausführung erledigt pp das Sammeln aller benötigter Dateien sowie Erstellen des Pakets zuverlässig, so daß sich die Verwendung von pp als Zwischenschritt zum manuellen Packen anbietet.

Nach dem erstmaligen Ausführen der von pp erzeugten Datei werden folgende Inhalte des Verzeichnisses “%TEMP%\par-USER\cache-test” in ein Arbeitsverzeichnis kopiert:

  • der komplette Ordner “inc” inklusive aller darin enthaltenen Unterverzeichnisse
  • die Dateien “libgcc_s_seh-1.dll”, “libstdc++-6.dll”, “libwinpthread-1.dll” sowie “perl530.dll”

Anschließend kann noch etwas augeräumt werden:

  • im Ordner “inc” können die Dateien “MANIFEST” sowie “META.yml” gelöscht werden
  • im Ordner “inc/script” kann die Datei “main.pl” gelöscht werden

Zum Ausführen müssen aus der Perl-Installation noch zwei Dateien kopiert werden:

  • die Datei “perl.exe” oder “wperl.exe” aus dem Ordner “perl/bin” ins Arbeitsverzeichnis - je nachdem, ob es sich um eine Kommandozeilen- oder GUI-Anwendung handelt
  • die Datei “lib.pm” aus dem Ordner “perl/lib” in den Ordner “inc/lib”

Anschließend kann aus dem Ordner “inc” das Skript mit folgendem Aufruf gestartet werden:

..\perl.exe -I lib script\test.pl