Kategorie: Technik

Denon PMA-50 und Linux

· · · 0 Kommentare

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

· · · 0 Kommentare

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.

Sofern man nicht gerade mit einer virtuellen Maschine arbeitet, deren Verlust man verschmerzen kann, sollten die folgenden Schritte nicht ohne vorherige Komplettsicherung durchgeführt werden.
Es kann immer etwas schiefgehen und schlimmstenfalls steht man am Ende des Prozesses mit einer Maschine da, deren Partitionen beschädigt sind und die ggf. nicht mehr in der Lage ist, zu starten.

Weiterlesen


Perl, Unicode und Umlaute in Dateinamen

· · · 0 Kommentare

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:

#!/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:

#!/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"

#!/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

· · · 0 Kommentare

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.
...

Exiled Kingdoms-Spielstände bearbeiten

· · · 0 Kommentare

Auch wenn es meist der erste Schritt ist, jeglichen Spielspaß zu runinieren, so gibt es ab und an Situationen, in denen man eine kleine Korrektur an einem Spielstand vornehmen möchte. Nachdem die Suche nach "Exiled Kingdoms savegame editor" zu keinerlei Treffern geführt hat, hieß es selbst tätig werden.

Diese Beschreibung bezieht sich auf die Spielstände der Exiled Kingdoms Android-Version 1.3.1182, bei anderen Versionen kann die Vorgehensweise unterschiedlich sein.

Zuerst müssen die Spielstände aus dem geschützen Speicher des Android-Geräts in einen zugänglichen Bereich exportiert werden, dies geschieht im Spiel mittels der Funktion "Continue Game" / "Export & Cloud Save" / "Export your saves to a file". Im Datenverzeichnis des Android-Geräts (i.d.R. "/storage/emulated/0/") wird eine Datei "EK.bak" angelegt, welche die Spielstände enthält.

Das Bearbeiten erledigt man am einfachsten am PC, wohin die Datei als nächstes übertragen wird. Bei der "EK.bak" handelt es sich um eine normale ZIP-Datei:

$ file EK.bak
EK.bak: Zip archive data, at least v2.0 to extract

Umbenennen ist nicht notwendig, die Datei kann direkt ausgepackt werden:

$ unzip EK.bak
Archive: EK.bak
  inflating: saves/0/auto.sav
  inflating: saves/0/auto.sav.nfo 
  ...
  inflating: saves/global.sav

Nach dem Entpacken liegen die einzelnen Spielstände im Verzeichnis "./saves/0", eine Beschreibung des Spielstands kann der jeweiligen "nfo"-Datei entnommen werden:

$ cat auto.sav.nfo 
Frozen Depths
      [GREEN]Level 9.[] Day 36, 4 AM

Die Spielstände selbst sind allerdings (noch) nicht direkt bearbeitbar, sondern wurden im "base64"-Format kodiert. Die Umwandlung ist allerdings schnell erledigt:

$ base64 -d auto.sav > auto.txt

Jetzt kann die Datei "auto.txt" mit einem Texteditor geöffnet und bearbeitet werden. Hierbei sollte nach Möglichkeit ein Texteditor verwendet werden, der weder die Zeichenkodierung noch die Zeilenenden verändert.

...
stats: {
	cached_maxhp: 99
	characterRace: HUMAN
	cached_level: 9
	missingHP: 126
	XP: 41911
	characterClass: WARRIOR
	cache_valid: true
}
...

Sobald die gewünschten Änderungen durchgeführt wurden, wird die Datei wieder zurückkodiert und die Textdatei (sofern gewünscht) wieder gelöscht:

$ base64 -w 0 auto.txt > auto.sav
$ unlink auto.txt

Dann wird das ZIP aktualisiert

$ zip -f -r EK.bak saves/
freshening: saves/0/auto.sav (deflated 86%)

Anschließend wird die "EK.bak" zurückkopiert und in Exiled Kingdoms mittels der Schritte "Continue Game" / "Export & Cloud Save" / "Restore your saves from a file" wieder importiert.