Technik

YouTube, Thumbnails und WebP

04. Juli 2022 · Anwendungen · andreas · Kein Kommentar

Seit einiger Zeit wurden in meinem Firefox beim Besuch der YouTube-Website keinerlei Thumbnails mehr angezeigt, sondern stattdessen die Vorschaubilder durch einen grauen Platzhalter ersetzt.

Nachdem das testweise Abschalten der installierten Erweiterungen nicht half, führte das Anlegen eines neuen Profils zur Erkenntnis, daß es an einem Parameter des Standardprofils liegen muss.

Verantwortlich war der Parameter “image.webp.enabled”, welcher die Unterstützung für das WebP-Format regelt und auf “false” gesetzt war. Nach dem Zurücksetzen des Wertes auf den Standard “true” funktionieren die Vorschaubilder wieder wie gewohnt.


Denon PMA-50 und Linux

25. Juni 2022 · Hardware · andreas · Kein Kommentar

Der Denon PMA-50 ist ein cooler kleiner Verstärker, der neben zahlreichen analogen und digitalen Eingängen auch eine USB-B-Buchse mitbringt, mit deren Hilfe er als USB-DAC agieren kann - eigentlich ideal für den Betrieb an einem Raspberry Pi.

Durch die USB-B-Verbindung mit einem PC oder Mac können audiophile Musikliebhaber die neuesten hochauflösenden Formate zur Wiedergabe von PCM- und DSD-Dateien nutzen. Dabei werden hochauflösende PCM-Tracks mit bis zu 24 Bit/192 kHz sowie 2,8-MHz- und 5,6-MHz-DSD-Tracks unterstützt. [Quelle]

Wie erwartet bezieht sich “PC” nur auf Windows und es gibt keinerlei Information, ob ein Betrieb unter Linux möglich ist. Also hilft nur Ausprobieren - im konkreten Fall mit einem Raspberry Pi und dem aktuellen Raspbian.

Direkt beim Einstecken erkennt der Kernel den Verstärker

Jun 25 10:32:31 raspberrypi kernel: [ 880.636565] usb 1-1.3: new high-speed USB device number 4 using dwc_otg Jun 25 10:32:32 raspberrypi kernel: [ 880.768195] usb 1-1.3: New USB device found, idVendor=154e, idProduct=1003, bcdDevice= 1.00 Jun 25 10:32:32 raspberrypi kernel: [ 880.768263] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=0 Jun 25 10:32:32 raspberrypi kernel: [ 880.768298] usb 1-1.3: Product: PMA-50 Jun 25 10:32:32 raspberrypi kernel: [ 880.768322] usb 1-1.3: Manufacturer: D & M Holdings Inc. Jun 25 10:32:32 raspberrypi kernel: [ 880.807205] hid-generic 0003:154E:1003.0001: hiddev96,hidraw0: USB HID v1.10 Device [D & M Holdings Inc. PMA-50] on usb-20980000.usb-1.3/input2

und auch Pulseaudio ist zufrieden:

* index: 1 name: driver: flags: HARDWARE HW_MUTE_CTRL HW_VOLUME_CTRL DECIBEL_VOLUME LATENCY state: IDLE suspend cause: (none) priority: 9049 volume: front-left: 30419 / 46% / -20.00 dB, front-right: 30419 / 46% / -20.00 dB balance 0.00 base volume: 65536 / 100% / 0.00 dB volume steps: 65537 muted: no current latency: 68.38 ms max request: 20 KiB max rewind: 20 KiB monitor source: 1 sample spec: s32le 2ch 44100Hz channel map: front-left,front-right Stereo used by: 0 linked by: 2 fixed latency: 59.95 ms card: 1 module: 20 properties: alsa.resolution_bits = "32" device.api = "alsa" device.class = "sound" alsa.class = "generic" alsa.subclass = "generic-mix" alsa.name = "USB Audio" alsa.id = "USB Audio" alsa.subdevice = "0" alsa.subdevice_name = "subdevice #0" alsa.device = "0" alsa.card = "2" alsa.card_name = "PMA-50" alsa.long_card_name = "D & M Holdings Inc. PMA-50 at usb-20980000.usb-1.3, high speed" alsa.driver_name = "snd_usb_audio" device.bus_path = "platform-20980000.usb-usb-0:1.3:1.0" sysfs.path = "/devices/platform/soc/20980000.usb/usb1/1-1/1-1.3/1-1.3:1.0/sound/card2" udev.id = "usb-D___M_Holdings_Inc._PMA-50-00" device.bus = "usb" device.vendor.id = "154e" device.vendor.name = "D&M Holdings, Inc. (Denon/Marantz)" device.product.id = "1003" device.product.name = "PMA-50" device.serial = "D___M_Holdings_Inc._PMA-50" device.string = "front:2" device.buffering.buffer_size = "21152" device.buffering.fragment_size = "5288" device.access_mode = "mmap" device.profile.name = "analog-stereo" device.profile.description = "Analog Stereo" device.description = "PMA-50 Analog Stereo" module-udev-detect.discovered = "1" device.icon_name = "audio-card-usb" ports: analog-output: Analog Output (priority 9900, latency offset 0 usec, available: unknown) properties: active port:

Funtkioniert!


Festplatte einer virutellen Linux-Maschine vergrößern

15. Juni 2022 · Betriebssysteme · andreas · Kein Kommentar

Wenn die Festplatte einer virtuellen Maschine volläuft, so kann im Gegensatz zu physikalischen Rechnern das Problem meist recht einfach behoben werden. Etwas spannender wird es, wenn die virtuelle Festplatte partitioniert ist und bei der Erweiterung eine andere Partition im Weg ist:

$ sudo fdisk -l /dev/sda Disk /dev/sda: 30,18 GiB, 32408698880 bytes, 63298240 sectors Disk model: VBOX HARDDISK Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0xf3f6188b Device Boot Start End Sectors Size Id Type /dev/sda1 * 2048 61296639 61294592 29,2G 83 Linux /dev/sda2 61298686 63297535 1998850 976M 5 Extended /dev/sda5 61298688 63297535 1998848 976M 82 Linux swap / Solaris

Das oben stehende Beispiel zeigt eine solche Situation: die eigentliche Daten- bzw. Betriebssystempartition “/dev/sda1” kann nicht einfach vergrößert werden, da die erweiterte Partition “/dev/sda2” mit der darin enthaltenen Swap-Partition “/dev/sda5” direkt anschließend auf dem Datenträger liegt.

Weiterlesen


Perl, Unicode und Umlaute in Dateinamen

09. Juni 2022 · Programmierung · andreas · Kein Kommentar

Das Projekt klingt einfach: eine Liste von Dateinamen aus einem Verzeichnis auslesen, in einer Datenbank speichern und zu einem späteren Zeitpunkt anhand der Liste in der Datenbank wieder öffnen. Leider konnte das Skript einige Dateien nicht mehr finden, obwohl diese im Verzeichnis weiterhin vorhanden waren.

Heruntergebrochen auf ein Beispielskript sieht das Szenario wie folgt aus:

test.pl
#!/usr/bin/perl use strict; use warnings; use utf8; use DBI; # remove database unlink("files.sqlite"); # create database from scratch my $dbh = DBI->connect("dbi:SQLite:dbname=files.sqlite", "", "", { sqlite_unicode => 1 }); $dbh->do("CREATE TABLE files (name TEXT);"); # the file to be processed my $filename = "Elternschreiben Änderungen der Regelungen zum Infektionsschutz.pdf"; # create the file in the current directory open(my $fh, ">$filename"); print $fh "TEXT"; close($fh); # read files in current directory opendir(my $dh, "."); while (my $file = readdir($dh)) { next if $file !~ /pdf$/; $file = $dbh->quote($file); $dbh->do("INSERT INTO files (name) VALUES ($file);"); } closedir($dh); # get number of files with name "filename" $filename = $dbh->quote($filename); my $sth = $dbh->prepare("SELECT COUNT(*) AS cnt FROM files WHERE name = $filename;"); $sth->execute; my $row = $sth->fetchrow_hashref; print "found $row->{cnt} file(s).\n"; $sth->finish; $dbh->disconnect();

Statt des erwarteten Ergebnisses “1” ist das Skript jedoch der Meinung, keine passende Datei eingelesen zu haben:

found 0 file(s).

Um Probleme mit der Datenbank auszuschließen, kann das Szenario im Dateisystem nachgebildet werden:

test.pl
#!/usr/bin/perl use strict; use warnings; use utf8; use DBI; # the file to be processed my $filename = "Elternschreiben Änderungen der Regelungen zum Infektionsschutz.pdf"; my $found = 0; # create the file in the current directory open(my $fh, ">$filename"); print $fh "TEXT"; close($fh); # read files in current directory opendir(my $dh, "."); while (my $file = readdir($dh)) { next if $file !~ /pdf$/; if ($file eq $filename) { $found++; } } closedir($dh); print "found $found file(s).\n";

Auch hier wird statt der erwarteten “1” eine “0” für die Menge der gefundenen Dateien ausgegeben.

found 0 file(s).

Einen ersten Hinweis auf die mögliche Ursache bringt die Ausgabe der zu vergleichenden Werte mittels “Data::Dumper”. Während für “$filename” der Wert

$VAR1 = "Elternschreiben \x{c4}nderungen der Regelungen zum Infektionsschutz.pdf";

ausgegeben wird, wird für “$file” der Wert

$VAR1 = 'Elternschreiben Änderungen der Regelungen zum Infektionsschutz.pdf';

ausgegeben, d.h. die Werte der beiden Variablen sind in der internen Repräsentation in Perl tatsächlich unterschiedlich. Mit den richtigen Anhaltspunkten führt eine Suche im Internet zum Stackoverflow-Beitrag “In what encoding does readdir return a filename?” und der dort verlinkten ausführlichen Erklärung.

Des Rätsels Lösung ist die Verwendung von “Encode::decode_utf8”

test.pl
#!/usr/bin/perl use strict; use warnings; use utf8; use DBI; use Encode; # the file to be processed my $filename = "Elternschreiben Änderungen der Regelungen zum Infektionsschutz.pdf"; my $found = 0; # create the file in the current directory open(my $fh, ">$filename"); print $fh "TEXT"; close($fh); # read files in current directory opendir(my $dh, "."); while (my $file = readdir($dh)) { next if $file !~ /pdf$/; if (Encode::decode_utf8($file) eq $filename) { $found++; } } closedir($dh); print "found $found file(s).\n";

dann stimmt auch die Anzahl der gefundenen Dateien mit der erwarteten Anzahl überein:

found 1 file(s).

Debian 11, GNOME und RDP: Oh no! Something has gone wrong

27. Mai 2022 · Betriebssysteme · andreas · Kein Kommentar

Während eine RDP-Verbindung zum GNOME-Desktop mit Debian 10 problemlos funktionierte, wurde nach einem Upgrade auf Debian 11 jeder Verbindungsversuch mit “Leider ist ein Problem aufgetreten.” beendet:

Die Problematik ist sowohl auf Github unter “On Debian 11 upgraded install I get “Oh no! Something has gone wrong.” when connecting.” als auch in dem Debian Bug Report “xRDP connection results in Oh No ! something has gone wrong..Logout when Gnome Desktop used” dokumentiert, die Ursache liegt wohl in einem Fehler in der von Debian 11 ausgelieferten “xorgxrdp-0.2.12”-Version.

Da es aktuell kein fehlerbereinigtes Paket in den Standard-Paketquellen gibt, kann behelfsweise ein Paket von https://snapshot.debian.org/ verwendet werden. Die im oben genannten Github-Thread vorgeschlagenen Paketversionen “xorgxrdp_0.2.15-1_amd64.deb” sowie “xrdp_0.9.15-1_amd64.deb” laufen nach manueller Installation ohne weitere Abhängigkeiten in der Debian 11-Umgebung und ermöglichen wieder einen Zugriff auf den GNOME-Desktop mit RDP:

$ wget https://snapshot.debian.org/archive/debian/20210302T032219Z/pool/main/x/xorgxrdp/xorgxrdp_0.2.15-1_amd64.deb ... $ wget https://snapshot.debian.org/archive/debian/20210302T032219Z/pool/main/x/xrdp/xrdp_0.9.15-1_amd64.deb ... $ sudo apt install ./xorgxrdp_0.2.15-1_amd64.deb ... Die folgenden Pakete werden aktualisiert (Upgrade): xorgxrdp 1 aktualisiert, 0 neu installiert, 0 zu entfernen und 5 nicht aktualisiert. ... $ sudo apt install ./xrdp_0.9.15-1_amd64.deb ... Die folgenden Pakete werden aktualisiert (Upgrade): xrdp 1 aktualisiert, 0 neu installiert, 0 zu entfernen und 5 nicht aktualisiert. ...