February 03, 2006


After a few nice years on blogs.cocoondev.org, I'm moving to a new installation. My Java feed moves here.

Posted by tomk at 09:16 PM | Comments (0)

JavaPolis Audio

Romain reports that the JavaPolis 2005 reports are being put on-line. Nice stuff - although I still miss the "get audio only as an mp3 file" feature. I've been listening to JavaPosse during my commute the last few days, and I like it. Too bad this isn't (yet?) possible with the JavaPolis talks.

Posted by tomk at 12:52 PM | Comments (0) | TrackBack

February 02, 2006

Switch from Eclipse to Netbeans

Shay demands not to switch from Eclipse to Netbeans. I'm bedazzled. Why would I switch? Just use them side-by-side: Eclipse for the serious work, and Netbeans to play with Matisse!

Posted by tomk at 03:11 PM | Comments (0) | TrackBack

January 25, 2006

Why I'm not on Java 5 yet

Norman Richards asks why people aren't moving to Java 5. One word: WebSphere. Most corporate environments (the ones I know and/or work with, at least) have not moved beyond 5.1 yet. I'm not even sure that there already exists a JDK 5.0-based WebSphere version.

Posted by tomk at 10:49 AM | Comments (4)

January 18, 2006

Turn around and run!


This sort of language trivia is unlikely to be useful to anyone not just about to go into a certification exam, or entirely the wrong kind of programmer interview.[...]
If you find yourself in a situation where have to know the answer to any of these questions, turn around and run.

Right on!

Posted by tomk at 03:22 PM | Comments (0) | TrackBack

January 11, 2006

Null check

Java developers are trained time and again to assert that objects are not null. This can result in weird Pavlov-like reflexes. Witness this snippet from a high-profile OSS project:

if (defaultValue != null) {
    return defaultValue;
} else {
    return null;
Posted by tomk at 12:34 PM | Comments (4)

January 04, 2006

The Quest for the Generic CRUD Web Application

More than once in my career, I had to develop a "simple and easy-to-extend" CRUD web application. Every time, I thought "Somebody must have done that already!", and every time, Google returned next to zero results.

My luck seems to be changing slowly, though. My latest effort delivered 3 CRUD engines for Java:

Belgian! But tightly coupled to the RIFE framework, which still doesn't have got the momentum from the big frameworks.
This seems to be a very interesting bet to go with. However, it is bound to JDK 5.0 and Tapestry. While I personally like both choices, JDK 5.0 is still not done in some environments, leaving me very frustrated.
CRUD generation framework to use with AppFuse. AppFuse itself is based on all the usual suspects, and gives you the choice between them: Hibernate or iBatis, Spring, Struts, SpringMVC, WebWork, and so on. However, the founder of the project (Matt Raible) has some problems with code generation tools, leading to an incomplete tool.

The best approach for writing such a CRUD application framework seems to be that of the last two. Use a stack of well-known components, glue them together with your own special goo, and you have something that is at least based on something known. But the first one is a bit too cutting-edge for the typical Big Company, and the last one is a bit too incomplete for Feelings of Hopping Up and Down.

At the moment, I'm giving a go to 2 CRUD projects, one personal and one professional. For the personal one, I'm going with Trails (finally, generics! ;) ), and the professional one will probably be an extension of AppGen. If you have other suggestions, I'll be more than happy to hear about them. And I hope that next time, my Google query will lead to even more results. Or maybe I should finally start scratching that itch myself...

Posted by tomk at 06:25 PM | Comments (2)

December 20, 2005


On special request: my very own personal wrap-up of Javapolis 2005!

Browsing the Interweb to see what's happening over in Antwerp. Amazed to not find much. Concluded that either half of Antwerp had a power blackout, or that Java geeks are not geeky enough to do that real-time blog thingy. (It turned out that there were problems with the local WiFi hotspot). Went to bed with a splitting head-ache.
Woke up with a splitting head-ache. Spent the day in a room with about 20 other men, including Koen. Called for medical assistance (which was delivered as Nurofen tablets). Noticed weird smells near the end of the day, including own brain melting. Time has never advanced so fast. Probably has something to do with fun.
Finally! The first real Javapolis day! Still headache though. Stephan started a keynote, followed by some important people at Sun who flung t-shirts into the masses.Then a Bea guy started a talk too. I received a phone call: "could you please come to the RAD race jury". Thanks to some manufactured serendipity, I was sitting in the front row. On the opposite site of the exit. Koen and I had to both stand up, dash between one speaker ("Sorry!") and 2000 attendees, and make our way through people sitting on stairs. Luckily, Stephan was so kind to point out that we were going to the jury. 2000 people were a bit less annoyed.
Neal Gafter and Joshua Bloch gave another sequence of "Java puzzles". Very amusing. Too bad that they wanted to go over their time slot so badly.
I stayed put for "EJB3", not expecting to find out much news since last year. Halfway the presentation, I got another telephone call: "are you aware that your son is still at school? Wasn't he ought to be picked up by now?" Light feeling of panic. Fleed conference room once again. 20 minutes of phone calls later ("Damn! Why didn't I charge my batteries last night!"), everything was arranged for.
During lunch, I had to go to the men's room pretty badly. Went there. Saw the line. Huge. Turned around.
Started the afternoon with "Service Data Objects". Was a bit confused: was this guy trying to give an introductory overview, or a technical presentation on how to configure Service Data Objects? There seemed to be some nice ideas somewhere, but I lacked a bit of context (I don't think I encountered the term before entering the conference room).
Entered "Pragmatic SOA". This looked like a very nice presentation. Nothing too new (technically), put pinpointing pretty precisely the clash one can experience when discussing stuff like this with business people. About halfway, my blatter reminded me of the stupid decision I made earlier. Another dash to the exit.
After the relief, I decided to stumble into another room. I picked "continuous integration, continuous agitation", which rehashed a bit all principles of continuous integration, and gave a view on some tools that added value on that by providing graphs of the results.
Then Johan Lybaert shared his experience with agile development in a team of 60+ people. This was one of the nicest surprises here: well told, interesting experience. It feels that this is what a "conference" should be about: exchanging experience and learning from each other. Or what a "User Group" is about, for that matter.
Last session of the day was "Shale: the next struts?" I sighed a sigh of relief when the speaker said "shale has nothing to do with struts - it's just a brand name". And then he continued to describe all source and configuration files one has to write to enable an application. The same discomforting feeling that accompanies struts came upon me. Man, brands can be strong.
A very nice evening followed. I was happy I came by bike.
Headache a bit less splitting. Keynote about the RAD race. Got into the spotlights! And man, those nanos were close.
Then, over to the more serious stuff. Rod Johnson declaring that "Spring 2.0 is going to be even easier", and bragging about how they got Adrian Colyer to join Interface21. It looks like it will be interesting, indeed.
Romain Guy presented his blasting-away Swing demos. The only remark one can make here is that he should give the crowd some time to go "woowwwww".
Then again a shared session: JGoodies, which compared GUIs with whiteboards, and "Bitter JavaServer Faces", which seemed a warning about some design flaws is JSF, if anything.
A couple of sessions had already mentioned GlassFish, the reference implementation for J2EE 5. I hope the project is more interesting than the demonstration (Is anybody interested in seeing "ant build" report "Build succeeded"? I mean, on someone else's screen?)
Maven is a project I have a love-hate relationship with. I love to try it out, but I hate the way it forces me to do things its way. But I was getting pretty excited to give it another go, until the unfamous "If you remember only one thing..." slide appeared: "Maven 2.0 is ready. But expect bugs in it." Eh? I think those guys need to rethink their communication, or the timing of their announcements. For years we told people "OS beta is as good as commercial 1.0", and now we're saying "OS 2.0 is shaky at best"?
Then I entered the "Telnet" session (pun intended), only to receive a text message "feeling terribly sick, kids are doing awful things, please come home" 5 minutes later. So I did as any new man would do. King Kong will have to take a rain check.

During and between all that technical stuff, I had the chance to catch up with many people I like to catch up with. Most of them I see only once a year, but it's nice to see them nevertheless. Also saw people that I wanted to catch up with, but didn't get a chance to approach. Javapolis is really starting to get a crowd control problem. But drinks and food were better than last year, and a venue in the center of Flanders is a splendid location. Especially if you live there.

Posted by tomk at 09:44 PM | Comments (0) | TrackBack

One of Javapolis' most secretly kept secret...

... has just leaked at JavaLobby! Not convinced? Recognize this guy?

Probably only the Flemish (and some Dutch?) people will recognize him - but nevertheless...

Posted by tomk at 12:06 PM | Comments (1) | TrackBack

December 05, 2005

JavaPolis RAD Race

The world moves in mysterious ways. A few months ago, some Javapolis member asked me "we're planning on organising a RAD race during Javapolis, would you participate in such an event?" I said "hell no, I've grown too old for that kind of games." But the RAD race was organized anyway. And my dear collegue can be very convincing. So now I'm trapped. Or how contact with youth keeps you young...

If you want to challenge us: there are still (again?) 2 slots open. Non-participants are not allowed to mock.

Posted by tomk at 10:32 PM | Comments (1) | TrackBack

November 29, 2005

Pirates and terrorists


There's just no point in buying the crap any longer, you're only encouraging them.

Damn right. I used to buy a cd per week. Now I'm down to one per year - and it's usually not for myself.

Posted by tomk at 09:06 PM | Comments (0) | TrackBack

September 30, 2005


LOL. This argument falls in the same category as "a hammer isn't a tool, because I've seen people using it as a weapon". Or how "definition purism" is pretty almost always useless. And always boring.

Posted by tomk at 08:56 AM | Comments (1) | TrackBack

September 26, 2005

Unit testing an array of input data

This one is interesting, I think. Suppose I have an array (or Collection) of test input data. I want to test the same Java method for each of those entries. But, when one fails, I want to continue testing, not halt the whole process. How do I go on with this?

  • If I create a testMyMethodX() for every case (with X a number), I do a lot of useless typing.
  • If, on the other hand, I loop through the array "by hand", the first test that fails will stop all other tests to run.

So, has anybody else encountered this? Did you find a solution? Do you want to share it?

Posted by tomk at 01:52 PM | Comments (2)

September 21, 2005

BeJUG OSS libraries seminar

As mentioned before, I gave a presentation on Jakarta Commons yesterday for the Belgian Java User Group, aka BeJUG. It was a nice experience. Here's a picture of me giving my best impression of "will the lot of you sit down so that I can get this show started"-look. Not my best angle, I might add ;-)

I heard that the .ppt and even an audio feed will be made available later. I'll keep you posted.

Update: The presentation is available here. Audio feed still to come.

Update: Audio feed available here. (You'll probably have to login. Free registration.)

Posted by tomk at 09:42 AM | Comments (2) | TrackBack

September 19, 2005

Weird exceptions

I once encountered this one, too. Talking to the guy who wrote it, he said "it was known to be faster, and even recommended by Sun itself". End of conversation, of course. I tend to agree with the statement I read some time ago: "'best practices' considered harmful" (or something similar) (extra brownie points for who can get me the right link).

PS: The guy's contract was not prolonged.

Update: Joseph gets the brownies: this is the article I was referring to. Thank you, Joseph.

Posted by tomk at 03:55 PM | Comments (2) | TrackBack

August 29, 2005

Eerste Java versie

Oh, en wat ik gevonden heb: ik kan al zeker zeggen dat ik met Java werk sinds jdk 1.1.5. Ik dacht ooit 1.1.3 ook geinstalleerd te hebben, maar daar vind ik niet zo direct harde bewijzen voor.

Posted by tomk at 10:37 AM | Comments (0) | TrackBack

August 25, 2005

SSL on login pages?

Kasia is doing her oh-you-morons thing again. But she might just be wrong here: SSL is not only for encryption, it is also used for authentication. The server needs a certificate that is provided by a trusted (by the user) Certificate Authority, yada yada... (you know this stuff). While I think that phishing is done in more subtle (and thus easier) ways than DNS-hijacking, the authentication in itself should not be seen as "a waste of CPU cycles".

Maybe it's a flaw in the https-model, where encryption and authentication can't be separated (as opposed to encryption and authentication in the email world: you can do each individually, or both at once). That doesn't necessarily mean that the designers of https were clueless.

Posted by tomk at 10:02 AM | Comments (1) | TrackBack

August 24, 2005


It's official: I'll be speaking at the BeJUG Open Source Libraries Seminar. You're all invited to come :-)

Posted by tomk at 11:31 AM | Comments (0) | TrackBack

August 22, 2005


Glen finds out about the documentation problem. The questions he poses seem to be quite right, but imagine the programmer writing that line. She is busy keeping 15 threads on various levels in her head, and then she has to write a comment for a method. At that moment, her head is already full, and she really isn't capable of starting to imagine which alternatives are possible for another reader.

Another way of expressing myself: when writing code, everything seems to be pretty obvious to you. You expect everybody to understand the same thing, especially for trivial getter methods like this one. Why bother trying to guess a reader's context?

Of course, that "triviality" almost always bites somebody, and most of the time, it is the programmer herself. It always comes as a surprise if you have to read your own code a couple of months later: "When writing that comment, I clearly remember thinking 'this is so damn obvious', but, man, what does the damn thing do?"

Posted by tomk at 09:13 AM | Comments (0) | TrackBack

August 19, 2005

Buzzwords (2)

Another problem I have with buzzwords is that everybody (and I mean that literally) understands something different with them. It is quite confusing to talk with somebody about "Visitor", when she really means (in my eyes) "Chain Of Command".

  • And why exactly would you use Visitor?
  • Well, it fits quite naturally here
  • No, it doesn't, we don't have a tree to walk through here
  • No, but we do have a set of solutions to walk through
  • So you mean "Chain Of Command", then?
  • No, we don't have a Command interface, only a Visitor interface
  • <continue at the top>

So far for the shortness of communication...

Posted by tomk at 11:08 AM | Comments (0) | TrackBack

Wi-Fi at McDonald's

I'm sure I will regret this, but ...

This seems to be a fairly weird opinion for somebody who calls himself "columnist". Striking quote: "The day is coming when travellers will either get free internet access at your restaurant or they’ll be looking for a restaurant down the road where it is free." Sure. But that day isn't here yet, and until that day, McDonald's can make a profit on the _extra_ service it's providing. It's not like the motel owner charging you for TV, but the motel owner charging you for room service. And he can continue to do that until the motel down the street offers free room service, or even longer if that other motel doesn't offer clean sheets.

Don't get me wrong: I would like to have wifi for free too. But I don't think getting wifi with your hamburger is a human right.

Posted by tomk at 08:21 AM | Comments (2) | TrackBack

August 01, 2005

Cocoon Gettogether

Bertrand announces the annual Cocoon Gettogether. The location has changed, so I guess Steven will not be the single organizing force anymore. It will be interesting to see the side-by-side comparisons between Amsterdam and Ghent ;-)

Posted by tomk at 11:19 AM | Comments (0) | TrackBack

July 29, 2005


I just stumbled on this article (people reading this blog, will understand why these things jump to my eye). I was quite amazed by the Jared's opinion:

  • on spring:
    Give brownie points on keywords like IoC, DI, etc. etc.
  • on design problems:
    Here, buzzwords like Singleton, encapsulation etc. will fly out anywhere and if the candidate really knows what he/she's talking about, smile.

Usually, when I hear people spawning buzzwords, my bullshit-o-meter goes all the way into the red. The fact that a candidate has read the spring homepage, doesn't tell me much about this experience with the framework. Of course, keeping score like this is a very handy trick for hiring managers who are a bit uncertain about the technical domain they're interviewing about.

I'm afraid I wouldn't pass Jared's interview. My reaction to buzzwords is to avoid them. Moreover, some of his concerns (Have you ever used a Singleton!) come so naturally to me, that I wouldn't even consider it to be a "design achievement".

I'm afraid interviewing is an art, not a list of questions.

Via Erik.

Posted by tomk at 10:13 AM | Comments (1) | TrackBack

July 28, 2005

Google idea: timezones

Everybody knows the Google calculator, right? You go to Google, enter "2+2", and get "2 + 2 = 4".

Now, most people will also know the Google converter: enter "101f in c", and you'll get "101 degrees Fahrenheit = 38.3333333 degrees Celsius".

So far, so good. But when I was reading about the Google Code Jam 2005, I was considering whether I would participate, just to see how far I would get. But - will I have time at 9 PM EDT? Wouldn't I be at work? So it came quite naturally to me to go to Google, and enter "9:00 pm edt in cet". Big disappointment: I thought of something that Google didn't. So, Google, is this an idea for you? Can you do this?

Posted by tomk at 12:01 PM | Comments (0) | TrackBack

July 20, 2005

Ant, 5 years ago

Stefan is a bit harsh on himself:

Luckily Conor took over for Ant 1.2 and things became more organized.

I remember those days, and I also remember that Stefan's enthusiasm was the main driving force behind Ant's development. So thank you Stefan, for a great build tool!

Posted by tomk at 09:11 AM | Comments (0) | TrackBack

July 19, 2005

Log4j tracing

I write this a lot:

logger.debug("varName: "+varName);

Starting to think about this, would there be a way to have log4j handle this for you? So you could just write something like


and it would give the same result as above. It seems pretty hard (the variable name is not passed through the method call), but if anybody has an idea for this: shoot!

Posted by tomk at 02:52 PM | Comments (9) | TrackBack

July 15, 2005

log4j default configuration

In case anybody involved in log4j should read this: +1. This is the main reason I still use System.out.println() sometimes.

Posted by tomk at 02:44 PM | Comments (0) | TrackBack

June 29, 2005

Eclipse keyboard cycling

Did you ever experience the weird phenomenon that, while coding away in Eclipse, all of a sudden your keyboard layout was changed? Your a's became q's, and your z's became w's. This always happened to me when I was pressing some complicated key combination, and got confused, and had to start over (alt-shift-R is complicated, in my book). The really weird thing was that all other programs would still react normally to the keyboard, except for Eclipse. The only remedy I knew of, was to restart Eclipse.

And 2 minutes ago, I found the other solution: alt-shift. This seems to cycle between keyboards within your application. A quick test shows that this is also the case in Firefox - I just never experienced it there, because the most complicated shortcut I use in Firefox is F6.

Another tiny mistery unraveled.

Posted by tomk at 09:55 AM | Comments (1)

June 23, 2005

Web standards

Eat this, Zeldman:

Just a quick summary: in real world situations, designing with web standards has verly little advantages for people with physical disabilities. And in some situations, it might even impede accessibility.

Via Michel.

Posted by tomk at 09:59 AM | Comments (0) | TrackBack

June 09, 2005

Netbeans form designer

Impressive demo of NetBeans' upcoming form designer. I'm curious of the real-life experience will be as impressive.

Posted by tomk at 09:01 PM | Comments (0) | TrackBack

May 19, 2005

Buggy dates in Java

That the Date and Calendar classes in Java are hard to work with, that's a fact we're all familiar with. But today, I bumped into something that seriously looks like a bug to me.

Consider the following lines of code:

Date date = new GregorianCalendar(2002, Calendar.DECEMBER, 30).getTime();
DateFormat format = new SimpleDateFormat("yyyyww");

Now, what's the output you would expect from this? My first guess would be "200252" or maybe even "200253". But when you start thinking about it, you start to wonder to which year a week really belongs to. So maybe even "200301" wouldn't surprise you too much.

But the proof of the pudding is in the eating, so you run the program. And your jaw drops to the ground when you see the output:


Huh? How can December 30 possibly be in the first week of the year? After some googling, surfing, studying the sun and the stars, and reading all about standards, legislation, and ISO 8601, you get the feeling: I found a bug!

So one goes to java.sun.com's bug database, and checks for the bug's existence. And what does one find? This. So the bug has been reported, and has been dismissed as "not a bug". But I really don't understand the reviewer's explanation: how can a day in December be in the first week of the year?

Now, I found a workaround using Jodatime, which goes as follows:

Date date = new GregorianCalendar(2002, Calendar.DECEMBER, 30).getTime();
DateTimeFormatter fmt = ISODateTimeFormat.weekyearWeek();
String result = fmt.print(new DateMidnight(date)).replaceAll("-W", "");

Which showed me the result I ended up expecting:


But still, if anybody could shed some light on the JDK's behaviour, I would greatly appreciate it. My intellectual curiosity just isn't satisfied.

Posted by tomk at 10:17 PM | Comments (4)

May 09, 2005

The Java dilemma

What would you prefer: to re-invent the wheel, or to add a "dependency" to your project? My choice is easily made...

Hint: I like code that is tested by more than one person.

Posted by tomk at 09:09 AM | Comments (4) | TrackBack

April 12, 2005

Where's the domain?

Koz Speaks: Where's the Domain?

While I fully understand the pledge for a more active object model, I've found myself backing away from it lately, too. The problem is that many objects seem to have so many roles, and are used to perform so many operations, that it just becomes unfeasible to put all those methods in one class. For example, you have a tree you want to have all leaves of. Ah, call Node.getChildren() recursively, you say. And when the node at hand is a leaf, it returns itself. But: sometimes I want all the leaves. Sometimes I only want the leaves of certain branches. And sometimes, I don't only want the leaves, I want the internal nodes too. What's one supposed to do? Implement Node.getChildren(), Node.getChildrenOnCondition(Condition), and Node.getChildrenIncludingInternalNodes()? Or get some hefty Visitors, and have those "external" classes decide which logic to use? Which object model will look cleanest, do you think?

I'm all for the naked objects approach, but I'm having trouble to keep all the "aspects" of an object cleanly separated.

Writing that last sentence, makes me wonder of the word "aspects" there is the same as the word "aspect" in "AOP". Stuff to ponder ...

Posted by tomk at 01:40 PM | Comments (1) | TrackBack

April 09, 2005

Choose your information carefully

I've been struggling with a legacy application for a while now. It has all this bloated and non-OO-minded code in it, that I wonder: "What was this architect thinking?" In order to get some "guru insight" in the problem, I bought "Core J2EE Patterns" (Deepak Alur, et al., Prentice Hall, 0-13-064884-1). I was hoping to get a solution to the problems at hand. I was just browsing it, when it hit me: the legacy app we're dealing with, is following exactly the methods described in this book. It is great if you have a can of non-thinking Java-typers, to whom you can say "type me 500 lines of code by tomorrow, and if I want to refactor something, you'll be present again". But it doesn't work if you have a small team of (more or less) intelligent people, who want to get something done, instead of mindless typing.

On second thought, the problem most likely is the underlying J2EE (and, more specifically, all that EJB stuff) architecture that's causing trouble. You can't build a good house if your fundamentals are weak.

Just for fun, another unedited draft, from March 14, 2003. I still didn't quite finish that book.

Posted by tomk at 01:46 PM | Comments (0) | TrackBack

April 06, 2005

Ruby vs Rails

Comparisons like this give me the creeps. It just doesn't make any sense: what is "language", and what is "library"? For instance, I once saw such a comparison between Python and Java. The Python program was using something like HTTP:: (forgot the right syntax), while the Java counterpart implemented the http get by itself. Using commons-httpclient would have reduced the lines of code tremendously.

Anyway, I suppose people are still looking for useful metrics in the programming world. Not an easy job, but I thought that we all already agreed that "LOC" is not a very good one.

Via Shinzui.

Posted by tomk at 09:28 AM | Comments (1) | TrackBack

February 25, 2005

Software engineer wanted in Gent

Software engineer wanted. If you're graduating this year, check it out. I can definitely recommend these people as bosses for your first job.

Posted by tomk at 04:37 PM | Comments (0) | TrackBack

Dynamic layout

Nice feature in Swing: Dynamic layout.

Posted by tomk at 01:47 PM | TrackBack

January 31, 2005

Struts (part II)

Just after my wave of nostalgia, I find: "Struts gets mothballed". Everybody goes forward!

Via Erik.

Posted by tomk at 10:14 AM | TrackBack

January 27, 2005

Struts bashing


It still amazes me how condemning people are on struts nowadays though, when it was the first framework that at least did an effort to ease the way for web application development. I've just programmed a *servlet*, and I wouldn't go back programming forms with that.

I think this makes me understand better how people are still going wild about the Beatles -- they seem to think the Beatles are ultra-revolutionary, but to me, they are old stuff. But I guess they were indeed revolutionary in their days. It's the same for struts: for me, struts was an astonishing step forward in web development, but for others, it seems to be something antique. They have never known the era before struts, or they just forgot.

Boy, am I getting old.

Via Howard.

Posted by tomk at 09:25 AM | Comments (4) | TrackBack

January 12, 2005

Java Tip #6

FutureTask: Java Tip #5 - Avoid 64KB method limit on JSP gives me inspiration for Java Tip #6:

Avoid JSP

There are enough alternatives.

No idea why I felt the need to write this down.

Credits to Erik

Posted by tomk at 02:53 PM | TrackBack

December 23, 2004


... finally start to make sense. I've heard a lot of buzz about them, but only now I start to understand them a bit.

One question that remains: why store "what will follow" under some key, instead of storing "what has been" under a key? Wouldn't it be easier to claim "this page id means that this user has done that and that and that, and these request parameters indicate that he will now go there". The net effect will be the same, I think, but the abstraction wouldn't leak that much (to the programmer, that is).

Let's try to restate that: instead of changing objects in a session when receiving a HTTP request, you take a copy of those objects (leaving the originals as they were), and start working on the copy. You can do the same actions that you would normally perform on the original objects. There's only one difference: the original objects are now stored in a repository under a page-specific ID. When the user has cloned her window (or pressed the back button, or...), you can fetch those objects again (thus going back to the state she was), and continue from there. In my gutt feeling, this would reduce the amount of continuation-specific code (sendPageAndWait() - huh?), including the JavaScript-flow enabling dependency.

I think I have to re-read the article, seems like I have missed something. If you can explain me what I've missed, I will be very grateful.

Posted by tomk at 04:14 PM | Comments (1) | TrackBack

December 17, 2004


Erik pointed me to NDoclet, a MSDN-style Javadoc doclet. The MSDN style seems a bit weird to somebody who's used to look things up the Sun way, but it sure looks clean. You can view the result of my little experiment here, and compare it to the more traditional approach.

Posted by tomk at 10:49 PM | TrackBack

November 23, 2004

Gmail FS on Java?

Today, I ended up here (via Markus). This triggered a whole row of associations, including the GMail Filesystem. It looks like Commons VFS could be used to build a Java-mountable GMail filesystem. Any takers?

Posted by tomk at 03:10 PM | Comments (0) | TrackBack

Wanted: Developers

Look here. Notice anything special? No? Let me tell you: 25 links posted on that beat, and 2 of them about people looking for people to work with them. In good ol' US of A, even.

Let me increment the fun: "we" are looking too. In Belgium, but that shouldn't stop the Belgians ;) I've been asked if I know people that would be interested. I have a sneaking suspicion that some of the people I've met and worked with in the past are, but none of them jump to mind at the moment. It might be that some are reading my blog (one can dream, can't he?), so here it goes. Contact me if you want details, or if you would like me to recommend you.

If you don't belong in my past, you're of course more than welcome to belong in my future.

Posted by tomk at 02:27 PM | Comments (0) | TrackBack

Eclipse tips&tricks

This looks like an interesting list of Eclipse tips&tricks.

Posted by tomk at 09:57 AM | TrackBack

November 08, 2004

Eclipse Tips&Tricks

This looks like a nice collection of Eclipse tips&tricks... The XP look-and-feel works for me.

Via mindstorm

Posted by tomk at 10:04 AM | TrackBack

October 10, 2004

"Open source solves everything"

Andy thinks he has found another reason why Sun should open source Java. If that's really true, how come I just stumbled yesterday on a bug in XDoclet that has been reported almost a year ago? As much as I would like it, open sourcing stuff is not the silver bullet to get rid of bugs.

Posted by tomk at 12:22 AM | Comments (0) | TrackBack

October 09, 2004

J2SE 5.0

It's not beta anymore? And nobody told me about it... except Markus.

I get more and more the feeling that it all doesn't matter that much: Java 5 won't be "out" until WebSphere and the like will support it.

maybe I'm just getting too old for this shit...
There used to be a time when I knew months on beforehand the exact date of the release of a new JDK.

Posted by tomk at 11:33 PM | Comments (0) | TrackBack

October 04, 2004


The first time I'm the JBoss people grateful for anything: JBoss IDE: a plugin for Eclipse that, amongs others, provides autocompletion for XDoclet tags for Hibernate. Hmm, looks like my chain of tools is becoming quite lengthy now...

Posted by tomk at 02:22 PM | Comments (0) | TrackBack

September 09, 2004

How to migrate to Eclipse from ...

IBM has posted a series of articles for those shy people that aren't ready to learn a new IDE hands-on (duh):

How reading such large amounts of text will persuade you to use Eclipse, is beyond me (especially if you already actually tried Eclipse once), but if it does: good for you!

Via Erik

Posted by tomk at 05:01 PM | Comments (4) | TrackBack

September 03, 2004

Definition purism creep

I respect Martin Fowler. I really do. But blog entries like this one make me ask this question: "what the hell are you doing?" If you make a change to a program, is it really that important to call it "optimization" or "refactoring"? Things like this are generally the result of too much belly-staring: nobody gives a shit, but you think you're pondering the Most Important Question in Life. There are more useful things to think about.

Oh, I can think of one occasion when this might be important: you're manager has read a book about XP, and wants to be hip and implements XP, but asks you to categorize the work in your timesheets between "optimization" and "refactoring". In this case, try to talk some sense into the guy. Or run, run like you've never run before.

Posted by tomk at 09:49 AM | Comments (0) | TrackBack

August 26, 2004

Sing an applet!

I just stumbled on this page. Great! Yep, learning the answers to those questions by heart will most certainly help you to ace your next interview.

The hardest one seems to be question #68. But my favorite is #99:

How do you sing an Applet?

Dunno. C minor?

Posted by tomk at 11:16 AM | Comments (1) | TrackBack

August 20, 2004

Duke screensaver

I've been looking for this a while ago: a Duke screensaver (via Simon). I can't imagine it's the only one out there, but it's the only one I've found so far.

Posted by tomk at 01:22 PM | Comments (0) | TrackBack

July 20, 2004

History keeps repeating itself

I'm not talking about this, but about a cvs web client (web cvs client?). Another employer, same task at hand. I didn't really finish the task last year, but I'll have to manage this time.

I spent the day looking at and trying to install ViewCVS. I think I'm almost there, but there seem to be a few things missing (read: I don't get a 404 anymore, just a blank page).

What I don't like so far? The fact that you have to run the webserver on the same machine as the CVS repository, is one issue. The fact that every goddamn configuration string is unix-based, another one (yes, we're running CVSNT as a server).

My dream? A nice servlet/jsp/anything else Java-based (we're a Java shop), that you can just drop in tomcat/webapps, and that you configure by entering your CVSROOT.

Well, we're not there yet. Going back to the world of PYTHONPATH and its friends.

Posted by tomk at 04:40 PM | Comments (3) | TrackBack

July 14, 2004

Making fun of Java

Trackback works! The other day, I referenced Scott's reference to Inside Jack. And this morning, I get an email from him pointing me to his reference to Totally Gridbag. Which I'm now referencing here. Bittersweet recognition.

Confused? Just click here, for &divinity;'s sake.

Posted by tomk at 09:28 AM | Comments (0) | TrackBack

June 04, 2004

System properties

This article about System.getProperty (via Erik)blew me away. I was utterly convinced that System.getProperty() gave me everything I've set in my environment, that I had to try it out. And I was quite baffled to see that the author was right.

However, his proposed solution threw a "java.lang.IllegalArgumentException: Malformed \uxxxx encoding." on my Windows XP machine.

Posted by tomk at 10:24 AM | Comments (4) | TrackBack

May 28, 2004

Styled text in Swing

Just discovered (although it feels that I may have known this before, I've just forgotten about it): how to get colors in your Swing components? Just treat your strings as HTML!

new JTree(new String[]{"<html><font color='red'>O</font><font color='blue'>n</font><font color='green'>e</font></html>", "Two"});

gives you

Now ain't that beautiful ?

Posted by tomk at 04:24 PM | Comments (1) | TrackBack

April 28, 2004


I've just peeked into the code of jnn: The Juicy News Network, a weekend project by he who some call God (I won't mention any names though). And again, I'm worried.

For ten years now, people keep saying "In Java, variables start with a lower case letter." James Gosling sometimes uses capitals. "Structure your code." James doesn't even bother to hit the <enter> key an extra time between methods. "Use high-level constructs" I see bit manipulation all throughout. "Separate concerns" And why shouldn't Mr. Gosling makes his Feeds classes aware of the fact that they belong to a GUI, and thus have arrangements made for events?

It look like a new truth that I've just heard recently: "When coding, everybody falls back to his level of comfort." When you're used to Java, you'll program in Java following all those nifty design patterns and coding practices. When you're used to databases, you'll program in stored procedures. And I guess that, when you invented Java, your level of comfort is not Java, but more like C/C++.

What worries me most, though, is that it just works. Maybe there is a lesson to be learnt here.

Posted by tomk at 01:02 AM | TrackBack

April 22, 2004

Naive security

If you believe one word from this article, you might be in deep trouble.

Make methods private as security measure? Ever used reflection?

public class Reflect { private static String indent = " "; private static String demarcation = "======="; private Reflect() { } public static void dumpAllMethods(Class clazz) { Class curr = clazz; while (curr != null) { dumpDeclaredMethods(curr); curr = curr.getSuperclass(); } } public static void dumpDeclaredMethods(Class clazz) { dumpArray("Declared methods", clazz, clazz.getDeclaredMethods()); } public static void dumpMethods(Class clazz) { dumpArray("Methods", clazz, clazz.getMethods()); } public static void dumpConstructors(Class clazz) { dumpArray("Constructors", clazz, clazz.getConstructors()); } private static void dumpArray(String subject, Class clazz, Object[] array) { System.out.println(demarcation + " " + subject + " for " + clazz + " " + demarcation); for (int i = 0, n = array.length; i < n; i++) { System.out.println(indent + array[i].toString()); } System.out.println(demarcation + " End " + subject + " dump " + demarcation); } }

Et voila, all methods accesible to you.

Make jars sealed? Ever heard of WinZip? Do you remember crimson in it's beginning days? If you wanted to use another XML parser (or was it XSLT engine), it was standard and well-known practice to unseal the crimson.jar.

I hope these people aren't going to secure my application.

Posted by tomk at 07:42 PM | Comments (5) | TrackBack

April 20, 2004

"Flaws" in open source

Hear, hear. Most OSS developers develop for fun. If this ain't what you're looking for, go look somewhere else. And try to understand the above sentence: we develop for the fun of developing. Just like you collect stamps for the fun of collecting. Or do you want to tell me that you want to earn money with that?

Posted by tomk at 10:17 AM | Comments (1) | TrackBack

April 16, 2004

EJB vs Hibernate

The world has become a weird place: during last JavaPolis, I heard Floyd Marinescu say "Alternatives to EJB are rising. They might be a better solution for you." Today, I read Gavin King saying "EJB's are not that bad after all." What's next? World peace?

Posted by tomk at 09:31 AM | Comments (5) | TrackBack

April 14, 2004

March 20, 2004

Groovy and the JCP

Cathing up on Erik's linkblog, I noticed all the bickering about Groovy submitting to the JCP. Not having an opinion on the subject (other than: "Eh? How is Groovy an extension to Java?"), I wondered why nobody noticed what this really meant: Groovy considers the JCP to be a valid body to submit to. After all the bickering about how the JCP sucks, it struck me that such a guerillia movement is complying to it.

And the second after I had that thought, I saw Brian's comment, reminding me that I'm not that uniquely clever as I often think I am.

Posted by tomk at 11:49 PM | Comments (1) | TrackBack

March 19, 2004

Java frameworks for web development

Manageability - What is the best Java framework for Web development? Seems about right to me. I've used 2 of the three most popular ones, and am currently learning to use the third one. Ergo: in the near future, I'll know which is _the_ best one. I'll get back to you.

Posted by tomk at 09:33 AM | Comments (6) | TrackBack

February 18, 2004

Open source Java?

Recently, blogland is (again) uproared by the question "Should Java be open source?". I just read another opinion, this time by somebody I respect highly. But I don't agree with him. Reason enough to give my opinion, I guess.

For starters: Eric Raymond's argument (as it is described by Bertrand, I didn't read his article) isn't valid at all. I think MS Windows is pretty ubiquitous, yet you can't describe it as 'uncontrolled'. A single example doesn't prove anything. Blame my scientifical mind for contesting this.

Secondly, I'm not convinced that OS Java would be a good idea. The first thing that will happen, is forking all around. Every "Java" will have its own pros and cons (This one has untyped variables! This one has closures!), and programmers will have their own "Java" of choice. Leaving the user with having to download a new "Java" for every program they use. Is moaning and grinding about jar dependencies familiar to you? Imagine that it becomes moaning and grinding about "Java" dependencies. Or jars that are not available for certain "Java" forks.

Maybe Sun's marketing machine isn't up to par with Microsoft's, and I can regret that. But thinking that setting Java free will solve this problem, is naive at least. A lion that has spent his life in a Zoo won't survive in the wild.

As much as I would like a Java you can tinker with, I'm too comfortable with the idea of having a Java, instead of having tons of "Java"s. If you want functionality that's not readily available, extend, don't replace. Java is perfect for that.

After all, remember the effort we had to make to finally have web standards.

Posted by tomk at 09:16 AM | TrackBack

February 13, 2004

Java SDK 1.5 Beta 1

Well, time to comment on my own pet peeves that have been fixed in the new JDK, I guess. They seem to be bundled in this page.

The InetAddress class now provides an API to allow testing for the reachability of a host. This features provides a ping-like capability in Java. Great. I (unlike most Java developers, so it seems) find myself always behind a firewall, which makes me connect through a proxy. I had written a tiny class (for own use) that set the proxy for me. Only one thing I had to remember: every time I switched locations, I had to switch the selected proxy. No more.

public static void setDefaultLocation() throws UnknownHostException, IOException, ProxyException {
    List locations = new ArrayList();
    boolean set = false;

    for(Location location:locations) {
        InetAddress host = InetAddress.getByName(location.getHost());
        if (host.isReachable(3000)) {
            set = true;
    if (!set) {
        throw new ProxyException("Could not find a reachable proxy.");
(Some details left out). Also notice the use of the generics and the "foreach" loop. They came quite naturally when I was writing this code. Nice job.

BTW, it seems that I could do an even better job using ProxySelector, but I didn't figure out how to use this yet.

On to the next one. Did I ever tell you the reason I fell in love with Java? It was because you could connect with the web from within code so easily! Write a program that does stuff humans do (surfing the web, that is) -- who wouldn't want to do this? Well, now we will be able to do this using FTP too, or so it seems from the sentence The specification of the URL class now mandates a minimum set of URL protocol handlers that are guaranteed to be present in J2SE. They are http, https, file, jar and ftp. I still have to figure out the ins and outs, but it looks promising.

Something I also didn't know yet: Doug Lea's concurrency package has made it into the core.

There are also some new packages popping up: java.lang.annotation, java.lang.instrument, java.lang.management , and javax.management.* are intriguing to me. Yet to be investigated, though.

On a side note, if you're an Eclipse user and want to play around with these new toys, check out the SDK 1.5 plugin.

Update: I forgot to mention this one: The networking API now provides a way of setting timeouts on connect and read operations for protocol handlers. This will benefit any HTTP client application that must behave robustly in the event of server failure. I know at least one guy who has been crawling the internet, just to find a library that could overcome this shortcoming in the previous JDKs.

Update: The link to the plugin is referring to the installation manual. However, that has the wrong link for the actual plugin (an old version). So you're better of downloading it here.

Posted by tomk at 11:49 AM | Comments (1) | TrackBack

February 04, 2004

Too much magic

If you're even remotely involved in designing and/or programming applications, read TooMuchMagic - JicarillaWiki (via 'cyberlizard'). One particular instance of this phenomenon that I've experienced:
MyInterface intf = (MyInterface)obj;
Method meth = intf.getClass().getMethod("blah");
(code not actual code, method signatures might be wrong, but you'll get the point)
Posted by tomk at 10:45 AM | TrackBack

February 03, 2004

Spring and Hibernate

Matt sends me to an article about Spring and Hibernate. Looks like jummy stuff. I've not yet looked into Spring, but this has triggered my interest. Do you have experience with Spring?
Posted by tomk at 10:38 AM | Comments (1) | TrackBack

January 28, 2004

Computer graphics

I remember a professor in college who said "the goal of computer graphics (as a scientific discipline) is to render images that are indistinguishable for the unknowing user from real photos". From these pictures, I would conclude that he will be out of a job real soon now. Awesome.
Posted by tomk at 02:15 PM | TrackBack

December 22, 2003

Eclipse 3.0 M6

In case you've been hibernating the last few days: Eclipse 3.0 M6 is out.
Posted by tomk at 02:23 PM | TrackBack

December 19, 2003

Time to get worried

Now I'm worried. Gartner predicts (pdf) a golden future for Java. I've not seen many of their predictions come true. Let's hope this is the exception to the rule.

Via TechnoTourette: Gartner says Java will be dominant Language after 2004

Posted by tomk at 11:55 AM | Comments (0) | TrackBack

December 17, 2003

Rational Rapid Developer

Peter talks about his RRD impressions.

I've had a look at RRD too, a couple of months ago. My conclusion (and that of my collegues too) was that it was indeed very nice for small projects with not-too-experienced developers. But I don't believe at all that it will scale. If the business logic becomes too complex, the RRD tool won't do the job for you.

However, this is not a fault of RRD alone. Every RAD tool that I've seen so far falls in this pitfall: they start making assumptions about the code you're going to write with it, and start building fences to prevent you from jumping into the code to build things they didn't think of. While this helps enormously for the beginning programmer, it gets in the way once your project starts to mature.

One way I would consider to use RAD tools, is to build some rough chicken wire framework, on which you can then add the real logic after throwing the tool away. But this would reduce it to an (advanced) GUI builder...

But I'm not able to evaluate these things. I think Peter, as a relatively inexperienced developer (AFAIK), is in a much better position to do this. So please, Peter: get your hands dirty with the thing (IBM will give you an evaluation version if you act interested enough), and let us know what you feel.

Later: Oeps, it turns out I underestimated yet another person. Peter has 8 years experience on C/C++ development, but has always been active as an analyst as long as I know him. So let's change the offending sentence to ... as a relatively inexperienced Java developer.... I'm glad I put AFAIK there.

Posted by tomk at 11:01 AM | Comments (1) | TrackBack

December 08, 2003


JavaPolis is over. It was great fun. Instead of enumerating all presentations, let it suffice to say that I saw a lot of ex-collegues and even ex-collegue-college-students (nice surprise, as I wasn't really prepared for this), and that I enjoyed talking to each one of them. I did miss a few opportunities to go and shake hands with people I only know from online stuff (blogs, ...), but I still feel a bit awkward to step up to them and say "hi, I read your blog." Some people define this as "beta male behaviour", as opposed to "alpha male behaviour". I guess I'm just too shy for this world.

Really only one thing to check out further: naked objects. Looks like fun to play around with. Not sure if it is useful for the medium- to big-sized projects though.

Posted by tomk at 03:14 PM | TrackBack

November 25, 2003


More and more people are boasting about Maven (like him), I decided to try it too. First obstacle to overcome (of course): http proxy. Luckily, the Maven people have written a nice FAQ. So I put

maven.proxy.host = corpproxy.mmm.com
maven.proxy.port = 3128
in my build.properties (nicely put in ${user.home}, yes). It didn't work for me. After an hour of fiddling about, suddenly it came to me. I changed the above to
maven.proxy.host = corpproxy.mmm.com
maven.proxy.port = 3128
And it worked!

Did you spot the difference yet? Hint: try counting the spaces after 3128. Jup. There cannot be any, or it won't work. I very vividly remember, when starting to use Ant, we were all making fun of the poor people using make, because they had to deal with tabs and spaces and the lot. Now, we have progressed so far to be at that same point. History just keeps on repeating itself.

OK, onto the next error...

Posted by tomk at 01:21 PM | Comments (4) | TrackBack

November 24, 2003


David's agenda for JavaPolis. If everything goes well, I'll be there too. Since David posted his agenda, I noticed that I hadn't even looked at it. So a brief glance would set my agenda like this:
  • JSR-176: Forthcoming Java Programming Language Features by Neal Gafter [ Sun Microsystems ]. Always nice to know what will be coming. Plus, the other sessions look a bit less interesting for me: I've no J2ME experience, ebXML is something I won't use in the short term, and I think I've worked enough with Struts to know what's going to be told there.
  • AspectWerkz - fluid AOP for Java by Jonas Boner [LogicAspects]. I've heard some fuzz about AspectWerkz. This might tell me what it is about.
  • Java Performance Tuning by Jack Shirazi & Kirk Pepperdine [ JavaPerformanceTuning.com ]: something most Java developers aren't into (me included): performance. And when performance issues do rise, you don't have a clue where to begin. So I hope these guys hand some pointers.
  • Relational Persistence For Idiomatic Java by Christian Bauer [Hibernate]: "Idiomatic Java" looks like a weird term, but Hibernate is interesting. I hope to include it in our project RSN, so let's try to learn something here.
  • For the last session that day, I have no idea. I might visit Werner Ramaekers, just to be able to put a face on the blog.
  • JSR-127: Java Server Faces by Craig R. McClanahan [ Sun Microsystems ]: new and upcoming, thus interesting.
  • Know thy enemy by Andre Marien [ Ubizen ]: I know a few people who work at Ubizen. Hope to meet them here.
  • SCRUM: A Methodology to Keep the Team Going by Joseph Pelrine [MetaProg]: never heard of it, but lately, I'm becoming more and more interested in how to communicate with people.
  • JAAS, authentication and user-based authorization on the Java platform by Frank Piessens [ K.U.L.]: Again one for the speaker. Frank has been my teacher at KULeuven for some courses, and he's a very nice guy. We've even almost been brothers-in-law, but that's another story altogether. (Hey, he seems to have made it to professor now. Congrats, Frank!)
  • What AOP brings to the Java developer by Wouter Joosen[ KULeuven ]: I hope to finally find some meat on the bone about AOP here. Please other examples than "logging at crosspoints (or whatever they're called)".
As you can see, to me, these events are mostly about meeting people. Some of the sessions might raise a "aha, I have to look into that!" experience, but without people, they won't be the same. So I hope to see you there...
Posted by tomk at 11:54 AM | TrackBack

November 21, 2003

Documentation tools

Via via, I discovered AurigaDoc today. A tool to generate documentation in several formats - worth checking out, I thought. And it indeed seems to do a pretty decent job. However, when I saw that you had to manually maintain the titles in your TOC, my enthusiasm very quickly faded away. The fact that documents seemed to be interspersed with <table> tags, didn't help much.

Forrest does a much better job in separating all the concerns. I am a big fan of Forrest. The only drawback that I have found was that you couldn't generate a PDF that covers your whole documentation. Since this blog entry was written several months ago, I decided to re-investigate this. And now it is possible to generate a single site-wide PDF! In your forrest.properties file, just set the project.start-uri to site.html, and both the single-page and the multiple-page versions (in HTML and PDF) are generated. Thank you Forrest!

Tested with latest CVS version. I don't know how long it has been in there.

Posted by tomk at 11:40 AM | TrackBack

November 05, 2003

Pools and PreparedStatements

A few months ago, we encountered performance problems when accessing our DB. After some searching, we quickly found out that PreparedStatements actually are better than plain Statements (don't ask). But this only is the case if you can reuse the same PreparedStatement over and over again, on the same connection. Since we were using a Connection pool, the question was raised whether putting a Connection back in the pool wouldn't "erase" its PreparedStatement pool. Since we didn't find any answer to this question, we decided to take the safe way, and build our own PreparedStatementCache. Do I surprise you if I tell you that this isn't as easy as it seems? Especially if you start mixing in Threads to clean up statements and the like....

To make a long story short, the PreparedStatementCache kept causing headaches. Every now and then, we encountered closed PreparedStatements on places where they weren't meant to be. So yesterday, I weeded everything away again, replacing everything with a ConnectionPool from Oracle (instead of the single connection we were using before). The major question remained though: If we put Connections back into the pool, will their PreparedStatements be reusable?

And this morning, I googled to finally find this article. Praise the Lord. Months of headaches down the drain. I'm a happy man today.

Update: read this too. Very interesting.

Update 2: I still wasn't very happy with the solution we got, because it was very Oracle-dependent (and in fact even dependent on the version of classes12.zip you were using). Thanks to a comment from Wim, I found out that DBCP also does Statement caching. I had heard about DBCP before, and have investigated it for this, but didn't find the reference to Statement caching. Thanks Wim! However, according to Koen, c3p0 should do a better job than DBCP. And it also has the StatementCaching option, so we went for that one. Fingers crossed that it passes the real-life tests.

Posted by tomk at 11:22 AM | Comments (3) | TrackBack

October 21, 2003

I am not alone!

Looks like I'm not the only one who hates NullPointerExceptions.

Re-reading that rant, I noticed that I've blocked out 3 of the 5 annoyances. I'm advancing more than I thought.

Posted by tomk at 10:22 AM | TrackBack

October 16, 2003

Java not cross-platform?

Dave writes:

Maybe Mono and Linux will succeed where Java and the Java platform failed. They will finally make cross-platform work, or at least the Windows/Linux part, and no longer just a silly concept.

I don't understand this. I develop software in Java on Windows every day, and deploy it to Unix every day. Even better: the same code is deployed on a Unix and on a Windows machine. It does work for me. Why is Dave still calling it "a silly concept"?

Posted by tomk at 10:50 AM | Comments (5) | TrackBack


This must have hurt: Koen admits Eclipse is handier than IntelliJ IDEA. I know of some people out there who still don't believe this. I'll wait until their assimilation is complete...
Posted by tomk at 10:36 AM | Comments (1) | TrackBack

September 25, 2003

Eclipse JDBC plugin

Via Erik: JFaceDbc. Have a look at your DB from within Eclipse. Neat. And pragmatically-programming too:
Use a Single Editor Well.
The editor should be an extension of your hand; make sure your editor is configurable, extensible, and programmable.
Posted by tomk at 10:55 AM | TrackBack

September 22, 2003

Converting InputStream to String

Ever had to get a hold of the contents of an InputStream as a String? Or as an OutputStream? Or did you ever have to any other I/O conversion? IOUtil (Avalon Framework and Phoenix) might interest you very much then. Download it from Apache's site.
Posted by tomk at 03:49 PM | Comments (13) | TrackBack

September 19, 2003

Cocoon 2.1

Yesterday, I got me a fresh CVS copy of Cocoon 2.1, you know, just for fun. Since I haven't used Cocoon at work for quite some time now (hmm, almost 2 years I guess), I've only glanced at it once in a while. I'm still lurking on cocoon-dev though.

The first thing that hit me: 2 years ago, cocoon.war was already a healthy 6-8 MB. Now it has become 35 MB. Whoa! Would that mean we get 6 times the functionality?

Further on, the build went smoothly this time. Back in the days, you had to dig through some README.TXT and INSTALL.TXT to find the right command (something along the way of ant -Dbuild.webapps=xxx install, not exactly intuitive). Now a ant war did the job perfectly. It got my PC busy for 25 minutes, but without a hitch. I hope there is a shortcut to compile while developing on the codebase, because I can't imagine coding with such a large turn-around time.

My last pet peeve: no proxy support. Somewhere in the samples, there is an "aggregator" which fetches some RSS feeds (I think) to display. However, the HTTP connection times out, which makes me think that it doesn't go through the proxy. And I haven't found a clean way to get through, either.

Anyway, the demos looked spiffy, and there was lots of them.

Scary how much you miss though when only looking at the comments, and not at the code: I thought blocks were still a work-in-progress, but it seems they have been implemented already. Marc's apples are in there too. I'll certainly have to look closer at these.

Nice to see things have evolved so quick. If the control flow is now stabilized, maybe I can have a try at introducing Cocoon at the workplace (Koen, are you reading this?)

Update:Thanks to Bertrand's comment, I got the proxy working. I was trying to use -Dhttp.proxy and -Dhttp.port, as I found somewhere, but it has to be -DproxyHost and -DproxyPort. Thanks Bertrand!
Posted by tomk at 08:28 AM | Comments (4) | TrackBack

September 18, 2003

Hibernate joins JBoss

I'm sure quite a few of you have already seen this: Hibernate Joins JBoss Group. I'm not sure yet what to make of it. It's a great opportunity for Gavin, as he will be able to spend more time on developing Hibernate. On the other hand, tight Hibernate-JBoss coupling (forcing you to use JBoss if you want Hibernate) is not an impossible scenario either. But Bill Burke seems to be very defending about this in the comments: "There will be no lock-in, because it gives no competitional advantage, on the contrary". A point that makes sense.

Anyway, future will tell. All your designs are coupled loosely enough so you're not dependent on your persistency layer, right?

Posted by tomk at 09:24 AM | TrackBack

September 12, 2003


This article, and the one it links to, are a nice read. Frameworks are indeed often hard to learn, and you're tempted to just fork them into your own codebase. This gets rid of "how can I do that in the most general way, so that it will work on a J2EE server as well as a mobile phone". But it brings the burden of keeping up with the interesting extensions/bug fixes/... that are written on the framework. Which brings us to the final question: "Can you really let it go?" Probably not. You don't abandon your child. But at least, Martin Fowler now grants us his permission to write less-than-ideal software. Which we were doing anyways.

Does this increment my Java Idiot Score"?

Posted by tomk at 09:16 AM | TrackBack

September 05, 2003

USB and Java

Fun stuff to give a spin in my spurious free time: Access USB via Java.
Posted by tomk at 01:51 PM | TrackBack

August 19, 2003

Nice regexp plugin

A nice regexp plugin for Eclipse. Seems like fun stuff if you're dealing with regular expressions in Java. Enjoy!
Posted by tomk at 08:59 AM | TrackBack

August 12, 2003

JDeveloper 9.0.5

Top Ten Toys for Java Coders in 9.0.5. Hmm, most of these are already a long time available in Eclipse. And Eclipse copied most of it from Idea. Thus, not much on that page that convinces me to give JDeveloper a whirl. Has anybody got better arguments?
Posted by tomk at 12:50 PM | Comments (8) | TrackBack

August 01, 2003

Java Speech

Remember this? Now Erik leads me here, which brought me to FreeTTS. I just listened to the "Talking clock" demo. Seems like it is play time :-)

Useful? Maybe not. Fun? Certainly! Just like playing around with charts and Forrest skins is fun: immediate result. I just love to tweak a parameter or a line of code, and see a line change from red to blue.

Now if you'll excuse me, I have some text to hear.

Posted by tomk at 10:32 AM | Comments (1) | TrackBack

July 31, 2003

Wanted: mouse-free Eclipse

Kasia triggers me to complain about Eclipse's greatest shortcoming: why can't I switch editors without touching my mouse? Is it that hard to implement CTRL-TAB? I code, hence I type. When I'm using Gimp, I want to point and click, since I have the mouse in my hand. When I'm typing, I want to do everything with the keyboard, since my hands are there.

New product idea: a keyboard that is also a mouse. Keep your hands on the keyboard, and just drag it around. Mouse buttons should be right below the spacebar. Alternative: add 102 keys to the mouse. But I guess that results in the same...

Update: I knew I should've googled before writing this. Still love the idea of the keyboard though.

Posted by tomk at 10:34 AM | Comments (4) | TrackBack

July 30, 2003

Java interview questions

My referers log shows that a lot of people are looking for interview questions about Java (and they end up here).

I think this is pretty weird. It almost sounds like cheating to me. "I will probably not know the answers, so I'll study a list of prechewed questions on beforehand." Is it not better to know your trade (or "craft" as the Guild of Pragmatic Programmers call it) instead of trying to hide your ignorance from your future boss?

On the other hand, it is only the bosses that believe in this "trick question interview method" that will be fooled. And if you really know your trade, you won't want to work for these guys. You'll want to work for cluefull bosses, that acknowledge that it is not what you know, but what you are able to learn, that determine your value. Read that last sentence again. It is not the length of your skills listing that counts, but the ability to extend that list. You'll never have all the skills that are listed, but if you can master them, a cluefull boss will hire you.

Let me share a memory with you: for my first Java job, the interviewer (I won't tell you who it was -- but he is on my blog roll) drew 2 balloons on a whiteboard. "This is your pc, and this is yahoo.com. You enter http://www.yahoo.com in your browser. What happens?" And I was off for 45 minutes of staggering and explaining TCP/IP and DNS and whatnot. However, the real interview was not whether I had everything right, but how I went into dialogue with the interviewer, and how we reasoned together to an explanation. This dialogue was the main reason I signed for his company (we write 1999, a "young potential" just had to pick a job), and I've never regretted that. No better environment than a bunch of intelligent people to enhance your intelligence. But I digress...

The point I want to make is that it makes no sense to go surf the net for interview questions. If the interviewer wants to rely on these mind tricks, you won't be happy working for him. And on the other hand, if you can't answer these mind tricks adequately (not: correctly! but: adequately) without looking them up first, you'll probably fall through in the first month at your new job.

I'll end with a warning note: don't read in the above that your current skill set isn't important. Heck, I'm pretty proud of my own list. Don't think "OK, I'll learn new stuff when I get a new job then." You chose for IT. The main part of the rest of your career is going to be to learn. Live with it, or find another craft you're good at.

Update: if you really want to succeed in your Java career, you might want to get started with this book.

I strongly and sincerely believe this will help you more than searching the Internet for interview questions.

Posted by tomk at 11:16 AM | Comments (582) | TrackBack

July 29, 2003

Image reader

Into my toolkit: Imagero: an image reading library for Java.
Posted by tomk at 01:09 PM | TrackBack

July 15, 2003

For the archeologists

Nice read: Once Upon an Oak .... Enjoy.
Posted by tomk at 02:26 PM | TrackBack

July 07, 2003


Wow. Software IG for Corporate IT. Can you think of a better way to demotivate people? "Yep, you're just a code whore, and I'm going to make you feel it." Or: "I connected this webapp with this DB2-backed Cobol system, and it didn't fail on us once." "Yup, but your curly brackets are on the wrong places".

Come on. Thinking like the military is not going to cause progression.

Posted by tomk at 11:12 AM | TrackBack

July 03, 2003

The Sun JCD Exam

Zulfikar Dharmawan gives a short overview of how the SJCD looks like. I know this. I have received the assignment some time ago (looks like several lifetimes...), but I never got myself motivated to do it. A big part of the assignment goes on byte[] handling (in functions, in network streams), on parts you aren't allowed to modify. I almost never use arrays, because they're too cumbersome to work with. I almost never need them either (can you say "List"?).

Another part of the exam is implementing your own network protocol (how often do you do that during web development?) using either these byte streams or RMI. And yet another part is about Swing (as does the Sun Certified Java Programmer's exam): if you don't know Swing, you don't know Java. Yeah, sure.

All in all, I think it's a pretty weird way to investigate whether you know Java. "Yeah, we have all this nifty API's in Java, but for now, you're not allowed to use them. Except for this one, that you don't really need, you have to use that one. Now prove that you understand the language." I believe that, to understand Java, you're better of finding your way around the API(s) than knowing how the >>> operator works (or was it <<< ? I did know it once when taking (and amply passing!) my SCJP exam), or knowing what the default LayoutManager for Panel is.

Posted by tomk at 10:43 AM | TrackBack

June 26, 2003


Since I've only recently returned from holiday, I'm excused for being late in congratulating the Orixo members (you'll find most of them in my blogroll). Congratulations. Knowing these people (well, some more than others of course), I'm sure they have the necessary intellectual mass and business ethics to carry such an undertaking to great heights. And I'm convinced they'll have a great time doing this.
Posted by tomk at 02:10 PM | TrackBack

June 05, 2003

CVSSource project

In reaction to my cry for help for a Java-based WebCVS, Sylvain pointed me to CVSSource. It's weird how small and how big the world has become at the same time these days: this weblog is probably interleaving inodes with that project, but I wasn't really aware of its existence. It could as well have been on a server in Australia, with no notifiable difference for me. Which actually reminds me that I have no idea where the cocoondev.org machine physically resides. Maybe it is Australia.

Anyway, CVSSource is a Cocoon-based CVS viewer. It could still use some extra features (which, as Sylvain told me, are in the pipeline), but it does what it has to do: show the contents of a CVS repository in your browser. Even the indentation of the .java files is taken care of. Very nice job overall. If you want a Java-based browser view on your CVS repository, definitely recommended.

Posted by tomk at 01:11 PM | TrackBack

June 04, 2003

CVS on the web

So we're looking for a CVS servlet. Basically, we want to be able to browse a local CVS repository over a web server. "Aha!", you'll say, "just use ViewCVS!" There's one problem though: it has to run on IBM's WebSphere, and AFAIK that doesn't support Python. Moreover, I've never tried to run Python on any sort of web server, so I have no idea where to start.

"Aha!", you'll say again, "let's google it!". Yes, thank you. This gave me 2 projects: jCVS and Alexandria. Both of them seem to be a little dead. I actually tried to install jCVS, but it left me with the feeling that it would only run on un*x. Alexandria, I didn't even bother, given the big red warning box on its front page.

I only see a few options left:

  • Figure out a way to run Python on WebSphere
  • Figure out a way to run Python scripts inside a servlet
  • Write my own application (hopefully I can find at least a Java-based CVS client engine somewhere)
  • Beg you for your knowledge and help. That's actually the one that I like best. Have you done something similar? Are there ways that I don't see (yet)? I would very much appreciate your comments.

Posted by tomk at 03:23 PM | Comments (2) | TrackBack

Forrest CSS skin

Announcing the birth of a new Forrest skin. Forrest is a great way to generate (non-API) documentation. If you try it, you will be amazed of how much you actually put in documentation if you don't have to worry about font size and stubborn images at the same time.

It works like this: you type documentation in your favorite Notepad. You select a layout. You press "generate". Et voil, all your content appears professionally laid out in HTML and PDF. It even impressed some project managers around here, who immediately wanted to play with it.

And now, you can take advantage of the power of CSS too!

You can see the result here. And the code is already assimilated into the Forrest CVS, so it shouldn't be too hard to get your hands on it. Enjoy!

Posted by tomk at 10:21 AM | TrackBack

June 02, 2003

Patterns of Enterprise Application Architecture

I picked up my copy of Patterns of Enterprise Application Architecture again. I just finished the first part, which describes the design patterns in relation to each other. The main difference with all the other "pattern" books? Martin Fowler doesn't have the "I know it all so you should listen" attitude, but more the "From my experience, I think this and that is worth considering". And a wide experience he has, so you might very well want to follow his advice. He even has a non-dogmatic view on the EJB story. Very good read. Recommended for everybody who has ever written (or has to write) an application with a Web interface and a database backend (aka "Enterprise application").

The rest of the book goes into the various design patterns in more detail, but without loosing the oversight. It looks very promising. I will be a less dogmatic person in the end (as far as I was one).

Posted by tomk at 01:33 PM | TrackBack

May 20, 2003

Quote of the day: Cocoon

Quote of the day. I was talking to a collegue of mine:
Me: I used to work a lot with Cocoon. It is lots of fun to work with.
He (amazed): You worked with it a lot, and you still think it's fun?
Yep. I didn't realize this mismatch until somebody else told me, but this is how it is. Most frameworks/packages/.... aren't fun anymore once you get your hands dirty with it. Cocoon is. And that's why we love it.
Posted by tomk at 08:59 AM | Comments (2) | TrackBack

May 13, 2003

Jakarta Commons Codec

During lunch, I was talking with Koen about his successful Debian installation, which I still find quite impressive for somebody who never has even seen Linux until last week, and mentioned the cool talk utility that comes with it. And now I open Erik's Weblog, and see something about Jakarta Commons Codec. I'm not sure if I understand it, but is this some way to have the computer speak? Now that is stuff that I like to play with... Anybody happens to know some application that uses this? Or should I dig into the difference between Metaphone and Soundex myself? Comments as "you stupid woman, don't you see this has nothing to do with sound" are welcome, too.

BTW, Erik, The Matrix Reloaded opens in Belgium on a Thursday, too. It already struck me as odd...

Posted by tomk at 01:33 PM | Comments (1) | TrackBack

May 12, 2003


Bertrand (the proud new father of 6 puppies) writes about LogFactor5. Wow. That looks really impressive. Thanks for the link, Bertrand!
Posted by tomk at 11:01 AM | Comments (1) | TrackBack

May 05, 2003

Web Unit testing

This looks interesting: jWebUnit: a unit testing framework on top of HTTPUnit. I've always found HTTPUnit a bit too verbose to use, and jWebUnit seems to handle that. Thanks, Koz.
Posted by tomk at 10:11 AM | Comments (1) | TrackBack

May 02, 2003

Re: Composing Strings

I got a nice reaction on Composing Strings, from somebody who apparently wants to remain anonymous:

StringBuffer sb = new StringBuffer();
for (Iterator it = list.iterator(); it.hasNext(); sb.append(it.hasNext()?"and":"")) {
This answers all the criteria of the problem. Alas, readability wasn't one of them (as noted by himself, BTW).

So does atog's solution, which is more readable, but I still feel it as a waste of energy to add things, and then take them away again. Maybe I'm just being stubborn on this.

And no, Java has no String.join() operation as one kind soul suggested in the comments. Looks like something for Yet Another Util Package.

Posted by tomk at 11:32 PM | Comments (1) | TrackBack

April 29, 2003

Re: dumb-ass

Seems like I have some explaining to do: Outer Web Thought Log: False modesty. I didn't say that I felt a dumb-ass, I only meant that by the other guy, and any occasional innocent bystanders for that matter, I must have been perceived that way. Moreover, the time nor the context didn't allow us to go into an intellectual arm-wrestling to see who actually was more knowing, it only went "Hmm, yeah, Cocoon was hard to learn in those days." "No it isn't." "Yeah it was." "No it isn't." "See ya."

Now is this "Java" or "Personal"? Or "XML"?

Later: Oops, almost forgot: Thanks for the compliment, Steven!

Posted by tomk at 03:55 PM | TrackBack

April 26, 2003

Cocoon flow

To read: CocoonWiki: GettingStartedWithFlow (via various blogs). To hope: get a chance to do something with Cocoon again. It's been over a year and a half that I haven't been doing any real development in Cocoon. I'm still trying to keep up though. Pure love.

Side note: on a recent conversation, I mentioned the fact that Cocoon was hard to learn when I learnt it (somewhere in 2000, I think). The other guy didn't agree, and thought it was easy. He probably stepped in recently, and had tons of Wiki at his disposal. Anyway, I came out as a complete dumb-ass. Good news for Cocoon.

Posted by tomk at 11:04 AM | TrackBack

April 22, 2003

Composing Strings

An entirely non-issue, but I'm curious nevertheless: What do you, Java programmer, use to create sentences while looping through a list? Often, you have to generate some String based on the contents of some Iterator (to generate output, or an error message, or whatever). In most cases, this asks for some kind of separator, which should be between two elements, but not in the beginning nor the end of the resulting String.

The construct I like most till now, is

StringBuffer sb = new StringBuffer();
String and = "";
for (Iterator iter = myList.iterator(); iter.hasNext();) {
  and = " and ";

I've also seen boolean to keep track of whether you're handling the first element or not, and I've seen StringBuffers loosing their tails after the loop... The above is quite nice, but the scope of the and String is too large.

Anyway, consider this an exchange of taste: what construct do you usually use to achieve this?

Posted by tomk at 03:53 PM | Comments (1) | TrackBack

PHPer goes Java

This is the first of a kind I've ever read. I've seen many Java developers suddenly going crazy about Perl, PHP, Python, Jython, and the likes, but never the other way around. Nice. Feel the love, man.
Posted by tomk at 03:27 PM | Comments (1) | TrackBack

Record locking

Matt Raible asks how to lock a DB record in a webapp. A method that always works (I learnt it from a VB guru (yes, those do exist)), is a very bare-bones optimistic locking. On each table, add a column LAST_EDITED, of date type. Now, whenever you do an update, include the LAST_EDITED in your WHERE clause, and fill in the local time. So you get:

UPDATE my_table SET blah='bluh', LAST_EDITED=now WHERE blah='bleh' AND LAST_EDITED=time-you-got-from-your-select-query
IIRC, the "now" is a function in Oracle. The alternative is to provide another time (System.getTimeInMillis()), but this will only work for 99.99% of the cases (granted, if you happen to have 2 updates on the same split millisecond (according to 2 different machines), you'll probably get gray hair trying to solve it anyways).

As always, I'm not sure if I made myself clear. Drop a comment if I didn't.

Posted by tomk at 09:52 AM | TrackBack

April 17, 2003

Mind games

These are fun mind games. Read it before you continue here. I'll wait.

Have you read it? Now, extra game: produce an example that demonstrates the same issue(s). Really, try it. I'll wait again. I've got time.

Not as easy as you thought, hein? Tht ability, my friend, is what makes a good engineer a great teacher...

Posted by tomk at 02:06 PM | TrackBack

April 16, 2003


To whom it concerns: JUI 0.6

Thanks Erik.

Posted by tomk at 02:02 PM | Comments (1) | TrackBack

April 01, 2003

Blog overload

Blogs are very interesting, and provide lots of information. However, one needs time to digest this information into knowledge. And I seem to be missing that. So in an effort to remind myself of what I still need to look at to improve my knowledge, a list of not-yet-digested blog entries:
Posted by tomk at 01:14 PM | Comments (1) | TrackBack

March 16, 2003


Short comment on this: JavaBear

  • Put your comment on the appropriate level. Implementation details don't belong in the method's javadoc, but maybe in the method's comment. "The counter i is increased with 2 each time because..." does not belong in the method's comment.
  • Don't only comment why, but also what. Have you never encountered some string manipulation code, that forced you to execute it in your mind before you figured out what it does? "This removes every third character from the string, but keeps the last 6, the middle 4, and deletes the first 3" might prove very time-saving.

Now moving on, discussions like this become very fast very boring. But I couldn't resist.

Posted by tomk at 10:05 AM | TrackBack

March 11, 2003

Struttin' with Struts

Just found Struttin' With Struts - Lessons. Seems like an interesting tutorial for Struts newbies. I know I wish I had something like this a year and a half ago.

via Matt Raible

Posted by tomk at 05:46 PM | Comments (1) | TrackBack

March 04, 2003

Forrest: the response

As I wrote last week, I've used Forrest to build some documentation for my client. I've presented it to some people already, and all reactions were "ooohh..." and "aaaahh....". Some even asked where they could find this tool, so they could play with it themselves. And those are not Java people! Great.

When I present Forrest, I start with "it's a site", and "it's generated from xml". "You put your xml through a command line tool, and then you get this html". Occasionally, I change the skin, rebuild, and get some more "ooohhh". But the final feature that makes them go "I want that" is the auto-generation of the PDF files. Great, they think, two files with the effort of typing one. And right they are :-)

The only thing that looks like a drawback (give a finger, and they'll want an arm) is that all PDFs are per-page. It's not (yet?) possible to generate one big PDF from the whole of the site. It's on Forrest's Dream List though, so I keep my hopes up that it will get there some day. In the mean time, I've quickly pondered what difficulties would come up when you implement something like that, and it didn't look too easy. You'd have to build a PDF file while crawling the site, instead of just aggregating a static collection of PDF pipelines. At least, that's how it looks from the outside. And that is probably the reason that it's not implemented yet. Ah, time, sweet time...

But overall: fantastic job, Forresteers. You really made it possible to concentrate on content instead of fighting with the text editor's whims.

Posted by tomk at 04:27 PM | Comments (1) | TrackBack

February 28, 2003


I'm currently using Forrest to document the evaluation of various O/R frameworks I did for my current employer. In fact, I started with a MS Word document, but I got pale in the foresight of twiddling with headers and fonts to get something presentable. Then I decided just to go for it. It rocks. I had to find out a bit how the <link> tag works a bit, but that's forgotten already.

I'm curious what my readers will think of it when I present it to them next week... I'll keep you posted.

Posted by tomk at 03:25 PM | Comments (1) | TrackBack

February 13, 2003

Big bucks

Danno wants to earn big bucks ;-)

While of course I'm interested in this too, it is in the end that the real danger lies:

just because you can monkey around with J2EE middleware doesn't mean you are worth one tenth of the money that is spent on you
I've been pondering this for a while now. Most of the companies that hire contractors, are not capable of making a distinction between a good and a bad programmer. So how are good programmers able to prove they're good? How can you (honestly) prove that you're actually ten times more productive than the next guy/gal in line, who asks only half of the fee you ask?

BTW, nobody should have a problem convincing somebody with mere buzzword throwing. It's a weapon the next in line will use too, so don't be afraid/shy/"political correct" to do it.

Another tip: when asked "how well do you know X?", don't be afraid to say "very well!". I've experienced situations when I answered "well, I've been playing around with it, but it's not really my area of expertise.", while the next in line just said "I know it!", but didn't know where the start button was, so to speak.

Probably it's not plain dishonesty of those people. The more you know, the more you know what you don't know. I want to explain this to you: imagine that everything there is to know, is a plane. The things you know, is a filled circle in that plane. Now, imagine a small circle. It has a small boundary, so for somebody inside that circle, it is just to say "there is little that I see that I don't know yet". And imagine a BIG circle. It has a very BIG boundary. A person in a big circle will be more apt to say "There is much I don't know yet." Which doesn't mean he knows less, only that he sees more that there still is to know. (I hope this is a bit clear. Courtesy of a teacher in high school. It's a bit more clear when drawn on a chalk board, I guess.)

So to conclude: when presenting your knowledge, don't concentrate on everything you don't know, but on everything you do know. Now if only I could do this in practice instead of in theory ...

Posted by tomk at 05:32 PM | Comments (5) | TrackBack

Hibernate: the sequel

I encountered my first mayor stumble in getting Hibernate to do what I want it to do.

We have a database which has business data as primary keys. Those keys are (wisely) encapsulated in objects (in the Java code, that is). Now, Hibernate recommends not to use business data as primary keys, but says it still is allowed. I'm glad to hear that. Now I'm just figuring out how to tell Hibernate that it should use our class while doing the mapping. I already found out that it had to implement UserType. But the documentation of the UserType interface seems to be a bit scarce in what exactly every method is doing. So now I'm stuck with a

cirrus.hibernate.PropertyAccessException: IllegalArgumentException occurred while calling: argument type mismatch setter of X
I hope I can get this solved soon. Refactoring the DB to use non-business primary keys is too big an investment for us ATM (certainly in the light of the fact that we're still evaluating Hibernate, and didn't take the "let's do it" decision yet).

Posted by tomk at 10:55 AM | Comments (2) | TrackBack

February 11, 2003

"Java tools"

Yet another "my Java tools" list. They seem to be very popular at the moment (like the "my cd collection" on each personal homepage some years ago?"). Anyway, to check out when time permits (there seem to be some on that list I didn't know of yet).
Posted by tomk at 01:24 PM | Comments (1) | TrackBack

February 06, 2003


Erik pointed me (once again) to something that looked interesting: a pure Java Microsoft MSN Messenger clone. I got the files, unzipped, started, tried to login... and got disappointed again. The authors didn't provide any way to configure a HTTP proxy. This is the nth time I've seen it. It's kind of weird: every C, C++ or .NET application I get, has a "proxy settings" box somewhere. None of the Java programs have it. Is it that hard to configure proxies in Java (I've never tried it)? Or are most Java programmers using direct T1 lines?

Note: I know there is some arcane -D setting you can provide to use a HTTP proxy, but I forget every time what it is, and Google doesn't return too many useful hits on that one. It should be configurable anyways.

Note: This is in no way an attack on the authors of JMSN. It is just a general remark. My hope is that at least one Java programmer who is about to release some nifty code, now thinks "Ah, I'll quickly add that before I release".

Posted by tomk at 01:48 PM | Comments (2) | TrackBack

February 05, 2003


Quote of the day (from the Hibernate manual):
Unfortunately, Hibernate is flexible and supports several approaches.
Or how users and documenters don't see everything in the same perspective ;-)
Posted by tomk at 10:57 AM | TrackBack

A JRE per application

For the "hmm, it might be useful some time" collection: Multiple Java Homes (via Ted Neward). The "root" article is also a good read: Comments re: "Sun's own engineers find Java'impractical'". Looks like the JavaBear is going into my blog roll (which I really should publish here one day).
Posted by tomk at 09:56 AM | TrackBack

February 04, 2003

O/R - Thank you

I just wanted to thank everybody who commented on my JDO / O/R search-in-the-dark (including Joe -- if I've overlooked somebody, let me know. I still have to work on the refer(r)er-tracking of this blog).

It seems like everybody recommends Hibernate (with OJB as a close second). I will concentrate now on the first one. Thanks again, everybody!

Posted by tomk at 01:40 PM | TrackBack

February 03, 2003

Another Cocoonie spotted

dsuspense, aka Dominic Da Silva. His mug shot already makes me feel like summertime. Bring out the cockail shaker!
Posted by tomk at 11:52 AM | TrackBack

JDO, or O/R

I'm currently looking for a solution to the Persistence Problem. Revisiting the O/R problem yet again. Currently, we're having a mechanism based on Value Objects and Data Access Objects which works quite well, except for the fact that it's a nightmare performance wise. In order to improve performance, we're writing custom Connection wrappers, parsing and reparsing statements to make them Prepared Statements, etc etc. Every improvement creates some "we have to remember to do that with new objects in the future", each of which can be easily forgotten and which omitment is not readily noticed.

An added complexity is that we need a system that works as good for batch processing (thousands of records at once, loaded from files) as for "online" processing (one at a time, with a user sitting at a screen), without copying all the business logic. It's easy to build a system that works A-OK for either, but not for both.

So somebody pointed me to JDO. It seems to be a good replacement for our DAO layer. Map your objects to a DB without too much complexity. But I'm quite hesitant: will it solve our performance problems? Will it be as easy to convert our application as it looks? Even worse: if we decide to go for JDO, do we need Sun's JDO spec, or is Castor's better? Sun's spec doesn't seem to have a free implementation, which makes it riskier to invest in that option. I've heard a lot of good of Castor, but it was about it's XML serialization. Are they as good in O/R mapping? I'm looking into it, but real-life experience would be very welcome. I'm kind of searching around in the dark, with a flashlight that only reveals positive points.

Posted by tomk at 11:42 AM | Comments (7) | TrackBack

January 30, 2003

Effective Java

Another positive review of Joshua Bloch's "Effective Java". The book stays on top of my "best all-time Java books" list.
Posted by tomk at 05:50 PM | TrackBack

January 28, 2003

Profiling in Java

Just found jMechanic (via Glen via Erik). Looks like something I want to get my hands dirty with.
Posted by tomk at 01:41 PM | TrackBack


Another one for the maybe-this-is-useful-in-the-future bucket: SysTray for Java.
Posted by tomk at 01:32 PM | Comments (2) | TrackBack

January 27, 2003

To IDE or not to IDE?

I stumbled over HotLinks Ednote: 10 Reasons to Dump Your Java IDE (via AcroYear). All good reasons why not to use JBuilder, NetBeans, and what else. But nothing that stops you from using Eclipse. Basically, the author's comments only go for GUI development IMO, not for "IDE"s that have auto-completion, "Show declaration", "Extract method", "Rename method", and even ctrl-Q!
Posted by tomk at 10:31 AM | Comments (3) | TrackBack

January 23, 2003

So much OSS ...

Darren writes about "A few of my favourite things". All stuff I want to know and understand too.

I want to have a look at Castor (especially since I read some stuff on JDO, which looks like I could use it in my day-time job project), OpenJMS (just because JMS seems to stir so much feelings lately), and XDoclet (programming without programming?). The problem with all these (and a lot of other) stuff is that not only you have to know it, but you also have to think in it. It's not just "Oh, let's use that", but more like "I'm going to use that, how would my problem be solved with that tool?", which leads to the hammer-and-nail syndrome. Still, I want to study those things, since I believe they will reduce my dummy-typing and improve my creativity-unleashment (if that's a word).

In the mean time, I'm proud to say that I know and use Ant and CVS. I'm taking baby steps in JUnit, too (which is also more a way of thinking than a tool).

The role of TortoiseCVS and WinMerge is gracefully replaced by Eclipse, so I don't need to worry about them.

Scarab looks useful, but people are afraid of the "oh no, more administration" syndrome when introducing it into our team. As a result, we're coping with several Excel sheets and workbooks now...

As for Jetty: a servlet container is a servlet container in my eyes. I couldn't care less if my project was run on Tomcat, Jetty, or whatever. That's what standards are for.

One final note: SAP gives away a DB now? It even comes with a JDBC driver. I wonder what the business model behind that is ...

Posted by tomk at 10:43 AM | TrackBack

January 21, 2003

Unit testing vs API definition

There is one thing I always get confused with when trying to make do some solid unit testing: how do you test private methods? AFAIU, unit testing should be done on chunks that are as small as possible. Those small chunks are most of the time implementation-specific. So good API design dictates to make them private. But then they become invisible for the TestCases...

I've just tried to develop some naming convention (make the real method doStuff() private, and define another method public doStuffTestHook()) to indicate that the public method is not to be used for normal use, but it still stinks. I've heard about some unit testing adagio "make everything public", but I don't like it, because I'll end up seeing somebody else using the method while she wasn't intended to.

I guess I have some serious googling/reading/learning to do about this. In the meanwhile, if you could send me some URLs, I'd be thankful.

Update I've been beaten by the FAQ again. Note to self: The information is out there.

Posted by tomk at 03:28 PM | Comments (2) | TrackBack

January 20, 2003


I just installed a new version of Eclipse (Version: 2.1, Build id: 200301151011). It has Ctrl-Q! This takes you to the last position where you did an edit. Totally kewl. (Actually, I don't know if Eclipse had this in previous versions.)
Posted by tomk at 04:02 PM | Comments (3) | TrackBack


Just for my link collection: jVNC (Java VNC Server). Might come in handy some time. Might not. Who knows the future?
Posted by tomk at 10:37 AM | TrackBack

January 19, 2003

Eclipse, CVS and SSH

The first point has been accomplished. Not that hard, since Eclipse has a FAQ about this. The hard part was to actually find this link (I'm the kind of guy that doesn't think of clicking "Help" from the menu. I think I got that from the "Start -> Help" menu from Windows: is there anybody who's actually found anything useful in there?) Anyway, I just thought I'd put it in here for the Googlers :-)
Posted by tomk at 09:08 PM | Comments (1) | TrackBack


I'm trying to get over my winter dip now. "Sick and tired of being sick and tired." My fingers are itching to get Wings in the air. Action points:
  1. Get CVS and SSH working again on this W2K machine
  2. Separate Wings again from the Cocoon/Avalon jars. I wrongly coupled them while writing a Transformer.
  3. Get the link I always refer to, to actually show something
  4. Make everything machine-independent (now you have a lot of path fixing to do).
  5. Provide an easy-to-run demo, that makes people say "yummy".
  6. Weed out all old code that still is in the codebase, but is not used anymore. If people still want to see that code, there always is CVS. I think this is an Extreme Programming principle :-)
  7. Work out the file formats a bit more
  8. Document the file formats.
  9. Replace Xalan XPath with jaxen.
This is a fairly chronological list. I'd like to try some XP alongside this: get unit tests. Program as simple as possible. Pair programming won't be an option though ;-)
Posted by tomk at 04:02 PM | TrackBack

January 15, 2003

Unsafe Java

Codito ergo sum talks about the Unsafe class. Direct memory access in Java (although I"m not sure if you can really access memory that's not allocated by the JVM). Dreams shattered.
(This post was entered by the MovableType bookmarklet. Kewl!)
Posted by tomk at 11:20 AM | TrackBack

GUI testing

This is for me to remember the link in the future. Most of my work is in web application development, but occasionally I write a Swing thingy.
Posted by tomk at 03:30 AM | Comments (1) | TrackBack

Search Java API

Into my bookmarks you go. (Via some blog, but I forgot which one. Will add when found. Update: Who else than my favorite unix girl! )
Posted by tomk at 03:13 AM | TrackBack


Another happy customer of jCharts. I'm using jCharts myself in the Wings project, which takes XML and outputs charts in SVG or JPEG. Admittedly it's not ready for every day use (there's still a lot of configuration that's hard coded, and there's one file format I definitely still have to look into), but the OuterThought guys already managed to get it working as part of xReporter. They showed it to me on The GetTogether. But I digress... What I wanted to say: if you want charts, have a look at jCharts, and if you want charts with XML input, have a look at Wings (and don't hesitate to send patches :p ).
Posted by tomk at 02:58 AM | Comments (0) | TrackBack

January 13, 2003


Steven wants a Python IDE. JEdit has a plugin for Python support. Maybe Steven can add this to his to-be-reviewed list. I haven't used it (I once did a lazy effort to get into Jython, but I didn't get convinced of "the magic"), but I have used JEdit as a Java editor (before the Eclipse-days, when the only alternatives were TextPad and UltraEdit), and it did fairly well.
Posted by tomk at 07:13 AM | TrackBack

January 10, 2003


It seems like I could link to kasia every time she writes something. Add her to your aggregator. I hope one day, she'll write something I disagree with. It makes more interesting posts than "I agree"...
Posted by tomk at 10:10 AM | TrackBack

WORA, Java, and .NET

Ted Neward is writing about WORA. Especially the last paragraph is interesting:
Remember how long it took us to get Sun to do a Linux port? They never really wrote the port, either--they just swiped the Blackdown port and forwarded it as their own. Sun has long only been interested in Java for two platforms: Solaris (by choice) and Win32 (by necessity). Let me also take this moment to redirect readers to John Lam's article questioning where WORA leaves Sun in terms of a business strategy; in many respects, WORA doesn't make sense for a company that makes the majority of their revenue from hardware, and this is a point that Sun has never explained the rationale behind. Given this kind of fogginess, why do you expect Microsoft to follow a similar strategy? Where's the money in WORA for the platform implementor?
Food for thought. What's Sun's hidden agenda for promoting WORA? (and why weren't they consistent in it?) If you were Bill today, would you port .NET to other platforms? (No, honest. You're in his chair. You have a mortgage to pay on a 2500-acre house. You want to buy the misses a nice island or so for her birthday.)

What I appreciate in the Softies community, is that at least they admit that MS is in the game for the money. Be sure that Sun is too, but they don't advertise it that much (and some Java people seem to think they're some sort of charity, too).

Posted by tomk at 05:17 AM | Comments (0) | TrackBack

January 09, 2003

Blogger API in Eclipse

snellspace: blog from within your Eclipse. Looks awesome. I seem to have troubles to get it to use a proxy though :-(
Posted by tomk at 05:50 AM | TrackBack

January 08, 2003


Let's start a Mexican wave. Let's hope stuff like this (releasing professional in-house developed code as OSS) gets more common.
Posted by tomk at 08:03 AM | Comments (0) | TrackBack

Free Java Tip of the Day

Kasia: Why chaining is bad. IMO, it's even not only for stepping, but think what happens if you get an NPE in the first example. And in the refactored one...
Posted by tomk at 04:08 AM | Comments (0) | TrackBack

January 04, 2003

Sequence diagrams

Bookmark to self: investigate this further.
Posted by tomk at 06:07 AM | TrackBack

December 20, 2002

Exception tracking

Free Java tip of the day: If you're hunting down an Exception somewhere, get the stack trace! Some people like the "concise" System.out.println(exc.getMessage());, which isn't of much help. I've just seen some people that I thought knew a bit of Java, looking at an error message ("NullPointerException"), and at some code, trying to guess where the error occurred. tomK's rule #412: a NullPointerException always occurs on another place than you think. You'll end up spending several hours trying to fix an NPE that wasn't there in the first place. The first thing you should do when you have to fix an Exception like this, is to get the stack trace, recompile, and re-trigger the bug. To make life even easier, include the stack trace when writing the code (in a file! exc.printStackTrace() is useless when running on a server).
Posted by tomk at 06:08 PM | TrackBack

December 13, 2002


During my college studies, I've seen many algorithms of which I thought "Hmm, nicely done, but will it ever have any practical value in the rest of my life?" Dijkstra's graph coloring algorithm was one of them.

Now, I'm working on a supply chain planning project. And one of the things I have to check is "We have a number of facilities with delivery lanes between them. We have to take care that no closed loops are created between those facilities." Up came Dijkstra's graph coloring algorithm (to my utter astonishment).

Lessons learnt:

  • it never hurts to learn lessons
  • it's hard to find a link explaining Dijkstra's graph coloring algorithm. I'm even doubting now that it was Dijkstra's. If you know a page where the closed-loop detection algorithm is described, feel free to send it to me (I've got it on hardcopy, but I'm not going to type that over ;) ).
Posted by tomk at 05:33 PM | Comments (0) | TrackBack

December 12, 2002


I agree with him. I think in general, the type-appending is A Bad Thing. If my variable changes from an int to a long, I don't want to change its name. If Person is a class, and suddenly I want it to be an interface, I don't want to go through all of my code to change it (moreover, if I'm maintaining an API, I don't want the users of my API to have to change their code).

'nuff said. Just a "me too" post.

Posted by tomk at 09:31 AM | TrackBack

December 09, 2002

Wanted: DB cache

I'm on the lookout for a DB cache: if I have one JVM that's running to update a DB (and I can guarantee it's the only client of the DB at that moment), it should be possible to have a in-JVM cache for the DB: have several inserts and updates, and have selects that can take these writes in account. Once in a while, the cache is flushed. The cache would be the interface we talk to, and it delegates stuff to the real DB as necessary. Am I the first one with this itch?

Update: looking into JCS (gotta love Apache) and JSR 107 (which seems like a work in progress).

Posted by tomk at 10:35 PM | Comments (0) | TrackBack

Job Hunting

Seems like somebody else also has read the SlashDot article on job hunting :-) He's done a better job than me though: he described the ideal job. Well, mine is located somewhere reachable within 30 minutes from my home (Wilrijk, Antwerp, Belgium) (by car, or even better: by bike :) ), involves high-level Java (analysis and design, architecture, education and mentoring, ...), and earns enough to support (part of) my girlfriend and my son (of whom BTW I'll have to post some pictures soon).
Posted by tomk at 05:14 PM | TrackBack

December 05, 2002

Java performance

Stuart Roebuck is writing about profiling Java. I had the same experience (except for the MaxOS X part). Have to read this site.
Posted by tomk at 06:59 PM | TrackBack

JSR 201

Sam Ruby is referring to a JSR, apparently led by Joshua Bloch, the writer of one of the most interesting Java books ever.

Enumerations: gotta love it. No more public final static int FIRST_CASE=0; Autoboxing: seems to solve the main drawback that Java has compared to C# these days. Enhanced for loop seems to be syntactical sugar, and the static import seems even dangerous (at a first glance). But I want the former 2!

Posted by tomk at 06:57 PM | TrackBack

December 03, 2002

Jobs in OSS

Slashdot has a nice article on how to get jobs in OSS development. I think I've got pretty much everything covered, but for the last paragraph. And that's why blogs exist :-)
Posted by tomk at 04:11 PM | TrackBack

December 02, 2002


It seems that breakpoints are pretty well hidden in IDEA. I can assure you that they're not in Eclipse (perspectives, remember?) ;-)
Posted by tomk at 08:07 AM | Comments (0) | TrackBack

December 01, 2002


After boasting about Eclipse the other day, I decided to give it another try on my KDE box.
[tomk@gonzalez eclipse]$ ./eclipse
** (:3215): WARNING **: Cannot open font file for font Arial 10
** (:3215): WARNING **: Cannot open fallback font, nothing to do
** (eclipse:3214): WARNING **: Cannot open font file for font Arial 10
** (eclipse:3214): WARNING **: Cannot open fallback font, nothing to do
[tomk@gonzalez eclipse]$
Grmbl. Eclipse announces to run on Gnome, but apparently not on KDE. And Gnome doesn't run out of the box on my Mandrake 9.0 distribution. And I don't feel like spending another few days on trying to install it. So back to jEdit it is :-)
Posted by tomk at 06:23 PM | TrackBack

November 29, 2002

Eclipse (the sequel)

Well, I'm being hyperlinked at last (although I have to admit I had to do some PR for this).

With the risk of this becoming a pong game, I want to make myself clear on one point: I didn't mean that the MS IDE's were the pioneers for Eclipse. What I did want to say is that I've been drooling at some collegues who were working with VB and could use auto-completion (some years ago now), while we were stuck using UltraEdit or something alike (btw, verifying this link reminded me of some scary looking stuff. I'm still not sure if this is ironical or not). And to be honest, jEdit now has a plugin that does autocompletion. But (and this was the point I wanted to make) there had to be yet another commercial entity developing refactoring support before the OSS community jumped on that bandwagon. (And yes, I agree that "OSS" is even stretched a bit here, because IBM is the driving force for Eclipse).

All in all, I think that we are agreeing movingly with each other without knowing or wanting to admit it. It's not the first time that that happens...

Posted by tomk at 09:42 AM | TrackBack


Marc has been writing some bashing on Eclipse. I seem to be on the other side of the fence: I like Eclipse. I have been using jEdit for quite some time, so you could say that every IDE that gives me autocompletion is a step forward for me :-) Don't get me wrong: I still like jEdit as an allround editor, but for programming Java I'm leaning over to Eclipse 2 right now.

Several people have told me to use IDEA, but noone has really convinced me yet. For a start, IDEA is not free. There are several solutions to this problem:

  • Get a crack. This is not fair to the developers of IDEA, and so I won't do it. In fact, once you start using Linux, you'll find the idea of "cracking" things less and less interesting.
  • Get somebody to pay for it. Like your employer. Yeah, like my employer cares. "We already have UltraEdit and WSAD, you don't need an IDE that allows you to be productive."
  • Pay for it yourself. Good idea, but the last few months I've been burning most of my money on books and a son, so if I can save € 200, I will gladly do it.

Besides the financial story, there are other reasons to use Eclipse instead of IDEA:

  • Support the OSS philosophy. Free the source. I am willing to accept a little missing functionality if I get access to the source.
  • I like the perspectives. I remember those days of opening 5 files to adapt your build process, open 2 more for building everything, open 10 Java source files to look at some stuff, ... In the end, you had tens of files open, which were used in groups in time. While looking at build.xml, you wanted to have a look at build.bat, and you lost several seconds searching in the myriad of open files. Hence the perspectives. Do one job at a time, with the files you need at that time.
And Marc, if you want to use team stuff (i.e. CVS), it might be a good idea to look for "Team".

And only now I've seen his conclusion:

The OSS believer in me would definitelly like a free alternative to the IDEA.
That will teach me to read before write :-)

One final tought though: why did it take so long for the OSS community to come up with an IDE that can do auto-completion? Do we really need a commercial entity to show us how to do things, so we can copy it (that is, everything but its code)? It's not that auto-completion is new: the VB IDE has been around for a long time. But apparently we need a commercial Java IDE before we can make an OSS alternative. Cocoon seems to be one of the few exceptions to this rule: it is unprecedented, and still unchallenged.

Posted by tomk at 07:12 AM | TrackBack

November 22, 2002

Mock Objects

Well, I'm now giving it a go with mock objects (which I started to think of this morning), but I'm still a bit uncertain whether this is the way to go. I have a gutt feeling that everything will become extremely complicated over time :-(
Posted by tomk at 08:30 PM | TrackBack

Database Unit Testing

One of the main problems I've encountered some times now, is: how can I unit test programs that make use of a DB? The testing is very likely to read (duh!) and change the data in the DB, thus making the tests dependent on (a) the scrap tests that you do manually while coding, and (b) each other.
Of course, we have dbUnit (with its academic/philosophical base), but this approach requires 4 (four!) databases. In the company I work in now, it appears to be unfeasible to have one database (which happens to be Oracle here) per developer. So now I'm looking for the silver bullet.
I already encountered one interesting read, but it seems to be a discussion without a real conclusion.
(Remember you can always send me your thoughts.)
Posted by tomk at 03:52 PM | TrackBack

November 21, 2002

Null Object

I was just referenced to the Null Object design pattern. Nice read, and nice to store in the back of your head for future reference.
Posted by tomk at 07:38 PM | TrackBack

November 19, 2002

Cocoon GetTogether

Well, the GetTogether is over (for me at least, I guess the evening event attendees are still eating and drinking right now). It was quite a full day. Driving to Nazareth was nice (I'm used to drive to Brussels nowadays), but it still took me about an hour. A quick coffee and a roll, and we were driven into the auditorium by Steven. Matthew introduced us to the things we already knew, but I was amazed to hear questions that clearly stated the opposite -- the GetTogether seems to have even reached other people than "hard-core fans".
Sylvain has given a nice presentation about embedded Cocoon. Although it's not my business area, I think it would be very refreshing to work in a space-restrained environment one time. The greatest works of art are created due to lack of ressources. Lack of ressources forces you to use your creativity, and this gives creative works. Q.E.D. :-) In any case, Sylvain succeeded in giving a different view on things, and that's always interesting.
Carsten gave a nice overview of the portal framework in Cocoon. I've never looked at it, but I now have the feeling that (a) I should have, and (b) it is cleanly done.
Ovidiu, the HP guy with the MacOS X laptop, gave a nice presentation of the flow control in Cocoon. I finally see what's the intention here, and I hope to play around with it once. The only drawback is that I don't like XSP :-s. Anyway, according to Steven, Ovidiu put this presentation together just for the GetTogether, so all other things even, the GetTogether managed to generate documentation for Cocoon, which makes the effort worthwile already :-) Which reminds me to buy the Cocoon book from Carsten and Matthew (I waited till today in case I should've won it ;-))
Torsten seemed a very intelligent guy to me. Alas, I don't think he has given many presentations yet. You could feel his nerves in the back of the room. It's strange that smart people get nervous to talk about something they know inside out to people who have travelled several countries to hear them. I think this is some sort of misplaced modesty.
Last on stage was Marc (the guy who once hired me, and thus is one of the many causes I know the word "blogging" now, but that's another story) to tell the obliged "marketing speak of the organization". Sad that this wasn't perceived as such by most people, until he presented it as being so. As always, Marc tended to think that all people share his view on the world, and forgot to tell what the purpose of xReporter truly was about. We learnt a lot about its architecture though. He also made an effort to make some advertising for wings, which I thank him for :-) It already got me one reaction: "why do you use jCharts, and not JFreeChart?" Well.
So the day is over. I enjoyed it very much, not in the least for finally being able to put faces on email addresses. Lessons learnt:
  • Not all highways are traffic jammed in Belgium in the morning.
  • It is possible to organize a seminar that doesn't run out of sandwiches at lunch time
  • Smart people are modest. Bloggers aren't.
  • If all speakers keep up to their promises, we can expect tons of documentation on the short term.
  • When in doubt, always take your laptop with wi-fi with you. It might be that a geek seminar provides wi-fi access. Saves you an hour of typing in the evening.
  • One stubborn guy can get 100 people together
Posted by tomk at 04:16 PM | TrackBack

November 15, 2002

Cocoon Gettogether

I've been looking forward to the Cocoon GetTogether for months now. I'm really curious how it will end. In fact, the expectations are so high, that it can only be a disappointment. On the other hand, if it's going to be a big success, Outerthought will be obliged to make it a yearly event :-)

BTW, I have to say I'm amazed. When I first heard about the GetTogether, I expected to have a meeting with 20-some Cocoon people from Belgium, of which 15 or so would be ex-collegues of mine. Apparently, I've underestimated Steven. It's even a real event

Posted by tomk at 05:56 PM | TrackBack