Montag, 1. November 2010

Flac-Dateien mit Lame codieren.

Da ich die Archivierung meiner Audio-CDs speziell der Hörbücher im verlustlosen Flac-Format mache, stellt sich bei der Wiedergabe im Auto das Problem, dass nur die wenigsten Auto-Radios das Flac-Format unterstützen. Daher müssen die Daten für die Wiedergabe im Auto umgewandelt werden.

Ich gruppiere die Audio-Tracks meiner Hörbücher nach CDs. Dadurch ergibt sich eine zweistufige Ordnerstruktur. Auf der obersten Ebene werden die Verzeichnisse nach Autor und Titel benannt, darunter befinden sich die Ordner für die einzelnen CDs und darin befinden sich die Tracks der jeweiligen CD. Das sieht folgendermaßen aus:


Bei der Codierung für das Auto muss diese Ordnerstruktur natürlich erhalten bleiben. Außerdem müssen die Attribute (Tags) der einzelnen Tracks erhalten bleiben, damit im Auto nicht nur kryptische Dateinamen angezeigt werden.

Insgesamt benötigt man die drei Programme flac, metaflac und lame, um die Codierung durchführen zu können. Die Decodierung übernimmt flac, die Attribute werden mit metaflac ausgelesen und lame codiert alles zu entsprechenden MP3-Dateien, die von jedem MP3-fähigen Autoradio abgespielt werden können.

Mittels metaflac können die Tags eines jeden Tracks ermittelt werden:
$ metaflac --export-tags-to=- CD1/01\ -\ Nordemoor\ CD1_01_Die\ Worte\ Waren\ Mit\ Bleistift....flac 
TITLE=Nordemoor CD1_01_Die Worte Waren Mit Bleistift...
ARTIST=Arnaldur Indridason
TRACKNUMBER=1
TRACKTOTAL=16
ALBUM=Nordermoor
ARTISTSORT=Arnaldur Indridason
DISCNUMBER=1
DISCID=01102e10
MUSICBRAINZ_DISCID=KJNYnzSmMvZBLYakHUtVxKAy5uw-
Dabei entsteht eine einfache Liste, die aus dem Tag-Namen, dem Gleichheitszeichen und dem jeweiligen Tag-Wert besteht.

Dekodiert man die Flac-Datei mit dem Befehl
$ flac -dcs
kann die Ausgabe direkt in den Lame-Codierer gepipet werden. Beim Aufruf von Lame müssen die zuvor ermittelten Tags als Komandozeilenargumente angegeben werden:
$ lame -S -b $BITRATE -h --tt "$TITLE" --tn "$TRACKNUMBER" \
--ty "$DATE" --ta "$ARTIST" --tl "$ALBUM" --add-id3v2 - "$MP3"
Das muss für jede Datei gemacht werden und die Verzeichnishierarchie muss erhalten bleiben. Man will das also nicht per Hand machen. Es bietet sich an, dafür ein kleines Bash-Script zu erstellen. Mit dem Script f2m kann die Umwandlung problemlos für viele Hörbücher in einem Rutsch durchgeführt werden:
$ f2m ~/Audio/Hörbuch/*
Dabei werden für alle Verzeichnisse in den Komandozeilenargumenten entsprechende Verzeichnisse für die MP3-Dateien erstellt.
Alle Flac-Dateien werden unter Beibehaltung der Tags in entsprechende MP3-Dateien
umgewandelt.

Der Quellcode des Scriptes ist in einem Mercurial-Repository auf Google-Code zu finden.

Samstag, 30. Oktober 2010

Google sperrt Debian aus

Mit einem der letzten Updates bei Google funktioniert der Dienst "Text & Tabellen" mit dem Debian-Standardbrowser nicht mehr:


Bis vor ein paar Tagen war der Zugriff problemlos möglich.

Es sieht so aus als ob es sich dabei um einen weiteren Versuch handelt den eigenen Chrome-Browser zu pushen, da auf einem Debian-Stable-System der Google-Dienst nur noch mit Googles Browser erreichbar ist.

Man kann das Problem lösen, indem man die Bezeichnung des Browsers auf der Konfigurationsseite about:config auf Firefox ändert:


Dadurch ändert sich die Browseridentifikation von:
Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.0.19)
Gecko/2010091807
Iceweasel/3.0.6 (Debian-3.0.6-3)
zu:
Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.0.19)
Gecko/2010091807
Firefox/3.0.6 (Debian-3.0.6-3)
Man kann sehen, dass sich der Debian-Browser vor der Änderung ziemlich eindeutig als ein Browser der Mozilla-Familie mit einer Gecko-Engine auszeichnet. Diese beiden Kennzeichnungen sind für die Kompatiblität des Browsers signifikant. Warum Google meint, darauf bestehen zu müssen, dass beim Browser-Namen auch noch Firefox steht, wissen nur die Götter.

Freitag, 5. März 2010

ORA-29516: Aurora assertion failure

Die obige Fehlermeldung erhält man, wenn man auf einer Oracle 10gR2 Datenbank eine Java Stored Procedure aufruft, die man zuvor zwar erfolgreich mit dem JDeveloper 11gR1 in die Datenbank exportiert hat, wobei man aber die folgende Warnung übersehen hat:
ORA-29552: verification warning: java.lang.UnsupportedClassVersionError: Class1 (Unsupported major.minor version 50.0)
Hintergrund des Problems ist, das die in Oracle 10g verwendete Java-Version nicht mit der Version übereinstimmt, die im JDeveloper 11g standardmäßig verwendet wird. Abhilfe kann man dadurch schaffen, dass man in den Project Properties des betreffenden JDeveloper Projekts in der Rubrik Compiler die Option JDK Version Compatibility für Generated Class Files auf "1.4" setzt.


Danach läuft der Export ohne Fehler durch und der Aufruf der Stored Procedure funktioniert ebenfalls. Voraussetzung dafür ist aber, dass die Session beendet und neu aufgebaut wird, da bei Oracle die virtuellen Maschinen an den Sessions hängen und nicht damit klarkommen, wenn man eine Java-Klasse für eine laufende virtuelle Maschine redefiniert.

RemoteOperationException: ERROR: Wrong password for user

Nach der Installation von Oracle 10gR2 auf einem WindowsXP-System schlägt die Anmeldung am Oracle Enterprise Manager fehl, wenn der Benutzer mit dem man sich anmelden möchte auf dem System keine Rechte zum "Anmelden als Stapelverarbeitungsauftrag" hat (meine Hochachtung an die Microsoft-Übersetzter). Der Fehler tritt bei der Anmeldung folgendermaßen in Erscheinung:


Das Problem kann dadurch behoben werden, dass das betreffende Konto, mit dem man die Anmeldung durchführt, in die Liste derer aufnimmt, die die Berechtigung "Anmelden als Stapelverarbeitungsauftrag" besitzten:


Die Berechtigung ist in der Rubrik "Zuweisen von Benutzerrechten" unter den "Lokalen Richtlinien" zu finden.

Sonntag, 21. Februar 2010

Radio-Musik mit Streamtuner aufzeichnen

MP3-Radios kann man mit den beiden Programmen Streamtuner und Streamripper aufzeichnen. Sie gehören bei Debian zum Standardumfang und können mit
apt-get install streamripper streamtuner
installiert werden. Streamripper kann einen definierten MP3-Datenstrom aufzeichnen und den Datenstrom nach Liedern zerteilen während Streamtuner eine Oberfläche bietet, um in diversen Internet-Verzeichnissen interessante MP3-Sender zu finden.

Bei der Aufzeichnung wird aber leider nicht nur Musik aufgezeichnet. Zusätzlich finden sind auf der Festplatte je nach Sender noch Werbung und Jingles, auf die man eigentlich gut verzichten kann. Den Junk kann man aber erfreulicherweise einfach anhand der Dateilänge der MP3-Datei erkennen. Alle Dateien, die kleiner als ca. 2 MB sind enthalten höchstwahrscheinlich kein komplettes Lied. Um den Müll loszuwerden, muss man mit zwei Verzeichnissen arbeiten. Das erste ist ein temporäres Verzeichnis, in das Streamripper die MP3-Dateien schreibt und das zweite ist das Verzeichnis, in dem man die fertigen Musikstücke ablegt. Ein Cron-Job kümmert sich darum, dass nur die richtigen Musikstücke in das dafür vorgesehene Verzeichnis verschoben werden. Die folgende Anleitung beschreibt die Konfiguration, mit der man genau das erreichen kann.

Zuerst muss man ein Verzeichnis für die temporären Daten machen:
$ mkdir ~/.streamripper
Dann muss man Streamtuner so konfigurieren, dass Streamripper die Daten in dem Verzeichnis ablegt.


Als nächstes kann das Verzeichnis anlegen, in das die fertige Musik gespeichert werden soll.
$ mkdir -p ~/Audio/Webradio
Und nun fehlt nur noch ein Cron-Job, der die MP3-Dateien entsprechend verschiebt. Der Befehl ist etwas komplizierter und sieht folgendermaßen aus:
$ crontab -l
# m h  dom mon dow   command
*/5 * * * * find ~/.streamripper -type f -name \*.mp3 -mmin +5 -size +2000k -not -path '*/incomplete/*' -print0 |xargs -i -0 mv --backup=numbered \{\} ~/Audio/Webradio/.
Alle fünf Minuten werden im temporären Verzeichnis unter den vollständigen MP3-Dateien die gesucht, die sich innerhalb der letzten 5 Minuten nicht geändert haben und die größer als 2 MB sind, um sie in das Verzeichnis für die fertige Musik zu verschieben.

Wenn man jetzt noch Zielverzeichnis im Streamtuner konfiguriert


zeigt das Programm auch die fertige Musik schon nach wenigen Minuten an.


Es sei noch angemerkt, dass sich mit der Zeit im temporären Verzeichnis ziemlich viel Müll ansammelt, den man von Zeit zu Zeit entsorgen sollte.

Donnerstag, 21. Januar 2010

Zeitstempel für Oracle-Sitzungen auf das ISO-Format setzen

Oracle konvertiert bei jeder Ausgabe von Zeit- oder Datumsinformationen die Daten in das Format, das der Client benötigt. Man kann die Parameter der aktuellen Sitzung mittels des folgenden Befehls abfragen:
SELECT * from NLS_SESSION_PARAMETERS;
Für die Verarbeitung von Zeit- und Datumsangaben in Programmen empfiehlt es sich das numerische ISO-Format zu verwenden. Die Standardeinstellungen sind aber lokalisiert, wodurch das Datum in der üblichen deutschen Notation erscheint. Für Berichte ist das eine sinnvolle Einstellung. Für die maschinelle Verarbeitung aber unpraktisch. Mittels des Befehls
ALTER SESSION
können jedoch alle Parameter für die aktuelle Sitzung angepasst werden. Wenn sekundengenaue Zeiten ausreichen, kann eine sinnvolle Parametrisierung folgendermaßen aussehen:
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';
ALTER SESSION SET NLS_TIME_FORMAT = 'HH24:MI:SS';
ALTER SESSION SET NLS_TIME_TZ_FORMAT = 'HH24:MI:SS TZH:TZM';
ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT = 'YYYY-MM-DD HH24:MI:SS TZH:TZM';

Freitag, 15. Januar 2010

RAW-Druck über CUPS unter Debian (Lenny) aktivieren

Die Standardkonfiguration unter Debian (Lenny) für CUPS ermöglicht keinen Remote-Druck im RAW-Mode. Notwendig ist das wenn man Epson Easy Photo Print unter Linux benutzen will. In Verbindung mit Wine funktioniert das Drucken mit den Epson-Druckertreibern nicht. Deswegen bleibt einem zur Zeit nur die Möglichkeit über eine Virtualisierung. Mit VirtualBox kann man relativ leicht sog. "Shared Folders" einrichten, die den Zugriff auf die Fotobestände ermöglichen.


Damit das Ausdrucken der Fotos genauso einfach klappt müssen ein paar Änderungen an der Standardkonfiguration von CUPS geändert werden. In der Datei /etc/cups/mime.convs muss am Ende die folgende Zeile aktiviert werden:
application/octet-stream application/vnd.cups-raw 0 -
In der Datei /etc/cupsd.conf muss die Listen-Anweisung angepasst werden:
Listen *:631
Außerdem muss noch der Zugriff freigegeben werden indem eine Allow-Anweisung eingefügt wird:
<Location />
Order allow,deny
Allow all
</Location>
Anstatt "all" sollte das lokale Subnetz verwendet werden. Als letztes muss CUPS noch einmal neu gestartet werden:
/etc/init.d/cups restart
Als nächstes kann der Netzwerk-Drucker unter Windows installiert werden.


Dabei ist die Adresse des CUPS-Servers, der Port und der Name des Druckers in Form einer URL anzugeben. Abschließend muss noch der zuvor installierte Treiber ausgewählt werden. Wenn alles richtig konfiguriert ist, kann man danach einfach mit Epson Easy Photo Print drucken.