Montag, 18. Juni 2012


OMG, ich habe grade einen Alptraum aus dem mich keiner weckt:


  
Bei einer Software eines großen magenta Telekommunikationsanbieter, die bei einem großen Stuttgarter Automobilkonzern im 21 Jahrhundert produktiv eingesetzt wird, habe ich ein Musterbeispiel für schlechtes DB Design gesehen. (Sollte ein Student sowas in irgendeiner DB Klausur abgeben, wird er sofort exmatrikuliert mit Empfehlung für die Baumschule).

  
Es geht um Dokumente die mehrsprachig in einer DB abgelegt werden: Titel, Name, Dateigröße, Abschnitt (=logische Gruppierung), Abschnittname etc.
  • Dokumente haben pro Sprache eine Bezeichnung und einen Dateinamen.
  • Dokumente haben eine Größe
  • Dokumente haben ein Erstellungsdatum
  • Dokumente können gelöscht sein, aber müssen in der DB bleiben
  • Es gibt verschiednene Abschnitte (aka Module)
  • Dokumente werden Abschnitten zugeordnet
  • Module haben pro Sprache genau eine Bezeichnung.

Das "Design" verstößt schon gegen die 1NF (!!!) und sieht so aus: Es wird alles in eine Tabelle geklatscht.

ID,  INTEGER
LANGUAGE,  CHAR
MODULID, INTEGER
DOC_BEZEICHNUNG, VARCHAR
DOC_FILENAME, VARCHAR
DOC_TYPE, CHAR
DOC_DATE, DATE
DOC_SIZE, CHAR
MODUL_BEZEICHNUNG, VARCHAR
GELOESCHT, CHAR
DATA, BLOB
Leute das macht jeder Schüler besser!!

Der absolute Schenkelklopfer, ist die DOC_SIZE - schaut euch mal den Datentyp an - muahaha - als CHAR. Und es kommt noch besser, der Inhalt sieht z.B. so aus "884 kB", die haben tatsächlich auch noch die Einheit mit in der gleichen Zelle abgelegt *popcornhol*. 1NF verletzt, dass muss man erstmal hinkriegen.

Ach ja 2NF ist natürlich auch gleich verletzt, Schlüssel der Tabelle ist nämlich ID + Sprache. Modulname + Bezeichnung werden redundant gehalten *gnihihii*.
 
Bin mal weg, Kotztüten sins alle...

Sonntag, 15. April 2012

Jmockit und Jacoco

Ich habe mir neulich mal JMockit genauer angeschaut. Jmockit erleichtert es SEHR Mockobjekte zu schreiben um die Interaktion zwischen Objekten zu testen.

Vorteile: Strikte Trennung von Code under Test vom Testcode und eine wahnsinns Flexibilität. Man muss die zu testenden Klassen nicht anpassen und schafft keinerlei Abhängigkeit! JMockit leitet die Calls auf getestete Klassen mittels Bytecodeinstrumentation um, und mockt diese. Man kann relativ elegant beliebige Klassen (auch nur teilweise) mocken und deren Rückgabewerte definieren.

Jetzt hatten wir hier ein Problem, weil Jacoco eingesetzt wird um die Test-Coverage zu ermitteln - also zwei Programme die den Bytecode instrumentieren. Mein Bugreport (zuerst bei Jmockit eingekippt) wurde mittlerweile sogar von Eclemma/Jacoco behoben.

Donnerstag, 25. August 2011

Welche Firma denkt sich da hier aus?

cast(null as varchar(256))

Richtig. InkompetenteBlödMänner. Bei DB2 muss alles streng typisiert sein, auch NULL. Und nein, es reicht nicht den null nur nach varchar zu casten (z.b. wenn man mit union arbeitet), man muss auch noch die gleiche LÄNGE des Datentyps angeben!!!

Freitag, 24. Juni 2011

Office Jet 6110 Scannerglas putzen

Seit kurzem hat unser OfficeJet 6110 das Problem, dass der Scanner beim anschalten rattert, als ob die Plastikzahnräder durchdrehen weil der Schlitten gegen das (Drucker)Ende fährt und durchdreht. Hat schleichend angefangen und wurde immer schlimmer, zuletzt war er nicht mehr bedienbar.

Das Problem ist simpel: Unter dem Druckerglas (nicht sichtbar von oben) ist ein Codestreifen, angebracht der dem Scanner sagt, wo das Ende ist. Ist dieser verschmutzt (es reicht wenig!) dann findet der Scannerschlitten das Ende nicht mehr.

Im Netz gibt es haufenweise Anleitungen dazu, wie man die Scaneinheit abmontiert. Allerdings ohne Bild und oft machen zwei Plastiknasen Probleme.

Ich hab mal ein paar Fotos geschossen, damit sollte es machbar sein.
  • Alle Torx Schrauben auf der Obserseite lösen
  • Kleines Scannerglas und Rahmen entfernen
  • Bedienfeld entfernen (von unten vorsichtig die Abdeckung abziehen)
  • Das darunterliegenede Panel durch lösen der Arretierung nach links schieben und nach oben abnehmen:



  • Das Panel vom Plastikband trennen (einfach abziehen)



  • Nun kann man die Scaneinheit von hinten (mitsamt Deckel) anheben, vorne blockieren allerdings noch zwei Plastiknasen. Diese zum lösen (rot markiert) nach vorne ziehen:





  • Glasunterseite mit Fensterreiniger putzen, es war kaum sichtbarer Schmutz vorhanden, aber offensichtlich hat es gereicht um den Scanner zu beinträchtigen. Der Codestreifen ist das schwarzweiße Ding.



  • Zusammenbauen in umgekehrter Reihenfolge :)


Montag, 7. März 2011

Ant Bash Vervollständigung - automatic bash completion

Wer häufig mit ant auf der Kommandozeile arbeitet (cygwin oder Linux/Unix) will vielleicht nicht ständig mittels "ant -p" nachsehen wollen wie die build targets heißen und diese von Hand eintippen.

Ant liefert schon von Haus aus ein Perl Script für die autocomplete Funktion der Unix Shells. Es liegt im "ANT_HOME/bin/" und muss nur noch mittels

complete -C /complete-ant-cmd.pl ant

registriert werden.

Beim drücken von TAB kann ant dann automatisch alle targets anzeigen / vervollständigen.



Dienstag, 30. November 2010

Oracle Support - zumindest freundlich

Der Oracle Support versucht auch mit Freundlichkeit wett zu machen, was sie an Supportqualität vermissen lassen. Ich zitiere mal:

“Hope you are doing great.

It was a wonderful experience working with you.

Da spürt man regelrecht die Erleichterung des Supportles, der uns nun endlich vom Hals hat. Der Call hat sich nämlich ewig hingezogen, und eigentlich war es ein lächerliches GUI Probleme der Weblogic Console...

Mittwoch, 24. November 2010

Neuer HP zr24w Monitor und nvidia xorg driver

Gestern kam mein neuer Monitor, der Umstieg von 17 auf 24 Zoll bringts. Die Auswahl war schon recht schwer, die Hersteller haben soch ja wohl entschieden nur noch auf Breitbild zu gehen, zum Leid derer die auch mal Bilder in Hochformat anschauen (wie ich) und NICHT primär Filme schauen wollen. Da das 4:3 Format jenseits der 22 Zoll unbezahlbar wird, hab ich mich für 16:10 entschieden, 1920 x 1200 Pixel - so mach ich wenigstens in der vertikalen keinen Rückschritt.

Es ist also ein HP ZR24w geworden - und die letzten 2 Tage hab ich damit verbracht meinem X und dem nvidia treiber die 1920x1200 Auflösung beizubringen.

Problem: Der HP Monitor liefert offensichtlich kaputte EDID Daten über DVI. (mit get-edid kann man sie nicht auslesen, auch mit nvidia-settings könnte ich kein edid file erzeugen, dass dem Treiber auf die sprünge half). Ständig ein fallback auf eine bescheurte andere Auflösung. Der clou: Analog angeschlossen geht es. Aber auch das dort erzeugte EDID file war unbrauchbar.

Letztendlich hat sich herausgestellt, das der nvidia Treiber (oder die EDID Daten) falsche PixelClockRates probiert hatte (nur 135 Mhz, der Schirm kann 170Mhz !). Das hat verhindert dass die Modes geladen werden konnten.

Option "ModeValidation" "NoMaxPClkCheck"

stellt diese Erkennung ab und damit hatte es sich bei mir erledigt - zumindest kann der Treiber den Rest korrekt aus den EDID Daten auslesen. Hier meine komplette xorg.conf die mit nivida treiber und HP zr24w und 1920x1200 funktioniert:

Section "ServerLayout"
Identifier "Layout0"
Screen 0 "Screen0" 0 0
InputDevice "Keyboard0" "CoreKeyboard"
InputDevice "Mouse0" "CorePointer"
EndSection

Section "Files"
EndSection

Section "ServerFlags"
Option "Xinerama" "0"
EndSection

Section "InputDevice"

# generated from default
Identifier "Mouse0"
Driver "mouse"
Option "Protocol" "auto"
Option "Device" "/dev/psaux"
Option "Emulate3Buttons" "no"
Option "ZAxisMapping" "4 5"
EndSection

Section "InputDevice"

# generated from default
Identifier "Keyboard0"
Driver "kbd"
EndSection

Section "Monitor"
Identifier "Monitor0"
VendorName "Unknown"
ModelName "HP ZR24w"
HorizSync 24.0 - 80.0
VertRefresh 59.0 - 61.0
EndSection

Section "Device"
Identifier "Device0"
Driver "nvidia"
Option "ModeValidation" "NoMaxPClkCheck"

EndSection

Section "Screen"
Identifier "Screen0"
Device "Device0"
Monitor "Monitor0"
DefaultDepth 24
SubSection "Display"
Depth 24
EndSubSection
EndSection