Why You Should Bother About 2°

26. January, 2008




Example of the Lorentz attractor










Orders of magnitude (energy)
Thermal energy
Global warming
A Java applet where you can play with the Lorentz attractor

Safer Java: No Pseudo Constants

24. January, 2008

Even the pros do it: String “constants” i.e. a string literal (that is something between ” quotes) used as a “constant”.

That’s almost as bad as using integer values as arguments instead of defining symbolic names for them! I mean, the values passed into this API are defined by the standard, aren’t they? Sure, you can pass additional feature names as well but that doesn’t stop anyone from defining those which the standard defines somewhere! So what that not all of them must be supported!

There are several reasons why you should always define string constants when your API need strings as parts of it’s “configuration”:

  1. It makes it much more simple to find possible values for your API.
  2. Auto completion in an IDE is possible and helps to avoid typos.
  3. You can add JavaDoc to your strings explaining what they do.
  4. Modern IDEs can find out where your strings are being used in the project.
  5. You can rename the constant and change the string value, even if you have several constants with the same value!
  6. Even if the literals are read from a file, still define a constant for the string and map the raw string to the constant as soon as possible. It makes it so much more simple to track!

Tip: If you still use Java 1.4, define your string constants in an interface (without any other methods). That allows you to use “implements” anywhere where you want to use the constant names without having to prefix them with the name of the interface:

public interface Constants {
    public final static String A = "a";

class Demo implements Constants {
    private String value = A;

With Java 5, you’ll use enum, of course (especially because you can then use these “strings” in switch statements.

Laughed Today?

23. January, 2008

Often, something is seriously funny. The world’s best joke, for example, as researched by psychologist Dr Richard Wiseman:


I also like the European favorite a lot:

An Alsatian went to a telegram office, took out a blank form and wrote: “Woof. Woof. Woof. Woof. Woof. Woof. Woof. Woof. Woof.” The clerk examined the paper and politely told the dog: “There are only nine words here. You could send another Woof for the same price.” “But,” the dog replied, “that would make no sense at all.”

From this article, after reading about it in the Tages-Anzeiger.

Safer Java: Constants First

22. January, 2008

Here is a simple change in your Java development style that will save you a lot of time: When comparing something against a constant, always put the constant first. Examples:

    if (0 == x)...

    public final static String RUN = "run";
    if (RUN.equals (mode))...

That will look strange at first because we’re used to have the constants on the right hand side (from assigns). So what’s the advantage of this? There are three:

  1. It will save you a lot of NullPointerException when using equals().
  2. It’s more readable in big if/else “switch-alikes”, when you compare a variable against a lot of values.
  3. It avoids the accidental assignment as in if (x = 0) (which should have been if (x == 0) … and if you can’t see the difference between the two, you really should always do it this way!) because if (0 = x) generates a compile time error.

The Dreaming Void

22. January, 2008

The Dreaming Void is not an insult but the latest book of Peter F. Hamilton. It’s been sitting in my shelf for quite some time, now, and since I’m sick with the flu, I had a couple of hours between fever attacks to read.

I’m again impressed how Peter can flesh out characters with a few sentences. As an aspiring writer, it’s always both intimidating and relieving to read a good book. On one hand, it shows how much more one has to travel, on the other hand, it shows it’s an effort well spent.

All in all, a good story, maybe a bit confusing because the author skips back and forth between so many characters, storylines and timelines which makes it hard to track what happened in which order and why something is important. It shows Peters talent as a writer how he can manage all these details without ever stumbling. He’s also probably the only SciFi author who can get away at writing a couple of pages how to renovate a flat including buying a new kitchen and a bathroom for it. :)

There is one sore spot, though. In one scene, Aaron breaks into a high-security memory-cell vault and gets pummeled by two heavily armed guards. In the process, a lot of damage is dealt to the environment, especially the racks with the memory cells and their valuable content.

Peter, please. No one in their right mind allows heavy arms near valuable, delicate stuff. Next time, put these guards in the corridor before the vault, so they can hammer away at any intruder with a fat, reliable forcefield between them and the cells with takes the excess damage. That would make it a bit more realistic.

Other than that, a great book. Recommendation: Buy.

Portable UI

18. January, 2008






Sorting Number Table Columns in PyQt4

14. January, 2008

Here is a simple trick to sort number columns in the QTableWidget of Qt4 and PyQt4: Format the number as a right aligned string:

for i range(12):
    item = QTableWidgetItem(u'%7d' random.randint(1, 10000))
    table.setItem (i, 1, item)

Testing JavaScript

14. January, 2008

If you’re test mad like me, then the <script> tag in HTML was probably one sore spot for you as it was for me: How to test the damn thing? Well, now, there is a way: John Resig wrote a small script which you can source into Rhino 1.6R6 (or later; 1.6R5 won’t work, though. You’ll get “missing : after property id”). Afterwards, you’ll have window, document, nagivation, even XMLHttpRequest!

Yes, you can actually test AJAX within unit tests, now! TDD fans, start your engines!

Unfortunately, it doesn’t emulate browser bugs, yet ;-> But you can fix that. I, for example, had problems to get the code load HTML 3.2 files. Especially this code made the SAX parser vomit:


The fix here is to download some XHTML DTD (like XHTML 1 Strict), put it somewhere (along with the three entity files xhtml-lat1.ent,
xhtml-special.ent and xhtml-symbol.ent) and change the DTD to point to the new file:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 //EN" "html/xhtml1-strict.dtd">

In my case, I’ve put the files in a subdirectory “html/” of the directory I start the tests from. (Hm … shouldn’t this path be raltive to the HTML file?? Well, it isn’t.)

Also, the env.js supplied doesn’t support forms. Here is my which fix:

function collectForms() {
    document.forms = document.body.getElementsByTagName('FORM');
        var f = document.forms[i];
        f.name = f.attributes['name'];
        //print('Form '+f.name);
        f.elements = f.getElementsByTagName('INPUT');
        for(var j=0; j<f.elements.length; j++) {
            var e = f.elements[j];
            var attr = e.attributes;
            forEach(attr, print);
            e.type = attr['type'];
            e.name = attr['name'];
            e.className = attr['class'];
            _elements[ f.name + '.' + e.name ] = e;

Note: I also had to remove the calls to toLowerCase() for the tag names (*not* the attributes!), too. Otherwise, document.body would return UNDEFINED for me. But that’s because I’m stuck with old HTML; If you can convert all tag and attribute names to lowercase, then you’re safe.

Lastly, the loading of the document is asynchronous. To fix this, we need a class to synchronize the Java and the JavaScript thread. That one is simple:

package test.js;

import org.mozilla.javascript.ScriptableObject;

import test.ShouldNotHappenException;

public class JSJSynchronize extends ScriptableObject
    public Object data;
    public Object lock = new Object ();
    public String getClassName () {
        return "JSJSynchronize";
    public Object jsGet_data() {
        synchronized (lock) {
            try {
                lock.wait ();
            catch (InterruptedException e) {
                throw new ShouldNotHappenException(e);
            return data;

    public void jsSet_data(Object data) {
        synchronized (lock) {
            this.data = data;
            lock.notify ();
    public Object getData() {
        synchronized (lock) {
            try {
                lock.wait ();
            catch (InterruptedException e) {
                throw new ShouldNotHappenException(e);
            return data;

    public void setData(Object data) {
        synchronized (lock) {
            this.data = data;
            lock.notify ();

ShouldNotHappenException is derived from RuntimeException. After registering that with

        jsjSynchronize = (JSJSynchronize)cx.newObject (scope, "JSJSynchronize");
        scope.put("jsjSynchronize", scope, jsjSynchronize);

in the test, I can use the new jsjSynchronize global variable in JavaScript in wondow.onload:

    public void testAddTextFilters() throws Exception
        setupContext ();
        addScript(cx, scope, new File ("html/env.js"));
                "window.location = 'file:///d:/devm2/globus/abs/webapp/html/testAbsSkuOutput.html';n" +
      "window.onload = function(){n" +
      "    jsjSynchronize.data = window;n" +
      "};n" +
      "", "", 1, null);
        ScriptableObject window = (ScriptableObject)jsjSynchronize.getData();
        System.out.println ("window="+window);

At this point, the document has been loaded and you can access all the fields, elements, etc. Good luck!

Silence the HD

1. January, 2008

Some follow up to yesterday’s post. Using a Sharkoon HDD Vibe-Fixer in a case which doesn’t require screws to install drives doesn’t work; the Vibe-Fixer consists of several independent parts which are only loosely coupled. So when the drive starts to work, you’ll hear a clatter between the U shaped Vibe-Fixer and the slot in the case.

One solution would be to force some felt between the parts and the slot but it’s hard to get there and I’m not sure if the results are worthwhile. So I’ve bought a ichbinleise® Box HDD 10. This is basically a set of four aluminium pieces held together by four screws which keep the HD between two sheets of damping foam. The whole thing is then glued to the case with a thick foam piece to isolate the vibrations.

I had to use hdparm -M 128 /dev/sda to switch the drive into silent mode, though, to reduce the noise to a low murmur.

The main disadvantage of this setup is heat: I’ve applied some thermo transfer goo following a tip of the nice guys at ichbinleise.ch. Also, the HD case is in the flow of the front fan. Still the drive reports temperatures between 60°C and 80°C according to smartctl. I hope this is a bug but I’ll keep an eye on it.

Another disadvantage is that I can’t easily remove the 3.5″ drive cage; it’s riveted into the case and I’d have to use a drill to get it out. So I glued it in front of the mainboard which means it blocks the lowest two PCI slots. Since I don’t need them, it’s not a big deal but still …


Get every new post delivered to your Inbox.

Join 315 other followers