Blog

  • java.sql.SQLException: No suitable driver found for ‘jdbc:derby:…

    Kleine Gemeinheit im “Using dblook” guide (Übersichtslink):

    dblook -verbose -d ‘jdbc:derby:pathToDBDBName’

    — Zeitmarke: 2010-01-04 12:27:34.578
    — Quellendatenbank: pathToDBDBName
    — Verbindungs-URL: ‘jdbc:derby:pathToDBDBName
    — appendLogs: false

    java.sql.SQLException: No suitable driver found for ‘jdbc:derby:pathToDBDBName
    at java.sql.DriverManager.getConnection(DriverManager.java:602)
    at java.sql.DriverManager.getConnection(DriverManager.java:207)
    at org.apache.derby.tools.dblook.go(Unknown Source)
    at org.apache.derby.tools.dblook.(Unknown Source)
    at org.apache.derby.tools.dblook.main(Unknown Source)
    — **–> DEBUG: No suitable driver found for ‘jdbc:derby:pathToDBDBName

    (Fast) Derselbe Aufruf geht via ij und NetBeans …

    Lösung: dblook -d jdbc:derby:pathToDBDBName
    Unterschied: einfach ohne die Hochkommata, auch wenn es im Guide immer wieder mal mit Gänsefüßchen steht.

  • Escape analysis, Lock Coarsening und Biased locking

    Die Ausgabe 179 des “The Java Specialists’ Newsletter” stellt ein paar interessante – wenn auch noch experimentelle – Features der Server-VM vor:

    Escape analysis: Damit kann die JVM prüfen, ob ein Objekt einen bestimmten Scope nicht verlässt (z.B. nur in einer Methode verwendet wird) und dieses Objekt dann direkt auf dem Stack anlegen.

    Lock Coarsening: Fordert ein Thread aufeinanderfolgend mehrere Locks auf ein Objekt an und gibt sie dann wieder frei (wie z.B. bei der Verwendung von Vector), kann die JVM diese wiederholten, teuren Anfragen zu einem lock/release zusammenfassen,

    Biased locking: Wird ein Objekt von nur einem Thread ge’lock’ed, kann auf die Sperre ebenso verzichtet werden.

    Im The Java Specialists’ Newsletter werden einige eindrucksvolle MicroBenchmarks gezeigt, die einiges an Performance bringen können. Aber: es sind nur MicroBenchmarks, die den Effekt sehr gut zeigen. In komplexen Applikationen kann der Benefit natürlich deutlich schlechter ausfallen. Soweit ich das aus anderen Seiten gelesen habe, sind die Optionen derzeit noch als experimentell zu betrachten – aber sie sind schon ein schöner Vorgeschmack.

    Ein sehr schönes Statement im Zusammenhang mit Performance Tuning, das den Nagel auf den Kopf trifft: “Assumption is the mother of all f* ups”. Der Spruch drückt sehr schön das aus, was ich bei Performance-Optimierungen immer wieder sage: Erst Messen, dann Tunen. Und niemals Tunen ohne zu Messen. Andernfalls kann man schnell mal Stunden damit zubringen, ein Programmstück auf 5% Ausführungszeit zu drücken … das aber in der Gesamtausführung nahezu keine Zeit verbraucht – womit die Verbesserung quasi nicht existent ist. Oder schlimmer: man denkt, ein Programmteil wäre langsam, optimiert aber erfolglos an der Ursache vorbei.

    Relevante Links:

    http://profiler.netbeans.org/
  • Avoid too much sorting

    “Java is slow” is the sentence that I heard very often when I began studying computer science – and I forunately never really believed it. But why the predjudice? Well Java CAN be slow if it’s just handeled wrong. Often it’s just convenience of just the missing knowledge of implemntations that makes code slow, so I’ll try to post once in a while whenever I come across such code parts in my hobby programming or at my programmings at work.

    So my first issue is about sorting and autoboxing: About last week we profiled some code that felt just sloooow. It turned out that we lost most of the time within a certain loop that was executed very often. The critical part of the code was (stripped from all other stuff) like this :

    ArrayList<Double> list = new ArrayList<Double>(20); // keep 20 smallest calculated values
    while (condition) {
      double value = calculate(args);
      if (list.size < 20 || value < list.get(19)){
        list.add(value);
        Collections.sort(list)
      }
      // strip elements if size is > 20
    }

    So what’s the issue here?

    1. condition holds true for a LOT of iterations (well, can’t change this)
    2. the list is small (just 20) BUT it is to be sorted completely for each insert
    3. could autoboxing be an issue here?

    Okay, what did we change?

    We changed the ArrayList to a SortedDoubleArray (an implementation that I coded some time ago) that inserts the value already in the correct place using Arrays#binaraySearch() and System.arrayCopy(). As I wasn’t quite sure whether or not autoboxing could be an issue here, I created a copy of the class that operates on Doubles instead of the double primitives.

    The Test

    In order to compare the 3 methods (using Collections.sort(), and the SortedArrays using double and Double), I inserted 1,000,000 random double values into the structures and measured the times. The results are:

    • Collection.sort(): 2907 ms (=100%)
    • SortedDoubleArray (with Double-autoboxed values):  93 ms (~3%)
    • SortedDoubleArray (with double primitives):  94 ms (~3%)

    Conclusion

    • Using Collections.sort() is convenient and in most cases absolutely okay! But if you use it in critical locations within the code (for example in loops that are executed very often), you might want to check if there isn’t a better solution.
    • Autoboxing does not hurt in our case

    But never forget: Profile first, then tune. Otherwise you might tune code that has almost no impact to the overall execution time (for example, if the for-loop above is just executed 10 times).  And just change one issue after the other and perform measurements between each step so that you can identify the changes with the most impact.
    If you have no profiler at hand, you might want to try the NetBeans profier.

    value
  • How to load images in Java

    Every once in a while there is a question on the NetBeans mailinglist about how to load an image (or other ressource, like a text file) relative to the executing JAR.

    The Java Tutorial gives the answer in the chapter “How to use Icons“:

    java.net.URL imgURL = getClass().getResource("inSamePackage.png");
    java.net.URL imgURL = getClass().getResource("/de/foo/otherPackage.png");

    (more…)

  • How to pack multiple JARs into one using ANT (and NetBeans)

    Eines der Features, die ich bei NetBeans eine ganze Zeit lang nicht realisiert hatte war die Tatsache, dass NetBeans beim Compilieren automatisch ein ausführbares JAR erstellt, und JAR nebst Libraries in das “dist”-Verzeichnis im Projektordner kopiert. Das heißt das sieht dann so aus:

    Coole Sache eigentlich. Nur – um die Applikation einfach so online zu stellen oder jemandem aufs Auge zu drücken (oder in den Java Store hochzuladen), wäre es doch fein, wenn man nur noch ein einziges JAR hätte und nicht noch zusätzlich die ganzen Libs aus “/dist/libs/” mitschicken muss (und das können schon einige sein – in meinem Mini-Projekt zB schon 19).

    Viele Leute ziehen ein Jar zB einfach auf den Desktop um es direkt dort per Doppelklick zu starten. Das geht in dem Fall nicht mehr, da ja der libs-Ordner auch auf dem Desktop liegen müsste. Klar, eine Möglichkeit wäre, die Applikation woanders hin kopieren und eine Verknüpfung auf den Desktop legen – aber wir wollen dem User ja entgegenkommen.

    Also:  ein einziges JAR muss her. Im Sun Developer Network (SDN) findet sich dazu auch die passende Anleitung im Artikel: “Use NetBeans IDE 6.7 to Combine JAR Files Into a Single JAR File“. Dort wird schön erklärt, wie man die build.xml ändern muss um genau das zu erreichen.

    In diesem Sinne: Viel Erfolg beim ausprobieren.

  • Derby 10.5 mit Fetch/Offset

    Gerade gesehen, dass es in Derby 10.5 auch ein Limit-Äquivalent geben soll (mehr dazu hier).

    Im Beispiel:

    ij> SELECT NAME, SCORE FROM RESULTS ORDER BY SCORE DESC
    > FETCH FIRST 3 ROWS ONLY;
    NAME      |SCORE
    ----------------------
    John      |33
    Anne      |28
    Sue       |21
    

    Ein “richtiges” Limit wird es nicht geben, da es (noch?) nicht Teil des SQL-Standards ist.

    Siehe auch SQL:2008.

  • JXMapviewer bald ohne SwingX-WS?

    Wer mit JXMapviewer (aus SwingX-WS) gearbeitet hat (siehe früherer Post), wird früher oder später darauf gekommen sein, dass SwingX-WS nicht/kaum mehr maintained ist und man irgendwann anfangen darf, selbst zu patchen – mit der Gewissheit, dass die Änderung wohl nie in die offizielle Distribution zurückfließen wird.

    Fabrizio Giudici hat dasselbe Problem – und wie es scheint, würde er sich daran machen, die MapViewer-Komponente auszugliedern und separat weiterzuführen. Entsprechende Hinweise finden sich in seinem Blog und im Java.Net-Forum. Bleibt zu hoffen, dass er es durchzieht!

  • NetBeans mit mehr RAM starten

    Gerade eine Frage auf der NetBeans Mailinglist die Frage gelesen, wie man NetBeans mit mehr Ram starten könne.

    Eine Google-Anfrage später die Antwort:
    Eine entsprechende Einstellung lässt sich in  [NetBeans Installationspfad]/etc/netbeans.conf vornehmen.
    Aber .. welche Größe hat NetBeans denn nun per Default? Ein Blick in eben genannte Conf zeigt:

    # Note that a default -Xmx is selected for you automatically.
    # You can find this value in var/log/messages.log file in your userdir.
    # The automatically selected value can be overridden by specifying -J-Xmx here
    # or on the command line.
    

    Aha. [Userverzeichnis]/.netbeans/6.7/var/log/messages.log soll also Auskunft geben – und tut es auch. Dort steht bei mir (unter anderem)  “-Xmx407m”.

    Fragt sich, wann dieser Wert gesetzt wird. Zum Installationszeitpunkt hatte ich 1024Mb Ram verbaut – später auf 2048Mb erweitert. Auf meinem Arbeitsrechner (2048Mb Ram) steht der Wert auf “-Xmx409m” – also fast gleich. Die Vermutung liegt nahe, dass die Einstellung beim Start automatisch angepasst wird.

  • improved ButtonUI

    In the JavaGraphics Blog there are some very nice examples of how Java Buttons can be made nicely. The code is also available. So it’ a nice starting point for learning how to make own UIs! Features include:

    • cross-platform.
    • pure Java
    • Resizable
    • Vertical segments
    • Java 1.4 compatible

See the BlogPost here.

  • Java Library for reading & writing EXIF, XMP and IPTC in JPEGs

    Finally it seems that I’ve found a pure Java Library that can read and write XMP Data to and from JPEGs!

    In the past time I’ve been googling for such a library repeatedly. There are quite some libraries for just reading EXIF or IPTC data. Amongst others are Drew Noakes’ library and Imagero. As I am on the verge of adding more metadata functionality to my self-made image database I had 2 issues:

    1. A decision of how to store labels and descriptions to images: a database only without touching the images or IPTC, XMP within images (with cached information to a database). Finally I decided that I wanted to use XMP(or IPTC so that the information is kept close to the image.
    2. A library for this!

    What I’ve found so far (incomplete listing as I came across QUITE some libs for reading data):

    Imagero and Drew Noakes: Until now I was using Drew Noakes library for reding EXIF data – which was absolutely okay but couldn’t write any data 🙁 Imagero supports writing of IPTC and XMP (from what I’ve read) and is even free for non-commercial usage. But it’s not true open source and you need to request a licence every year (which works w/out problems!). Judging the work Andrey Kusnetsov (maintainer of Imagero) is putting into it I think, that’s quite acceptable.

    Adobe XMP SDK: Adobe – as the inventor of XMP – has released an SDK for reading/writing XMP. Most of the SDK is written in C, the SDK Core is also available in Java (great!) but the functionality to get and write the XMP to and from files .. is not available as Java. Quite annoying.

    Apache Sanselan: When searching for Apache Sanselan you most likely end up at the incubator-site which says that the project is in the stat of migrating into apache – the mailinglist also doesn’t work. The simple reason: Sanselan is already a part of Apache Commons. So, this new link is the place to go. The most interesting thing of Sanselan is the format support:

    • JPEG IPTC support: read (yes), write (soon), Can read IPTC data from exsiting JPEG/JFIF files WITHOUT modifying image data.
    • JPEG EXIF: read (yes), write (yes), Can read and write EXIF data to and from exsiting JPEG/JFIF files WITHOUT modifying image data.
    • XMP: read (yes), write (yes), Can read XMP XML (as as String) from […] JPEG […]. Can remove, insert and update XMP XML into existing JPEG files.

    Update: the downside of Sanselan is that development seems to have stalled. The current release is 0.97 from February 14th, 2009. :-(((