Schnelles Teilen von Dateien / lokaler Http-Server mit Python

Wenn man das Problem hat, dass Datenmengen geteilt werden sollen, die zu groß für FAT-formatierte USB-Sticks sind, braucht man einen kleinen HttpServer, damit man die Daten ganz einfach via
http://localhost:8000
herunterladen kann:

$ python -m SimpleHTTPServer 8000 (Python 2.x)
$ python -m http.server 8000 (Python 3.x)

Niemand will derlei Attachementbomben per Mail oder Onlinechat versenden 🙂

DB2 wieder eine besondere Datenbank

In der letzten Zeit durfte ich mit einer neuen relationalen Datenbank arbeiten. Nach langer Zeit mit dem Oracle dachte ich, dass die anderen Anbieter weniger besonders sind, aber dieses Tier hat es auch in sich.

  1. Die spärlich vorhandene Dokumentation des Herstellers mit den 3 Buchstaben ist schwer durchsuchbar und kaum suchmaschinenindiziert.
  2. Die Datenbank meldet Fehler in einer Form von Telefonnummern. Durch einen bestimmten JDBC-Verbindungsparameter
    jdbc:db2://ipOfDB2Host:50000/DB2_TEST:retrieveMessagesFromServerOnGetMessage=true;
    kann man auf Fehlermeldungen umschalten, die aber nur für wenige Fehler wirklich aussagekräftig sind:
    Internal Exception: com.ibm.db2.jcc.am.BatchUpdateException: [jcc][t4][102][10040][4.16.53] Batchfehler. Der Batch wurde übergeben, jedoch ist mindestens eine Ausnahmebedingung bei einem Einzelelement im Batch aufgetreten.
    2013/09/06 11:26:56.217 | Verwenden Sie getNextException(), um die Ausnahmebedingungen für bestimmte Elemente im Batch abzurufen. ERRORCODE=-4229, SQLSTATE=null
    2013/09/06 11:26:56.227 | Error Code: -4229
  3. Datenbanktabellen kommen intern in einen Status ‚Benötigt Reorganisieren‘ (Pending Reorganize). Das Recht Tabellen zu Organisieren hat man nicht automatisch, wenn man das ALTER TABLE-Recht hat. Welche Operation den Status auslöst, findet man hier.
  4. Entgegen dem Verhalten anderer Datenbanken kann man Indexe mehrfach anlegen – beim 1.Mal wird ein Index angelegt, bei allen anderen Malen das Kommando ohne Kommentar ignoriert. Stattdessen werfen andere Datenbanken Ausnahmen, denen man entnehmen kann, dass die Datenbankindexe bereits existieren.

Komisch, dass es die nicht vom Markt gefegt hat oder einfach durch eine freie Alternative ersetzt wurde wie H2 oder PostgreSQL

DB2 Pending Reorganize auf Datenbanktabellen – was ist der Auslöser für den Status?

Wieder mal ein DB2-Rätsel – welche Operationen führen dazu, dass die Tabelle in den ‚benötige Reorganisieren‘-Modus kommt?
Hintergrund ist, dass beispielsweise keine Indexe angelegt werden können, wenn die Tabelle ein reorg benötigt. Dazu muss man ein Spezialskript aufrufen.

Abhilfe schafft folgendes Beispielskript, das eine Tabelle FOO anlegt und nacheinander Änderungen vornimmt:

CREATE TABLE FOO (
ID INTEGER GENERATED ALWAYS AS IDENTITY NOT NULL,
METADATAKEY VARCHAR(255),
METADATAVALUE VARCHAR(255),
VERSION int
);
COMMIT;

select * from FOO;
insert into foo (METADATAKEY, METADATAVALUE, VERSION) values ('sch','asdasdasd','1');
select * from FOO;
COMMIT;

select indname, colnames from syscat.indexes where tabname = 'FOO';
select TABSCHEMA, TABNAME from SYSIBMADM.ADMINTABINFO where REORG_PENDING = 'Y';
COMMIT;

ALTER TABLE FOO ADD FORCE_REENTER_UMD SMALLINT DEFAULT 0 NOT NULL;
select TABSCHEMA, TABNAME from SYSIBMADM.ADMINTABINFO where REORG_PENDING = 'Y';
COMMIT;

ALTER TABLE FOO DROP FORCE_REENTER_UMD;
COMMIT;
ALTER TABLE FOO ADD FFORCE_REENTER_UMD SMALLINT DEFAULT 0 NOT NULL;
COMMIT;
select * from FOO;

CREATE INDEX INDEX_2COL_2GTHR ON FOO (METADATAKEY, METADATAVALUE);
select indname, colnames from syscat.indexes where tabname = 'FOO';
select TABSCHEMA, TABNAME from SYSIBMADM.ADMINTABINFO where REORG_PENDING = 'Y';
COMMIT;

Call Sysproc.admin_cmd ('reorg Table FOO');
COMMIT;

SELECT EJB.ID from FOO EJB;
COMMIT;

select TABSCHEMA, TABNAME from SYSIBMADM.ADMINTABINFO where REORG_PENDING = 'Y';
COMMIT;

DROP TABLE FOO;
COMMIT;

Interessant, dass ein Index anlegen die Änderung nicht zur Folge hat sondern das Löschen von Tabellenspalten. Hintergrund ist, dass es nicht auf allen relationalen Datenbanken ein Spalte umbenennen gibt. Daher wird man in manchen Situationen ein ALTER TABLE DROP COLUMN foo; machen und danach ein ALTER TABLE ADD COLUMN newFoo;.

Datenbank – Normalformen – Merkspruch

Gelegentlich wird man ja doch gefragt wie Normalisierung zu verstehen ist und in welcher Normalform ein Datenbankschema ist – da passte es, dass ich kürzlich auf dem ToRead-Stapel einen Artikel der Wikipedia vor mir hatte.

Nun der dort erwähnte Merkspruch zur Ablage:

»The key, the whole key, and nothing but the key. So help me Codd!«

Damit ergeben sich die verschiedenen Normalformen recht einfach:

  1. NF: atomare Werte beziehen sich nur auf den Schlüssel
  2. NF: atomare Werte beziehen sich bei zusammengesetzten Schlüsseln jeweils auf den gesamten
  3. NF: alle Werte hängen nur direkt vom Schlüssel ab

Zug verpasst – lustige Leute – Kein Schwanz ist so hart wie das Leben

Manchmal trifft man auf Leute im Berufsverkehr, die einem den morgen unerträglich machen – andere sorgen für ein Lächeln auf den Lippen.

Als ich heute wieder vergebens nach dem Regio rannte und vor verschlossenen Türen stand und der Zug gerade losfuhr, meinte ein vorbeilaufender Passant süffisant:

Was gut ist, kommt wieder.

Daraufhin konnte ich nur verlegen lachen und mich auf zur S-Bahn machen – daraufhin er:

Kein Schwanz ist so hart wie das Leben.

Damit war alles gesagt für diesen Tag im Berliner Berufsverkehr

Eclipse Indigo einrichten – SVN/Maven

Die Zwischenzeit konnte ich nutzen, um meine virtuelle Maschine und das Äpfelchen auf den aktuellsten Stand zu bringen.

Um ins SVN der Firma zu kommen, muss wieder ein wenig manuell nachgearbeitet werden.

Zuerst das aktuelle 4.4/Luna-Eclipse runterziehen:

  • Eclipse Luna 4.4 – Standard
  • Eclipse Luna 4.4 – JavaDevelopers

Dann noch Subversion installieren:

  • Mac: Collab.net-Gedöns installieren – man muss sich leider anmelden
  • Ubuntu: aptitude install subversion libsvn-java

Eclipse-Plugins installieren

Über den Eclipse-Marktplatz die folgenden Plugins nachinstallieren und dann jeweils Eclipse neu starten:

  • Subclipse (Tigris) – SVN-Provider (nicht: Subversion nehmen sonst kommt alles durcheinander)
  • M2 – Maven2Eclipse – Eclipse-Maven-Integration
  • Maven Development Tools
  • Moreunit
  • EclEmma
  • EGit
  • Gradle

Eclipse-Konfiguration nachziehen

Die JavaHL-Bibliothek liegt nicht an Standardpfaden, weshalb die Eclipse-Konfigurationsdatei eclipse.ini angepasst werden muss – die Zeile muss eingefügt werden:

  • Mac: -Djava.library.path=/opt/subversion/lib
  • Ubuntu: -Djava.library.path=/usr/lib/jni

Sobald die Konfig nachgezogen ist, sieht man bei einem Neustart im Einstellungsfenster zu Team/SVN, dass JavaHL zur Auswahl steht. Dann funzt alles.

Ansonsten nicht vergessen, dass das Repo mit svn+ssh in der URL eingebunden werden muss.

So – nun also mit der neuen Version am Start und ready 2 rumble 🙂

Die Alternative mittels MacPorts die Bindings sowie eine aktuelle SVN-Version auf dem Mac zu installieren haben nicht funktioniert, weil MacPorts mit Schmerzen abbrach.

Hilfereiche Links sind ebenfalls:

ungewöhnlicher Mac-Ärger – Rechner startet nicht, Festplatte defekt, Klickibuntu-Tool hilft nicht

Kaum ist die Elternzeit vorüber, ruft die Arbeit wieder …. und ungewöhnliche Probleme begrüßten mich gestern morgen.

Mein iMac startete nicht mehr – kurz kam ein Fortschrittsbalken, der Dateisysteme geprüft hat. Dann ging die Dose aus 🙁

Die Admins hatten wie immer keine richtige Ahnung – also starten von der Installations-DVD (‚C‘ während des Bootens halten) – Festplattendienstprogramm aufrufen und Festplatte überprüfen und reparieren.

Fehlermeldung: wrong node count

Das grafische Tool stellte die Arbeit ein und empfahl die bestehenden Daten zu sichern, die Platte zu formatieren und dann die Daten wieder zurückzuspielen – glücklicherweise kann das alles das Disktool der Installations-DVD.

Also:

  • Von der gesamten Platte ein Backup ziehen (komprimiertes Image auf externe via USB angeschlossene Festplatte) – hat bei 213 GB Daten ca. 4 Stunden gedauert. Zum Glück gab es einen USB-SATA-Adapter, in den man eine rumliegende Festplatte einfach einstecken konnte.
  • Dann das Backup validiert – dauerte ca. 3 Stunden.
  • Am nächsten Morgen dann das Backup zurückgespielt in der Menüoption Wiederherstellen. Dabei als Quelle das gestrige Image genommen und als Ziel die Festplatte.
  • Wieder 4 Stunden auf das Zurückspielen gewartet.
  • Hoffnungsvoll neu gestartet …
Aber: gleiches Problem!
Dann ein wenig recherchiert und die folgenden 2 äußerst hilfreichen Artikel gefunden – was für ein Glück, dass unter dem Mac ein BSD liegt und daher normale Funktionen wie eine Konsole gehen:
Also einfach: Apfel-S nach dem Versuch mit Apfel-V machen und schon geht’s los.
  1. Beachten, dass es die englische Tastatur ist: ein Unterstrich _ befindet sich auf dem ß/?
  2. fsck_hfs -dr /dev/rdisk0s2
  3. Das Dateisystem wird geprüft und der interne Index neu aufgebaut.
  4. Wenn alles erfolgreich repariert wurde: reboot
Dann hatte der Spuk ein Ende und der Rechner kam wieder hoch!
Also gleich noch ein wenig ausgemistet, damit die Updates beim nächsten Mal nicht so groß sind und geprüft, dass Time Machine auch brav Updates einspielt – es gibt auch die Möglichkeit den Schneeleoparden mit einem Time Machine-Backup wiederherzustellen.
Hoffentlich war’s das!

CSS kann Inhalte umwandeln

Durch Zufall entdeckt, dass man via CSS auch Inhalte automatisch anpassen kann – insbesondere praktisch, wenn die Daten aus Datenbanken kommen oder andere Quellen im Spiel sind:


h4 {
font-family: Arial;
font-size: 12px;
text-weight: bold;
letter-spacing: 0;
margin:0;
text-transform: uppercase
background: none repeat scroll 0 0 transparent;
color: black;
}

Noch viel mehr Spielereien sind möglich.

SVN ignore – manuell editieren

Manchmal will man auf der Konsole fix was ändern an den SVN-ignore-Einstellungen oder falls grad kein Eclipse mit installiertem SVN zur Hand ist:
svn propset svn:ignore 'build' .
Fügt das Verzeichnis oder die Datei build dem svn ignore hinzu.

Wenn es für das aktuelle Verzeichnis bereits ein svn ignore gibt, hilft:
svn propedit svn:ignore .

So kann man fix auf der Konsole aufräumen. Wichtig ist, dass man danach mittels svn commit natürlich das betroffene Verzeichnis eincheckt.

Externe Quellen: