Musings
muse: to turn something over in the mind meditatively and often inconclusively
Heart, mouth, don't swallow

Heart stopping moment yesterday. Because it was such a nice day I wanted the option of riding with my visor open when I was idling at low speeds. So I was riding with both my dark visor and my sunglasses on. Not too much of an issue since neither is particularly dark so the combination isn't overwhelmingly dusk-like.

Until you hit a tunnel. I took the Du Toitskloof pass and completely forgot about the short (fortunately) tunnel until just before I hit it.

Darkness.

As Yoda might have once said: "Crapped myself silly I did".

Posted at 04:43 PM

Golf drivers

Of all cars on the road, the Golf GTI is the model I most enjoy overtaking. It trumps even the german luxury sedans.

Golf drivers. Go figure.

Posted at 08:54 PM

There, and back again

With Andy facing looming deadlines and Matt ignoring his cellphone today's was a solo flight.

I really felt like a longish run and a solo flight isn't all that bad because you can set your own pace. So I headed out to Swellendam via Worcester and came back along the N2.

Absolutely superb weather for riding today. Clear skies the whole way and a distinctly toned down degree of lunacy on the roads. At times I may well have been the only lunatic for miles.

I've said it before and I'll say it again: it always catches me off guard to discover just how much I enjoy my time on the bike. You'd think I'd have learned by now but no.

I got waylaid on the way out while filling up. A young woman jumped me with a pamphlet and a few questions which I couldn't hear with my earplugs in an helmet on. She looked uncannily like a girlfriend from high school and I think that distracted me long enough for her to get a metaphorical toe in the door. She wanted to know if I'd accepted Jesus into my life. Since I had some time to kill waiting in the queue and since she'd already settled in I figured why the hell not.

To her credit she remained good humoured despite my barrage of questions and counterpoints. After about 20 minutes I realised I'd lost track of time and politely excused myself. Her name was Christine and she offered to pray for me. In return I'll do the best equivalent I can manage: I'll be sure not to pray for her.

Posted at 07:01 PM

Licensed to kill

On Wednesday morning Andy and I faced the full fury of the Cape Town Traffic Department's grasp of queueing theory.

Or, to put it another way, we "sat" our motorbike rider's license. The day started pretty early for us, we were in town by 7am to make sure we ended up in the first group. So for an hour and a half we sat and made small talk with the instructor we'd spent Sunday morning jumping through hoops for. He was actually quite good. He's an ex traffic officer and has the course marked out and runs through the test with you. He even loans you a bike for the test (a light 200cc bike, considerably more manueverable than our just-sub-litre bikes).

The morning actually ran smoothly for the most part. The testing ground was single-threaded and there was a large enough group of us so that we only actually got around to our test by about 11am. The test itself took 15 minutes and was pretty simple. The rider's test in this country is actually a bit of a joke. It consists only of a yard test and that is almost identical to the practical portion of the learner's test I sat in Melbourne. And on top of that the officer testing our group was particularly lenient.

So no drama there. For some reason I developed incredibly painful eyes and a minor headache. Probably tension. These kinds of things need to be dealt with like band-aids: quickly.

So by 11:15 we'd both passed and headed back into the department building to get everything stamped, signed and filed. Queue one: get it entered into the computer system. Queue two: fingerprints. Queue three: bollocks is that really the guy who finished half an hour before we started?

Queue three was a nightmare. When we arrived it must have been about 30 people strong. One and a half people were serving this queue (for some reason one of them kept disappearing briefly). People were arriving at about twice the rate the queue was being serviced at. We only made it out of there at 2pm, by which stage my back was ready to give out, and the squirrel going ape-shit inside my skull had just started chewing on my brainstem.

But we made it. I think technically we're now required to start a bar fight once a month.

Posted at 04:59 PM

Rox 0.8 released

Yes, yes, it was only the other day that I released 0.7. Deal with it. Rox 0.8 is worth looking at for two reasons:

  1. It's seen a lot more focused load testing which flushed out some nasties hiding in dark corners.
  2. I finally got around to actually testing on 1.4 and that flushed a few funnies out too. As of 0.8 Rox passes all 300+ unit tests on 1.4.2 (release 11).

Anyhoo, here are the release notes for 0.8:

Release 0.8
=====================

  - A new method has been added to the UnmarshallerAid base class that controls
    whether or not missing fields should be ignored when unmarshalling an XML-RPC
    struct into a Java type. Both the DOM and SAX unmarshaller honour this flag.
  - The UnmarshallerAid interface has been replaced with an abstract base class. Although
    slightly less convenient than an interface, this allows Rox to provide default
    implementations for some methods and supports evolving the class without breaking
    compatibility. As part of this change the functionality has been split into
    three classes, one base class and two that are specialized for call
    and response unmarshalling.
  - A number of other calls to methods only available on 1.5 have been replaced
    with equivalent calls that exist on 1.4.
  - The SAX marshaller pools parser instances to improve performance. This logic
    depends on the SAXParser.reset() method which was introduced in 1.5. We now
    check for the availability of this method and only call it if it exists (this
    check is done once). For efficiency's sake, if the method is not available
    but we're using our own parser imeplementation then we typecast and call the
    method directly. Thanks to Sandeep Raja Rao for reporting this problem.
  - The ChannelSelector was erroneously trying to read off unowned channels
    that were not yet connected. This resulted in a NotYetConnectedException that
    ultimately resulted in that channel being forcibly closed.
  - RemoteSocketClosedException is now logged at the TRACE level, since it
    happens frequently and isn't really an error condition.
  - The shared connection pool's logic for checking out a connection has
    been rewritten as part of work to address a problem that allowed
    more connections than the defined limit to be checked out and to
    address a NullPointerException that resulted because clients seen
    for the first time that could be satisfied with an existing pooled
    connection were not recorded.
  - The ThreadQueue class has been greatly simplified as part of work
    to address a rare race condition. The guarantees it makes are slightly
    weaker but still sufficient for the original (performance related)
    reasons it was written.
  - Corrected a NullPointerException that resulted from erroneously removing a
    pooled connection stack when a connection was closed remotely.
  - An unhandled exception within a TimerTask implementation cancelled the global
    request timer causing havoc and general dismay.
  - Corrected a NullPointerException that resulted from erroneously removing an
    active set when a connection was cleaned up when a timeout occurred just after
    a client had detached from the connection pool.

Posted at 05:39 PM

Rox in India

I had interesting (and welcome) mail in my inbox late last week from India. It was from a new Rox user. Apart from lavishing some praise on the documentation (much appreciated) he was asking for some assistance. It turns out that despite my best efforts Rox doesn't quite run on Java 1.4. A few relatively minor changes were required to sort that out but shame on me for not actually testing on 1.4. As of 0.8 (coming soon to a SourceForge near you) all of Rox's regression tests pass on J2SE 1.4.

But none of this touches on the interesting part of the first sentence. After a brief email exchange it turns out that they're not actually planning to use it on 1.4 but rather on a 1.4 compatible JVM. Specifically, JamVM, a 1.4 compatible "compact" JVM implementation which makes use of GNU Classpath.

This is cool, because if we can get it working then it's another platform Rox can be used on, and this JVM is particularly welcome if you're targeting reasonably beefy "embedded" devices, like modern POS devices (hint, hint).

But it looks like it's going to be somewhat challenging because the GNU Classpath NIO implementation seems to have a few problems. But the Indian guys seem prepared to dive in and see if they can't help on the Classpath front and I spent some time on Friday looking into the NIO problem and I think I know how to fix it.

So hold thumbs.

Posted at 07:56 PM