Autorenarchiv

Javascript Datum

Montag, 25. Oktober 2010

Ich entwickelte an einer Web-Anwendung mit dem Javascript Framework Ext JS, welches für alle gängigen Browser funtkionieren soll. Wie bei vielen anderen Entwicklern ist auch bei mir der Firefox mit dem Firebug Plugin die erste Wahl, was den Browser betrifft. Neben Firefox lief auch in Googles Chrome die Anwendung wie erwartet. Ein Test im Internet Explorer führte aber dazu, dass einige Dialoge sich nicht öffnen ließen und der Browser sich aufhängte. Mein erster Verdacht war: “Hmm, da unterstützt Ext JS wohl doch nicht alle Browser gleichermaßen gut.” Ein wenig Javascript Debugging sollte Aufschluß über diese Problematik geben. Die Verabarbeitung kam bis zu einer Stelle, an der ein Datum geparst wurde.

new Date('2100-01-01')

Nach dem Auskommentieren lief auch im IE alles problemlos – was war nun falsch an diesem Ausdruck, der im Firefox und im Chrome funktionierte?

Es kam heraus, dass der IE mit dem String nichts anfangen kann und NaN (Not a Number) zurückgibt. Das Problem wäre sofort ersichtlich gewesen, würde nicht die Methode clearTime() aufgerufen werden, welche auf NaN angewendet, anscheinend eine Endlosschleife auslöst. Die Lösung war letztendlich die Javascript-Doku unter Selfhtml zu lesen und das Datum korrekt anzugeben.

Date(2100, 0, 1)

Hierbei ist zu beachten, dass der Monat mit 0 beginnt!

Es lag also nicht am Ext JS, sondern an der falschen Notation des Datums.


Andreas Siepert


Die kleinen Helfer von Eclipse

Montag, 01. Februar 2010

Dass Eclipse vieles zum komfortablen Entwickeln bietet, dürfte jedem Entwickler klar sein. Sicherlich kennen viele die Möglichkeit, Getter und Setter generieren zu lassen, so dass einem eine Menge stupider Schreibarbeit erspart bleibt. Ebenfalls unter dem Menü Source (Shortcut: ALT+SHIFT+S) findet man weitere Möglichkeiten, um trivialen Code generieren zu lassen. Hierzu gehört z.B. das Erzeugen des Konstruktors, welcher alle Felder als Parameter hat. Interessant ist aber auf jeden Fall auch der toString-Generator. Wer kennt es nicht, wenn in den Log-Ausgaben kryptische Java-ReferenzIds stehen. Da wünscht man sich, man hätte toString() überschrieben, um ein paar mehr Informationen für die Fehlersuche zu bekommen. Wie bei den Getter und Setter Methoden, kann man sich die Schreibarbeit ersparen und einen Generator bemühen, der einem alle gewünschten Felder ausgibt. Ein großes Plus ist auch die Konfigurierbarkeit – man kann z.B. auch angeben, welchen Builder man für die Erzeugung des Strings nutzen möchte oder nach welchem Muster der String erzeugt werden soll.

toString-Methode generieren

Ein Blick lohnt sich auf jeden Fall!


Andreas Siepert


PDF Dokumente für den Druck

Freitag, 06. November 2009

Das PDF-Format ist eine einfache Art Dokumente auszutauschen, die wohl jedem Computernutzer bekannt ist. Jemand verfasst ein Dokument und erzeugt z.B. mittels der OpenOffice Suite ein PDF daraus, welches von jemand anderem mit einem entsprechendem Viewer wiedergegeben werden kann. Bei diesen Schritten gibt es im Normalfall keine Probleme, was das Arbeiten mit PDF-Dateien auszeichnet.
Die sehr umfangreiche PDF-Spezifikation ([SPEC]) lässt allerdings vermuten, dass das nicht immer der Fall ist, wenn man in den professionellen Bereich vordringt.

Folgendes Problem beschäftigte uns:
Um PDFs mit unserer Software weiterverarbeiten und letztendlich drucken zu können, ist es notwendig, dass sie das DIN A4 Format haben – hierbei wird die MediaBox der Seite geprüft. Es lag ein Dokument vor, welches die A4-Maße deutlich überschritt und somit zurückgewiesen wurde. Eine Analyse zeigte, dass die MediaBox, wie vermutet, von den gültigen Maßen abwich – entgegen allen Erwartungen besagte die Anzeige der Eigenschaften in einem PDF-Viewer, dass es sich trotzdem um ein A4 Dokument handelt. Die PDF-Spezifikation musste Klarheit verschaffen.
Neben der MediaBox gibt es weitere “Box”en – z.B. TrimBox, CropBox – die Einfluss auf die “PageBoundaries” eines Dokuments haben (s. [WIKI]). Die MediaBox beschreibt lediglich die physikalischen Ausmaße des Zielmediums – in unserem Fall A4. Das Dokument, welches wir bekommen hatten, wurde für einen Druckprozess erzeugt. Damit enthielt es neben dem eigentlichen Inhalt noch Meta-Informationen, wie z.B. Druckmarken, Falzmarken, die für den Druckprozess relevant sind. Diese Markierungen dürfen natürlich nicht auf den Inhalt gedruckt werden. So ist es nachvollziehbar, dass die Meta-Informationen auf einem eigenen Bereichen erscheinen müssen, um den das physische Medium (die MediaBox) vergrößert wird. Die Lösung des Problems war letztendlich, dass die PDFs nicht für den Druck erzeugt werden und somit die MediaBox wieder der Größe des Inhalts entspricht.
Positiver Nebeneffekt war, dass auch weitere nicht benötigte Informationen (Farbprofile, etc.) nicht mehr im PDF vorhanden waren und die Dateigröße deutlich gesenkt werden konnte – von ca. 2MB auf 600kb.

Quellen:
[SPEC] PDF Spezifikation Version 1.7
[WIKI] PDF in Wikipedia


Andreas Siepert


Stringvergleiche mit Collator

Freitag, 06. März 2009

Für sprachabhängige Vergleiche von Zeichenketten bietet Java die Klasse Collator. Meist ist das Ergebnis eines Collator-Vergleichs intuitiv und sofort nachvollziehbar. Es gibt aber Fälle, wo man schon mal ins Grübeln kommt.
Das Ergebnis eines Vergleichs zweier Zeichenketten a und b kann -1. 0, 1 sein und bedeutet, dass a kleiner als, gleich, größer als b ist. Völlig klar sind folgende Beispiele:

Collator collator = Collator.getInstance();
coll.compare("abc", "xyz"); //= 1
coll.compare("bcd", "bdd"); //= 1
coll.compare("123", "xyz"); //= -1, da Buchstaben > Zahlen

Einiges Grübeln verursachten die folgenden Vergleiche:

Collator collator = Collator.getInstance();
coll.compare("5_", "-9")); // (1)
coll.compare("5_", "-0")); // (2)

Anzunehmen ist, dass beide dasselbe zurückliefern – dies ist aber nicht der Fall. Der Vergleich (1) resultiert in -1 und (2) in 1.
Bei einem Blick hinter die Kulissen zeigte sich, dass der java.text.RuleBasedCollator zum Einsatz kommt. Dieser arbeitet, wie der Name andeutet, mit regelbasierten Vergleichen.
Die deutschen und z.B. auch englischen Regeln betrachten das Zeichen ‘-’ als ein ignorierbares Zeichen. Daraus folgt, dass letztendlich nur noch 5 mit 9 bzw. 0 verglichen wird.

Wenn also ein Vergleich ein unerwartetes Ergebnis zu Tage fördert, liegt es vielleicht an einer nicht so intuitiv nachvollziehbaren Regel.

Genauere Informationen gibt es in den Javadocs des RuleBasedCollators

Andreas Siepert


Andreas Siepert