DVD-Film in Endlos-Wiedergabe / -Wiederholung / Endlosschleife

Für die Standalone-Präsentation von Filmen ist es geschickt, wenn die DVDs am Ende wieder von vorne anfangen zu spielen. Zwar gibt es auch DVD-Player die dies können, allerdings muss das über eine Repeat- oder Loop-Funktion meistens bei jedem Einschalten bzw. Abspielen eines Films erneut eingestellt werden. Für den unbeaufsichtigten Tagesbetrieb ist das eher unpraktikabel.

Daher habe ich nach einer (kostenlosen) Möglichkeit gesucht, eine DVD zu produzieren, die automatisch startet und am Ende wieder von vorne beginnt. Wer über entsprechende Software verfügt, sollte es problemlos mit einem professionellen Programm zur DVD-Erstellung auch schaffen.

Für alle anderen empfehle ich zwei Tools. Als erstes eines, zum Einlesen der DVD. Da einige dieser Tools einen zweifelhaften Ruf besitzen, möchte ich keines davon verlinken. Allerdings geht es in meinem Fall hier um selbst produzierte Filme, die keinen Schutz aufweisen und für deren Kopien ich das Einverständnis der Autoren habe. Für diesen Zweck gibt es eine Reihe von Programmen die DVDs einlesen, die keinen Schutz / keine Verschlüsselung aufweisen.

Als zweites Tool habe ich DVDStyler verwendet. Eventuell kann DVDStyler auch direkt den Film einer vorhandenen (eingelegten DVD) einlesen und weiterverwenden, allerdings hat dies bei mir nicht ganz geklappt. Außerdem gibt es von DVDStyler sogar eine “PortableApp”-Version.

In diesem Programm muss man den Film hinzufügen. Außerdem muss man scheinbar zwingend ein Menü anlegen, ansonsten war die DVD bei meinen Tests gar nicht abspielbar. Für meine Zwecke habe ich an erster Position auf der DVD ein leeres “vmMenü” angelegt und in dessen Eigenschaften unter “Vorbefehle” den Befehl “jump title 1;” (ohne Anführungszeichen) eingetragen. Den gleichen Befehl habe ich im darauf folgenden Film (Titel 1) bzw. bei mehreren Filmen im letzten Film unter “Nachbefehle” eingetragen. In den DVD-Eigenschaften habe ich die Option “Erstelle Sprungziele” aktiviert und “Erstelle das leere Menü falls nicht vorhanden” deaktiviert. Vielleicht geht das ganze auch mit anderen Optionen, aber so wie erklärt hat es bei mir genügt.

java.​awt.​Container.add() … validate()!

java.​awt.​Container:

public Component add(Component comp)
Appends the specified component to the end of this container. This is a convenience method for Container.addImpl.

Note: If a component has been added to a container that has been displayed, validate must be called on that container to display the new component. If multiple components are being added, you can improve efficiency by calling validate only once, after all the components have been added.

ffmpeg: Convert .ogv to .flv: Unsupported codec (id=0) for input stream #0.0

Anstatt:

ffmpeg -i in.ogv -f flv -s 640x480 out.flv

die Audio-Streams neu zuordnen:

ffmpeg -i in.ogv -f flv -s 640x480 -map 0.1:0.0 out.flv

Workshop: Mit Zeichen-Kodierungen hantieren

Um Textdateien zwischen verschiedenen Zeichenkodierungen zu konvertieren, bieten viele Texteditoren entsprechende Funktionen an.

Diese Konvertierung kann man beispielsweise mit dem Tool iconv durchführen. Dazu kann man zuerst eine Liste der dem Tool bekannten Zeichenkodierungen anzeigen lassen:

iconv -l

Zu beachten ist dabei, dass die Bezeichnungen der Zeichenkodierungen je nach Betriebssystem variieren. Wenn man die passenden Kodierungen gefunden hat, gibt man Quell- und Zielkodierung für die Konvertierung an (hier von MACROMAN nach ISO-8859-1):

iconv -f MACROMAN -t ISO-8859-1 source.txt > result.txt

Falls ein Zeichen in der Ziel-Zeichenkodierung nicht vorhanden ist, gibt iconv eine Fehlermeldung wie diese aus:

iconv: illegal input sequence at position 43

Damit das Programm mit Konvertierungsproblemen umzugehen weiß, kann man sich entscheiden, die betroffenen Zeichen entweder zu verwerfen (//IGNORE) oder diese Zeichen anhand einer internen Tabelle in ähnliche (in der Ziel-Zeichenkodierung enthaltene) Zeichen umzuwandeln. Die Optionen werden direkt hinter der Ziel-Kodierung angegeben:

iconv -f MACROMAN -t ISO-8859-1//TRANSLIT source.txt > result.txt

Um das verantwortliche Zeichen genauer zu untersuchen, kann man die Datei mit einem Hex-Editor betrachten und den oktalen Wert des Bytes an dieser Stelle heraus finden:

$ hexdump -cb source.txt
0000000   D   i   e   s       i   s   t       d   i   e       Q   u   e
0000000 104 151 145 163 040 151 163 164 040 144 151 145 040 121 165 145
0000010   l   l   -   D   a   t   e   i       u   n   s   e   r   e   s
0000010 154 154 055 104 141 164 145 151 040 165 156 163 145 162 145 163
0000020       W   o   r   k   s   h   o   p   s 324   !  \n            
0000020 040 127 157 162 153 163 150 157 160 163 324 041 012            
000002d

Anschließend kann man das gefundene Zeichen (hier mit dem Oktalwert 324) mit tr löschen (oder durch ein anderes Zeichen ersetzen):

tr -d '\324'

InternetExplorer < 7

Wie gutgläubig waren die Entwickler?

<script>
var x = clipboardData.getData("Text");
</script>

Bilder von einer “defekten” Speicherkarte retten

Vor kurzem hat sich bei mir eine SD-Karte verabschiedet. Da das System (in allen Lesegeräten!) E/A-Fehler gemeldet hat, war ich mir recht sicher, selbst nichts mehr retten zu können.

Bei einer weiteren Karte sah es schon anders aus. Die fotografierende Person hat berichtet, dass die Kamera bei der Aufnahme einen Fehler brachte. Das zuletzt aufgenommene Bild war auf der Kamera nur noch “halb” zu sehen. Die Speicherkarte war zu diesem Zeitpunkt etwa zur Hälfte belegt.

Nach einem Neustart der Kamera war dann Schluss: die Kamera bot nur noch an, die vermeintlich kaputte Speicherkarte zu formatieren. Via Kartenleser an den PC (bzw. hier: Mac) angeschlossen, schlug das Betriebssystem ebenfalls ein Formatieren der Karte vor.

Da die Karte in diesem Fall ja noch erkannt wurde und das Betriebssystem auch keine “I/O-Errors” o.ä. protokollierte, versuchte ich mich an einer Rettung.

Zuerst habe ich (direkt vor Ort unter MacOS X) mittels dd ein Image der Karte angelegt. Bei der (bereits oben erwähnten) Hälfte der Karte brach der Lesevorgang dann ab, nur der erste Teil war im Image gesichert.

Ein erster Rettungsversuch an besagtem Image mit TestDisk (Frank erinnert sich hoffentlich!) brachte mich leider nicht weiter. Trotz diversen Hinweisen auf den mutmaßlichen Partitionstyp hat das Programm keine Partition mehr gefunden.

Da es sich in diesem Fall ausschließlich um JPEG-Dateien handelte, kam mir eine Suche nach Dateimustern in den Sinn. Vielleicht habe ich mich auch deshalb nicht weiter mit der Rettung durch TestDisk befasst. Basierend auf TestDisk gibt es inzwischen das Tool PhotoRec – speziell für die Rettung von Fotos auf Datenträgern.

Das Werkzeug läßt sich sehr einfach (im Prinzip wie TestDisk) bedienen und hat bereits nach wenigen Sekunden alle noch lesbaren Bilder gefunden.

Die Vermutung, dass die Kamera nach der Hälfte der Speichers auf der Karte wieder begonnen hat, am Anfang weiter zu schreiben (und damit die Partitionstabelle samt magischem Bitmuster zu überschreiben), brachte mich auf zwei Ideen:

  • Vor einiger Zeit kursierten Meldungen über billige Speichermedien, in denen nicht die beworbene Speichermenge verbaut wurde.
  • Vielleicht ist einfach nur an dieser “Grenze” (sprich der Grenze zur zweiten Hälfte) ein bzw. der zweite (?) Speicherbaustein ausgefallen.

Da es sich um eine Speicherkarte eines Herstellers handelt, der mit 30 Jahren “Garantie” wirbt, bin ich gespannt unter welchen Bedingungen nun eine neue Karte erhältlich sein könnte.

In diesem Zusammenhang möchte ich noch H2cdimage erwähnen, das mir beim Einlesen von problematischen CD/DVDs bereits oft geholfen hat. Auf dieser Seite sind außerdem noch weitere ähnliche Werkzeuge aufgeführt.

Zum Auffinden von Dateien anhand von Mustern hatte ich auch noch ein weiteres Programm im Kopf. Leider habe ich es bisher nicht wieder gefunden. Es gibt inzwischen eine riesige Anzahl an (kommerziellen) Daten-Rettungs-Werkzeugen, die einem leider etwas die “Sicht” nehmen…

Nachtrag:
MacOS X bietet beim Einlegen folgende Optionen an: Datenträger auswerfen, formatieren oder ignorieren. Zur weiteren Untersuchung an der Kommandozeile kann man den Dialog entweder “stehen lassen” oder auf ignorieren drücken.

Unter MacOS X alle Datenträger auflisten:
diskutil list
oder dann direkt eine bestimmte Platte mit
diskutil list /dev/diskX

TestDisk empfiehlt übrigens anstatt mit /dev/diskX zu arbeiten, das zugehörige Raw-Device unter /dev/rdiskX zu verwenden.

Von Feisty zu Gutsy und von Gutsy zu Hardy.

Ein Upgrade des kompletten Systems auf eine neue Version funktioniert unter Debian bzw. Ubuntu eigentlich ganz gut. Da Feisty (7.04) allerdings seit Oktober vergangenen Jahres nicht mehr unterstützt wird, sind auch die zugehörigen Paketquellen verschwunden. Also ist eigentlich eine Neuinstallation angebracht. Da ich jedoch ein System hatte, das völlig unkritisch war, wollte ich das Upgrade unbedingt ausprobieren.

Um generell ein Upgrade der Distribution durchzuführen benötigt man das Python-Script do-release-upgrade (in der Server-Version, ansonsten bietet einem der Update-Manager das Upgrade an). Falls es nicht installiert ist, bekommt man es mit dem Paket update-manager-core aus dem Release-Archiv unter http://old-releases.ubuntu.com/ubuntu

Nach der Installation kann man mit do-release-upgrade zum nächsten Release wechseln (hier 7.10). Allerdings ist im Upgrade-Paket der Ubuntu-Mirror des jeweiligen Landes eingetragen – der in diesem Fall jedoch wie bereits gesagt, die benötigten Pakete nicht mehr liefert. D.h. das Upgrade einer Distribution ist Angelegenheit der momentan installierten Distribution – einige Pakete müssen aus den Paketquellen des installierten Releases heruntergeladen werden.

Hier ist beschrieben (im Beitrag “Vin’c said on 2009-02-27:”, leider sind keine Anker auf der Seite), wie man in den Upgrade-Vorgang eine Pause einbaut, die Adresse des Servers ändert und dann wieder die sources.list der alten Distribution anlegt, so dass der Upgrade-Prozess den Namen der Distribution darin austauschen kann.

Das Upgrade ging bei mir am Ende mit diversen “Segmentation Faults” schief. Die Lösung gibts hier. Allerdings konnte ich das Paket libc6-xen schon nicht mehr installieren, weshalb ich zuerst das Verzeichnis /lib/tls von einem funktionierenden System kopieren musste. Nach einigen aptitude -f install war dann 7.10 endlich installiert und lief auch nach einem Neustart noch einwandfrei.

Also auf zum Upgrade 7.10 auf 8.04 LTS. Ein do-release-upgrade sollte es erledigen. Allerdings kam das Script nicht über den Versuch hinaus, die Liste der Distributionen herunterzuladen. Auch der manuelle Aufruf über die Python-Shell brachte mich nicht weiter.

Okay, ich die Suche nach der Ursache dauerte mir zu lange. Einfach gutsy durch hardy in der /etc/apt/sources.list ersetzt, aptitude update und anschliessend ein aptitude dist-upgrade aufgerufen. Die Auflösung eines kleinen Konfliktes bestätigt, danach nochmals ein upgrade ausgeführt und schon war ich am Ziel:

root@cx2:/root# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 8.04.2
Release: 8.04
Codename: hardy

Unterwegs hatte ich noch folgende Befehle gebraucht, vielleicht helfen Sie dem ein oder anderen ja auch mal weiter:

Herausfinden, zu welchem Paket eine installierte Datei gehört:
dpkg -S /pfad/zu/datei

Für nicht installierte Dateien verwendet man entweder “apt-file” oder die Suche der Distribution (http://packages.ubuntu.com – zweites Formular!)

Liste der Installierten Pakete erzeugen und diese Pakete (woanders) wieder installieren:
dpkg --get-selections | grep "\binstall" | awk '{print $1}' > list.txt
xargs -n1 aptitude install -y < list.txt

(Oder via --set-selections)

Ubuntu Hardy 8.04.2 LTS unter XEN 3.0: Installationshürden…

Da der Supportzeitraum des vorherigen Systems schon lange peinlicher weise viel zu lange abgelaufen war, musste eine aktuelle Version her. Ich habe mich für die LTS-Ausgabe von Hardy entschieden, da diese bis 2013 unterstützt wird.

Bei der Installation unter XEN 3.0.x sind ein paar Probleme aufgetreten, die ich hier kurz für die Nachwelt (vor allem für mich wenn ich ehrlich bin) archivieren möchte:

Eigentlich dachte ich, mit dem Paket libc6-xen auf der sicheren Seite zu sein was die “Segmentation Faults” und die TLS-Libraries betrifft. Die Installation alleine genügt jedoch nicht. Folgendes muss noch ausgeführt werden, damit die Anwendungen auch diese libc verwenden:

echo 'hwcap 0 nosegneg' > /etc/ld.so.conf.d/libc6-xen.conf && ldconfig

Da das /tmp-Verzeichnis auf einer eigenen Partition liegt (noexec, nosuid, …) und unter /tmp eingebunden wird, müssen die Rechte nach dem ersten Mount gesetzt werden (das gleiche betrifft ggf. /var/tmp):

chmod 0777 /tmp && chmod +t /tmp

Nach dem debootstrap darf man sich noch mit den “Locales” beschäftigen (im laufenden System bzw. im chroot):
cat > /var/lib/locales/supported.d/de <<EOF
de_DE.UTF-8 UTF-8
de_DE@euro ISO-8859-15
EOF

locale-gen
export LC_ALL=de_DE.UTF-8
update-locale

Dann sollte man aber auch im SSH-Client (zumindest in Putty) den Zeichensatz auf UTF-8 stellen.

Typo3 und PHP 5.2.4: Leerer BODY in HTML, Empty BODY-Tag

Nach dem Update auf PHP 5.2.4 geben Typo3-Installationen im Frontend nur noch Seiten aus, bei denen zwischen den Body-Tags kein Inhalt mehr steht. Das Backend funktioniert allerdings und die restlichen Angaben (Titel, Meta-Tags, usw.) werden auch ausgegeben.

Nach langer Suche bin ich auf dieses Problem und die Lösung dazu gestoßen.

Typo3 Debugging / Logging aktivieren

Zuerst sollte man sicherstellen, dass das Protokollieren von Fehlern von PHP generell richtig eingestellt ist (Hinweise: richtige php.ini, error_reporting).

Dann lassen sich folgende Optionen in der localconf.php setzen, um möglichst alle Fehlermeldungen in Typo3 einzuschalten:
$GLOBALS['TYPO3_DB']->debugOutput = true;
$TYPO3_CONF_VARS['SYS']['displayErrors'] = '1';
$TYPO3_CONF_VARS['SYS']['sqlDebug'] = '1';
$TYPO3_CONF_VARS['FE']['debug'] = '1';

Wenn das Backend generell funktioniert, kann man noch das Admin-Panel aktivieren über Template:Setup:
config.admPanel = 1

Um eine defekte Datenbank-Tabelle zu finden kann man das MySQL-Query-Log einschalten und durchschauen oder auch einfach bei MyISAM-Tabellen diese prüfen:
find /var/lib/mysql/ -name '*.MYI*' -exec myisamchk {} \;