Bruno Haible has provided me with gettext-0.15pre1.tar.gz, with a *much* improved public API that allows programs (such as gtranslator, kbabel etc) use it's po file parsing, hook in a custom error handler to the parser, update translations in the parsed messagelist, and write translations back to a po f ile. Basically, I can now start ripping out the custom parsing/writing code from gtranslator and use this instead, which is a far cleaner solution. Then, as this will provide easier access to the plural form translations, I can provide a nicer UI when editing them. I have most of this done already in a proof-of-concept branch, but it just needs to be reworked a bit to use Bruno's new gettext API. I'm excited.

GNOME sysadmin

Lots of fun with the content_filter (amavisd/spamd/clamd) on menubar.gnome.org. Jeff disabled it as he thought it was causing multi-hour mail delays (not good near the end of a release cycle), but it turns out it was DNS failures. I tried using SpamCop's RBL for a bit, but it turned out it would have caused a few too many false positives, so we'll just rely on RCVD_IN_SPAMCOP_RBL for now.

I briefly looked into the CVSROOT loginfo file. I was annoyed that it only runs the first match in that file. It means my 'cvs-commmits-po-list' hack was not being reached if the commit was being handled by one of the other (more important) scripts further up. I figured we needed a hacked martin-log.pl that would 'Cc' that po commits list if a '.po' file was one of the files affected. However, I don't think my Perl skills were quite sharp enough, as it seemed to put an invisible spanner in the works, resulting in a handful of (test) commits not generating the mail notification, so I reverted it. I'll have to find a better way to test it at some point.

Toni seems to be showing some enthusiasm towards getting RT (Request Tracker) packaged up for window, which will be good. He's also looking at getting NAGIOS up, so we can react to and track service outages a bit better. I'm also thinking of making a more concrete proposal for setting up MRTG monitoring of load and system/network I/O on the various boxes, which I think would be useful/interesting.

Whacky ideas dept.

Now my lappy keyboard is giving up the ghost, and I'm starting to wish I could get information into my iPAQ quicker than tapping it's touchscreen, I came up with an idea. Quite a few years ago now (when TV presenters had big hair and bushy sideburns, and wore brown jackets with big ties), I saw a show called Tomorrows World, which demonstrated how a someone with only a few days experience using this one-handed keyboard was able to type faster than the fastest touch typist in the world on a normal keyboard. I was impressed, but I never heard anything more about it after that.

Well, I found them. They are Infogrip, and they make the BAT. Your hand rests with four fingers on four black buttons, and your thumb free to move between three coloured buttons. By pressing the keys in a certain combination (chord), you can simulate just about any keypress from a standard keyboard. Apparently, you can learn all the chord combinations in a few hours, and can be up to a reasonable typing pace in just a few days. Hopefully, I'll be in a position to order one in a few weeks time.

I like it, but I thought maybe I could do one better. I thought about a small, kind of cylindrical device, moulded a bit like a joystick handle, with the four main buttons along the front, and the three thumb buttons on top. It would contain an AA battery, and would simply send signals (via Bluetooth) when a key is pressed or depressed. This just means that you would need to buy a USB Bluetooth dongle, and write a keyboard driver to convert the received signals into keycodes. Theres probably a little more to it than that, but not much.

You could go even further and give the transmitter the concept of channels. So that, with a certain chord, you could switch between sending your input to different devices (your desktop, your laptop, your PDA, your mobile phone, your TV, your cashpoint, your other electronic device).

I guess there would be a few security issues involved here too, but they could easily be addressed during my next daydream. For now, back to writing PHP code to keep the bills at bay (yawn!). Maybe someone from Infogrip wants to pick up where I left off :)

My laptop is now falling apart. It's a Dell Inspiron 8100. I bought it when I was fortunate enough to be able to afford it. After two years of (ab)use, it now has the following problems:

The two batteries I bought with it no longer hold their charge. One doesn't even work any more, and the other powers the computer for about 2-3 mins before dying. However, if I can get from my current power point to another one within 2 minutes, I don't need to shut it down! Replacement batteries are around 200quid each, which is beyond my current budget. So, despite having wireless everywhere I go, I'm still tethered to a wall, and use in fields, cars, trains and aeroplanes is out of the question (lucky I've got an iPAQ, I suppose).

The power adaptor plug that plugs into the back of the laptop is beginning to get ruptured and goes to battery . I had to replaced the whole mains adaptor (for about fifty quid, IIRC) last year after the same thing happened. Unfortunately, if someone knocks the laptop, and/or I don't notice it go from 'mains' to 'battery' power, it dies. This is kind of my own fault, as I'm always moving my laptop around and not making sure the power cord isn't trapped somewhere, so it's been stretched and bent around probably more than it should. More easily replaceable (and universal) power connectors (that don't require replacing the whole adaptor) would be nice.

Worse still, the keys are starting to stick and fail. I regularly have to take off the keyboard and blow out all the dust, hair and biscuit crumbs with an air hose. The letters have mostly all worn off the keys, which I remedied by buying some stickers for the keys (which have now started peeling at the corners). Nearly half the left 'Ctrl' key has snapped, luckily not the part that allows it to operate. The metal springs that work the carriage return and backspace keys seem to have been bent somehow, and take some striking. I've lived with all this until recently, when my 'H' key has started to become temperamental. Again, it's because of the serious amount of use it gets. It's my daily workhorse, and evening hacking tool. I spend more time on my laptop than in any other pursuit in my life, so it's not that surprising it's worn out. Using an external keyboard with a laptop just feels *wrong* for some reason.

If the laptop is placed on an uneven surface (e.g. my lap), the rubber mouse thingy in the middle of the keyboard thinks it's being moved and the mouse cursor glides itself to the side of the screen. Luckily, that mouse has stopped functioning altogether, leaving me with the touchpad mouse, which I can get on fine with. It's a shame they stopped doing the rollerball mice - they were fantastic.

The screen is a fantastic 15.4" 1600x1200 LCD panel. Unfortunately, it started becoming temperamental about 8-9 months after I bought it, and I had to send it back to DELL to be fixed. Meanwhile, I went to Thailand, and after it was fixed, sent over to me and finally cleared Bangkok customs (never again!), I found that it has some strange vertical stripes that happen in every even 10th of the screen from left to right. They come and go, and are only noticable by a brightening of the color in some lines on that part of the screen. It looks hardware-related to me, but I've learned to live with it (not worth sending it back again). Oh, and I've lost a tiny screw at the back, which means the screen comes away from the laptop on the left if picked up by the screen (not that I ever do that!).

NVidia - wankers. I have been deprived of any kind of 3D acceleration, because of these twats. I was looking forward to flying (and hacking on) FlightGear, and playing some other Linux games that require 3D acceleration, but eventually had too many technical (and moral) problems using the binary-only driver, so I gave up and used the open source version without 3D (more work, less play - maybe NVidia is to blame for Johnny becoming a dull boy). Needless to say, my next laptop will not have an NVidia chipset in it.

Otherwise, I've been very impressed with the laptop, and it's done me very well. However, every day I use it and get vexed with the increasing number of problems, I am considering my next laptop purchase. I see a lot of GNOME hackers getting on famously with the Apple hardware, and dual-booting MacOSX with Linux, which could be very interesting. However, I'll have to see how long I can make this one last, as it'll probably still be a few months before I can afford anything more than a budget PC. Either way, before I buy this time, I'll want to be very sure about proper (non-proprietary) Linux support for all the components it is made from.

Bruno got back to me and proposed a revised gettext-po.h, which looks much more interesting. I had a quick tidy-up of gtranslator HEAD to remove some old unsupported/unmaintained code, so I'm all ready to start using the new API as soon as Bruno has implemented it. Superb.

My first week's work for my newest customer went fairly well. However, due to a major 'half-asleep on a Monday morning' mistake, I accidentally wiped out glibc on my laptop, rendering it fairly useless. It's taken me until now (Tuesday evening) to get things sorted, but the upshot is that I got it running Fedora Core 2 instead of Debian unstable. I seem to have overcome the major hurdles, most of which involved trying to build a kernel that would work with the prism2_cs module.

Had a day out in London with my mum, dad and Mee on Sunday. Took in 'the Big Bus company' red line tour of Westminster, finishing off with a ride in the London Eye, it was an interesting day out and a welcome break from the laptop. I think Mee is starting to get upset with the amount of time I am spending in front of the screen. I'll need to start sticking to some kind of 'work hours' and put off all non-essential stuff somehow for a while, otherwise it's not fair on her. Only another four weeks in the UK, then we'll be back in Thailand, so she won't be so lonely then.

Oh, and one more thing of note. I see that the GPE project (GNOME on iPAQ) are looking to form closer links with the GNOME community. I really need to get my ARM-compiler environment cranked up a level, so I can fix some bugs and produce updated ipkgs for my iPAQ. I'd really like to look at 'bigger' iPAQ projects, such as porting gtranslator (and other 'normal' GNOME apps, such as gedit and gnumeric) to iPAQ. My GPE iPAQ is great, but still has a long way to go wrt integration with the GNOME desktop (and PIM software etc). I hope the GPE guys can integrate better into the GNOME project, and attract more developers to the cause.

OK, so I landed some work and haven't done much else for a week or so. However, Bruno Haible got back to me on the gettext stuff I'd been doing, and has offered to expose the parser and write by extending the interface in 'gettext-po.h' according to gtranslator's requirements. Fantastic!

Apply this patch to gettext from CVS. Build and install. Check out the 'gettext-hack' branch of gtranslator from GNOME CVS. It's basic, but it works. Another day, I'll build a dialog to display the errors, and polish it up a bit more. Enough for today.

I also moved the archive over to the gnome.org servers, as sf.net mailman is lame.

Today, I did some more work on my gettext patch. I added a 'char **errptr' argument to the read_po_file function, and hacked it to return the error message to the calling application, rather than terminate the process (ala exit), and let the calling application report the message and choose how to proceed. Hopefully, the gettext developers will catch my drift and we can make the gettext library useful for any kind of application that needs a library to parse and/or write po files. I CCed a copy to the gtranslator-devel list, but it hasn't hit their archive yet. I'm going to try to move the gtranslator-devel list from sf.net to gnome.org.

I also followed up all the applications for volunteer GNOME sysadmins. Hopefully, with a few more hands on deck we can fix up all the broken services (e.g. bonsai/lxr, private list archives, request tracker etc), put some cool new ones in too (e.g. NAGIOS), and kick the GNOME sysadmin todo list into oblivion.

Toby is taking Kylie, Mee and I to London sightseeing tomorrow, which should be nice. Mee has never been to London before, and I haven't been for a long time.

Spent the last few days tinkering with character set problems and the new PHP5 DOM API. I've also found that cross-compiling programs on my laptop to run on my iPAQ isn't as hard as I thought, so for my next trick, I'll try compiling the 2.6 kernel tree for it. Nice to have the sound working on the iPAQ again. I now carry around about an hours worth of MP3s/Oggs, loads of pictures, reading material and all my documents, all on a 256Mb MMC chip in my iPAQ :)

I also finished up a few bits on my 'Harmony' project, which is a kind of PHP framework intended to make developing and maintaining new web applications easier. I put up the PHP docs and a tarball, if anyone is interested/curious. Feedback welcome!

I finally got round to setting up amavisd on the GNOME mail server. Now, it RBLs open relays, rejects connections if the sender/recipient addresses are dodgy, lets amavisd spamassassin and clamscan it, and only then lets it through.

I did this because I was getting fed up of the rising current of crap getting past postfix and hitting mailman's moderator queue. The spamassassin measures within mailman just weren't cutting the mustard. Hopefully, things should improve from here.

I also submitted a small patch for 'xkbd' to fix broken line number counting and error reporting. I then hacked out a Thai xkbd file, for use on my iPAQ, and submitted that too.

I also set up a load of DNS-SD records in my own domain, but haven't found anything that uses it yet. I'll wait for the new DNS-SD patches in gnome-vfs to filter through to debian unstable, and then I might start noticing new things appearing in Nautilus's Network view. That'll be cool when it happens.

What else? Not much today. I went shopping this morning with my mum and Mee. I also spent a little time cleaning up my laptop home directory and syncing it all up with my home server home directory (so stuff gets backed up to tape).

I just spent a while digging through some old GnuCash records preparing my expenses report for 2003 (need to get my tax returns in order). I noticed GnuCash isn't working on my laptop (Debian unstable missing libart_lgpl.so it seems), so ran GnuCash from my home server (running FC2). GnuCash is great, but I hate that it's python, and I hate that it still hinges on GTK1.2. It's useful, but ugly.

Tomorrow, I will have to get my teeth into some (paying) PHP stuff. It's not too bad, but I'd so much prefer to be hacking C code (e.g. tidying up gettext for better gtranslator integration, or preparing a gnome-ssh-agent panel applet), but sadly, I'll have to go back up a few language levels and write boring web applications for boring websites. If I don't, my chances of going back to Thailand with any money will be very slim!

I rigged my hang-glider, and pre-flighted it. I haven't unpacked it for nearly a year, but everything was just fine. It was a peachy day, and we regularly saw red kites circling, and at one point we saw a gaggle of about 20 sailplanes heading away from the top of a few seperate thermals well above Oxford.

John flew the tug, and aerotowed the Class 5 boys up to about 2500ft a time. Richard managed an out and return to Headington, near Oxford, from our take-off right next to Wheatley (about 45 mins airtime). Brendon got taken up right into a convenient thermal and it wasn't long before he was out of sight, heading towards Didcot. Nick did a circuit, but I don't think he had so much luck with the thermals and only lasted about 30mins.

Dave went up next, but about 300ft he seperated from the tug. Both craft made it back to the field, and it turned out that a tiny piece of grass found it's way into the carb and got stuck in the jet. Basically, it wouldn't rev up above about 4000rpm, but it needs to develop at least 6000rpm to power itself and the wing behind without sinking out. John realised he had began to sink out, and that it wasn't revving out properly, so he had to 'flush' Dave. Dave found himself cut free at about 300ft, with the tow rope dangling down from his chest. Worried that the tow rope wound catch on a fence below and drag him in, he released it and started concentrating on using his remaining height to get back to take-off. He just about squeezed in over the hedge.

So, we've fixed the engine and are scouring the nearby fields for our 'mislaid' tow rope. Eventually, we find the rope and so I'm thinking about getting clipped in and having a go, when we get a call from Brendan. He's had a bad landing in a field near Chalgrove, and he's broken his arm. The gang mobilise, with Dave and Richard diving into a car, and Nick shooting off in the tug (easier to find a downed glider by air). Apparently, Nick managed to land right next to Brendan, but for some reason, said it wouldn't be possible to take off out of the field, and that they'd need to dismantle it, put it on a trailer and drive it back to the hangar. Flying over for today!

So, after all this drama, all I managed to do was rig my glider, pre-flight check it and confirm that it's still airworthy (actually in pretty good nick), before having to pack it all away again. However, I had a very enjoyable day (away from the computer for a change!), and I'm looking forward to trying again in a week or two.

Patching gettext to expose it's file parsing and writing functions. (http://www.golder.org/~rossg/tmp/gettext-0.14.1.exposed.patch)
- Strangely, I seem to have achieved basic functionality by simply patching it to install a handful of it's header files into $includedir/gettext-0.0. It's a dirty hack, but it should prove the concept.
- Potential problem: if while eusing gettext's parsing routines, it chances upon the 'error' function, exit() is called. Looks like gettext will need patching further to make the error handling in certain functions a bit more 'caller-friendly'. I expect it'll be a case of having everything report errors back to caller somehow, then hooking a error handler in further up the stack so that the caller does the 'exit'. Hopefully, this can be done without breaking API/ABI compat. It seems a bit odd that the gettext guys don't seem to have anticipated this use-case scenario.

Patching gtranslator to use gettext's innards for the reading/writing PO files. (http://www.golder.org/~rossg/tmp/gtranslator-gettext.patch - against gtranslator CVS)
- Compiles OK using '#include <gettext-0.0/config.h>' (and a couple of other gettext innards) to hook into the newly exposed gettext API, and '-lgettextpo' lets it link successfully. I've now dropped various fields from GtrMsg, replacing it with a pointer to the 'message_ty' structure for each message. I've also re-wired everything to use this structure instead of the old GtrMsg fields, and it compiles. Still got some work to do on the parser (it currently segfaults), but it looks like I might finally get round to killing this 'plural forms' thing and a few other parser-related issues at the same time.