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 🙂

PHP7 – WOW-Effekt

Da mein Hoster nun final auf PHP7 umschwenkt, dachte ich mal für einige Domains testweise umzuschalten.

Erste kleinere Warnungen im selbstgeschriebenen PHP-Code fallen auf … im Netz findet man die gleichen „Problemchen“

  • Fatal error: 'break' not in the 'loop' or 'switch' context in /your/own/file.php on line 4711

aber krass ist der Performancevorteil.

Eine lokal auf PHP5.x laufende Seite – mit nur Datums/Zeitberechnung und sonst statischer Anzeige von Links – benötigt im Schnitt
Rendering took: 0.023338 s
auf PHP7 und im Webspace des Hosters läuft das Teil mit
Rendering took: 0.001340 s

Chapeau!

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;.

Dateianzeige im Finder wie normal unter Linux

Wer erstmals an einem Rechner des Apfelherstellers arbeitet, findet es sicher auch verwirrend, dass man keine Einstellungsdateien sieht bzw. auch die Dateiendungen. Für die Konfigurationsdateien hilft folgender Aufruf in einem Terminal:

user@horst:~/ > defaults write com.apple.Finder AppleShowAllFiles TRUE
user@horst:~/ > killall Finder

Netzwerkfähigkeiten und Eckdaten der Netzwerkkarte

Wenn man vor einer Entscheidung steht auf Gigabit-LAN umzusteigen, will man eigentlich wissen, welche Netzwerkkarte verbaut ist und ob sie das überhaupt kann. Zum Glück gibt’s da was auf der Konsole:

user@box:~$ sudo ethtool eth0
[sudo] password for user:
Settings for eth0:
Supported ports: [ TP MII ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Half 1000baseT/Full
Supported pause frame use: No
Supports auto-negotiation: Yes
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Half 1000baseT/Full
Advertised pause frame use: Symmetric Receive-only
Advertised auto-negotiation: Yes
Link partner advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
Link partner advertised pause frame use: Symmetric
Link partner advertised auto-negotiation: Yes
Speed: 100Mb/s
Duplex: Full
Port: MII
PHYAD: 0
Transceiver: internal
Auto-negotiation: on
Supports Wake-on: pumbg
Wake-on: g
Current message level: 0x00000033 (51)
drv probe ifdown ifup
Link detected: yes

Einfach via

sudo aptitude get install ethtool

installiert und schon passt es.

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