Samstag, September 30, 2006

Windows Application Fernsteuern

Beim durchsehen eines alten c't-Artiekls bin ich auf eine Satz mit der Aussage "mit WSH können auch Programme ferngesteuert werden, die dies nicht vorsehen" gestoßen. Genau das bräuchte ich ja, um SonicStage zu steuern. Die DLL's enthalten leider keine allgemein zugängliche Schnittstelle.

Leider können den Programmen nur Tastureingaben gesendet werden. Ein Programm kann also nur soweit gesteuert werden, wie dies mit Tasturkürzel möglich ist. Dies schränkt die Verwendung zwar ein, ist aber besser als nichts.

In einem Fazit zu Windows-Makrorecorder (Tastatur und Maus) habe ich gelesen, das keinz der Programme den Aufwand Wert ist. Zu oft öffnet sich ein unerwartetes ein anderes Fenster, dass den Fokus bekommt. Nun werden mit den ablaufenden Tastatur- und Mauskommandos irgendwelche Aktionen ausgeführt. Dies kann auch böse ausgehen. Also Infos über WSH gesucht.

WSH (Windows Scripting Host)
Ein Skript wird in VBScript oder JScript geschrieben. Als alternative Skriptsprachen gibt es unter anderem perl, REXX und Phyton. Für diese muß aber eine extra Anbindung installiert werden.
Mit wscript wird das Skript in einem Window, mit cscript in einer Konsole ausgeführt.


.bat

MS-DOS batch file - MS-DOS operating system batch file

.js

JScript file - Windows script

.vbs

VBScript file - Windows script

.wsf

Windows Script Host file - Container or project file for a Windows script; supported by WSH 2.0 and later.

.wsh

Windows Script Host files - Property file for a script file; supported by WSH 1.0 and later.



Bei VBScript handelt es sich um ein abgespecktes VBA und damit um ein sehr stark abgespecktes VB. Trotzdem hat es z.B. Error-Object-Handling und "Wiederaufsetzen".

Liste der Referenzen:
WSH
VBScript

Donnerstag, September 28, 2006

AccurateRip

Ich war mir bisher nicht sicher, wie das Ergebnis von AccurateRip zu lesen ist. Habe nun eine gute Erklährung gefunden.


Accurately Ripped (confidence 22) [b01fca7d]

22 weitere haben den Track mit der selben Checksumme gerippet

** Rip not accurate ** (confidence 23) [e8b1da0d] [94f29f63]

23 andere haben den Track mit der ersten Checksumme gerippet



Leider ist bei einer niedrigen confidence (z.B. 1) nicht klar, ob es noch andere Ripps gibt. Es wurde vorgeschlagen auszugeben, wieviele Personen Daten übertragen haben und wieviele Pressungen (verschiedene Checksummen) es gibt.

An anderer Stelle wurde sich auch oft beschwert, dass viele Daten nicht richtig selbstgebrannter (Offsetkorrektur) CD's übermitteln. Auch bin ich mir nicht sicher ob "falsch" gerippte CD's übertragen werden. EAC hatte bei mir einen Checksummenfehler bei einem Track am ende die CD aber trotzdem als "Fehlerfrei" bewertet.

Die gespeicherten Daten sind keiner CD zugeordnet. Dies kann dazu führen, das für die Titel einer CD verschiedene Confidence-Werte ausgegeben werden.

Sonntag, September 17, 2006

JDBC vom sun Java-Kurs

Programming Tasks

  • Instanze vom JDBC-Treiber erzeugen

  • JDBC-Treiber mittels jdbc.driver laden

  • Treiber registrieren

  • eine Datenbank auswählen

  • Datenbankverbindung öffnen

  • eine Abfrage ausführen

  • Ergebnisse entgegennehemen

  • alles wieder abbauen



Das java.sql Paket

  • java.sql.Driver

  • java.sql.Connection

  • java.sql.Statement

  • java.sql.PreparedStatement - Prozeduren auf Server ausführen

  • java.sql.CallableStatement - ???

  • java.sql.ResultSet

  • java.sql.ResultSetMetaData

  • java.sql.DatabaseMetaData



kann den Treiber auch beim Aufruf angeben:
java -D jdbc.drivers=com....driver myApp

Query ausführen
stmt = connection.createStatement();
int count = stmt.executeUpdate("INSERT, UPDATE oder DELETE ...");
-> Rückgabe ist anzahl der geänderten Zeilen
ResultSet rs = stmt.executeQuery("SELECT ...");
-> ab JDBC2 kann ich auch rückwärts gehen, ist aber nicht bei allen Treibern implementiert
-> schneller ist, das ganze ResultSet in einen Vektor einzulesen und auf diesem zu arbeiten - rs.getXXX greift immer wieder auf die Datenbank zu

java.sql.PreparedStatement stmt = connection.preparedStatement("UPDATE t set m = ? WHERE x = ?");
-> ? von 1 an durchnummeriert
stmt.setString(1, "Album");
for ( i ...) stmt.setInt(2, i);
-> wenn ein Query öfters gebraucht wird schneller, als wenn immer wieder über den Konstruktor erzeugt wird.

[update]
Habe dies in meinem Programm zum manipulieren der SonicStage-Database verwendet. Dort finden sich im Code noch einige Kommentare von Fettnäpfchen in die ich gedrehten war. Z.B. wie ich Zahlen als Spalten-Name im SQL-Kommando angeben muss.

Samstag, September 16, 2006

SonicStage DB und Java

Im Internet habe ich einiges zu Java JDBC-Zugriff auf Access-Datenbanken (mdb) gefunden. Leider war da keine Schritt für Schritt Anleitung dabei. Am einfachsten auszuwerten waren die Code-Schnippsel. Es hat etwas gedauert, bis ich rausbekommen habe, dass in Windows die Access-Datenbank als ODBC-Quelle angemeldet sedin muß. Statt des Codes hätte ich erst mal das Inhaltsverzeichnis der Insel (20.5.3) lesen sollen ;-).

Start -> Systemsteuerung -> Verwaltung -> Datenquellen (ODBC) -> Add ...

  • Datenquellenname: SonicStage

  • Beschreibung:

  • Datenbank: c:\Documents and Settings\All Users\Application Data\Sony Corporation\SonicStage\Packages\MtData.mdb

  • Systemdatenbank: * keine

  • Optionen und Erweitert habe ich nicht verändert


Im File-Dialog zur Datenbank wurde mit unter All Users kein Application Data angeboten. Kann den Pfad aber in das Eingabefeld kopieren und damit die originale Datenbank direkt ansprechen. Warum es nicht direkt über den File-Dialog geht weiß ich nicht.

Nachfolgend der Java-Code, mit dem der Zugriff funktioniert hat. Hierbei handelt es sich um einfache Code-Schnippsel, die in jeden JDBC-Code eingesetzt werden können.

Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );

con = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=C:/Documents and Settings/All Users/Application Data/Sony Corporation/SonicStage/Packages/MtData.mdb", "","");

ResultSet rs = stmt.executeQuery( "SELECT ObjectName, \"201\", \"203\" FROM t_object" );

Dienstag, September 12, 2006

Platte löst sich auf

Beim letzten arbeiten mit der Platte hatte ich noch nichts gemerkt. Lag aber auch möglicherweise daran, dass ich remote in den Rechner eingelogt war. Meldungen beim runterfahren des Rechners konnte ich daher nicht sehen. Erste Anzeichen gab es dann beim booten. Linux rebootete mehrmals automatisch und teite mir dann mit, das die Partition nicht automatisch wieder hergestellt werden kann. Dabei handelt es sich um eine 5 Jahre alte Maxtor 4W080H6.

dmesg zeigt eine menge Einträge der Art:
hda: task_in_intr: status=0x59 { DriveReady SeekComplete DataRequest Error }
hda: task_in_intr: error=0x40 { UncorrectableError }, LBAsect=76431159, sector=76431159
ide: failed opcode was: unknown
end_request: I/O error, dev hda, sector 76431159
EXT2-fs error (device hda8): ext2_get_inode: unable to read inode block - inode=1112449, block=2228247

Alle anderen Partitionen hatte ich am Tag vorher auf die neue 400GB-Backup-Platte kopiert. Genau für die nun defekte Partition hatte ich keine Zeit mehr gehabt. Der einzigste Trost ist, dass von den wenigen wichtigen Daten ein Backup existiert, wenn jetzt auch schon etwas älter. Die anderen Daten könnte ich, wenn sie sich nicht retten lassen wieder beschaffen. Wenn das auch mit einigem Aufwand verbunden ist. Dabei handelt es sich z.B. um kopien meiner sämtlichen Disketten. Viele dieser Daten sind mitlerweile eh veraltet, hatte mir aber noch nicht die Mühe gemacht, diese mal auszusortieren. Oder downloads von Linux-Magazin, Datasheets, etc.

Bevor ich mit den Reparaturversuchen starte will ich erst mal die Daten, bzw die Partition sichern. Das gibt mir dann auch einen Überblick, wieviele der Daten verloren sind.

Im ersten Schritt habe ich mit rsync -vna /mnt/data . 2>&1 | tee ~/rsync_hda8.log alle Dateien einzeln kopiert. Dabei bekomme ich auch eine Liste der Verzeichnisse und Dateien, die sich nicht kopieren lassen.

Im zweiten Schritt habe ich die Partition an sich kopiert und dort einen Reparaturversuch vorgenommen. Dazu habe ich dd_rescue installiert. Leider nicht bei debian dabei, es braucht aber nur ein make es zu builden. Vorgehen wie im Linux User beschrieben.

Habe dann sicherheitshalber die anderen Partitionen mit rsync getestet. Dies ging sehr einfach, da es sich beim Backup um eine 1-zu-1 Kopie auf der anderen Festplatte handelt. Dazu habe rsync wie oben mit dem zusätzlichen Parameter -n gestartet. Es erfolgt ein dry run, der alle geänderten Dateien bzw nicht lesbare auf den anderen Partition der Maxtor anzeigen würde. Hier war zum Glück alles ok.

Bis jetzt sind mir noch keine wichtigen Files aufgefallen, die defekt sind. Wenn ich wichtiges File brauche und dies defekt ist, werde ich versuchen dies wieder her zu stellen. Wenn ich mal Zeit habe, werde ich einen Reparaturversuch der kompletten Partition unternehemen. Dies ist dann mehr dazu da um Erfahrung zu Sammeln.