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!

Büropoesie – Tierwelt

Beim Aufräumen im Haufen alter Mails gefunden, nun für die Ewigkeit festgehalten:


das reh springt hoch,
das reh springt weit.
warum auch nicht,
es hat ja zeit!

das pferd springt höher
das pferd springt weiter
warum auch nicht
es hat keinen reiter

Der Elefant springt am höchsten,
der Elefant springt am weitesten,
warum auch nicht?
Er ist am breitesten...

Stand: 2007-11-09 14:25,
Autorenkürzel: AW, EÖ, PH

Die 7 häufigsten Projektprobleme

Neulich beim Aufräumen wieder einen lustigen Brief gefunden, der mir in die Firma zugeschickt wurde vom sogenannten Management Circle:

  1. Engpässe der Ressourcen – So gleichen Sie Kapazität und Produktivität mit der Praxis ab
  2. Unklare Ziele – So erhalten Sie einen eindeutigen und realistischen Projektauftrag
  3. Überlastung – So behalten Sie den Überblick und vermeiden Stress
  4. Unangenehme Wahrheiten vermitteln – Die richtige Kommunikation in kritischen Situationen
  5. Spannungen und Konflikte – So bleiben Sie sourverän und erhalten die Leistungsfähigkeit im Team
  6. Unklare Rollen und Verantwortungen – Die richtige formale Einbindung des Projektleiters
  7. Fehlende Entscheidungen – So bekommen Sie sach- und zeitgerechte Entscheidungen

Tja, mag ja sein. Aber mit dieser Aufmachung wirkt das ganze wirklich nur wie Spam in traditioneller Form.

Schade, um den toten Baum! Ach ja – das P.S. ist auch handfest:

Mit handfesten Checklisten und Leitfäden für die Praxis!

Na wenn es so einfach ist, dann sollte es ja keine Projekte mehr geben, die gegen Bäume rasen 🙂

Firewall ausgehebelt – another case of security by obscurity

Große Konzerne sind sich doch so ähnlich – heute wieder Kontakt mit einem Kunden gehabt.

Es ging darum einen statischen Prototyp zuzusenden. Da wir intern keine schnelle Möglichkeit hatten einen dedizierten FTP-Server zu haben, wurde die Arbeitskopie einfach als ZIP-Archiv an den Kunden übertragen.
Es ging um einen kleinen Prototyp mit AJAX-Aufklappgedöns.

Am folgenden Morgen tauchte eine Mail auf mit folgender Bemerkung:

Hallo Herr ICH,

das ZIP ging wegen des JS nicht durch. Bitte bitte doch mal das ZIP mit PW „firmenname“ verschlüsseln.

mit freundlichen Grüßen
Kundenvertreter

Das weckte alte Erinnerungen – die scheinbar dort vorhandene Unternehmensfirewall filterte Dateianhänge und hat eine Heuristik, dass in ZIP gepacktes Javascript (JS) gefährlich ist. Aha!

Jetzt sollte mit einem Passwort nur verhindert werden, dass die Firewall lesenden Zugriff auf die Dateianhänge hat und filternd zuschlägt – ein klarer Fall von security by obscurity. Again!

In einer vorigen Firma mit insgesamt fast 13000 Angestellten war der workaround, dass sämtliche Dateien (dort zählten auch Dateien des Office-Programmmonopolisten zur Liste der unerwünschten Inhalte) mit dem Packprogramm RAR verarbeitet wurden.

Das ist sicher eine gute Form der Verschlüsselung – oha. Sicherheit macht Spaß – besonders mit Usern, die nebenher auch noch arbeiten müssen. Da hat ein Sicherheitsexperte sicher viel Geld für eine ISO-Zertifizierung erhalten. Tolle neue Welt – und vor allem sicher!