Too Busy For Words - The PaulWay Weblog

Thu, 09 Oct 2008

Look Out Eddie Van Halen
Back in the days when Icehouse was in, Crowded House was big and I was getting deeply hooked into Yello, I had a Roland Juno 6. It was my Dad's, but I played it a fair bit. One of the leaders in the analog synthesis days between full-on knob-for-everything setups like the Moog and the start of MIDI and digital control, it is still legendary for producing huge bass lines and stunning synth leads. Then our house burned down and took the Juno with it, and though I often thought of getting another synthesizer I never did.

Until now. It started with playing the piano at friends and relatives houses; then Kate suggested I could accompany her violin playing. As I got more into LMMS I started realising that having a keyboard to record lines and work out notes and melodies on was going to be very useful. So I did some research and found the Roland Juno G, which sat between the full-on knob tweaking of Nords and Moogs (all digital, now, of course, but still faithfully emulating the analogue sound synthesis process), the 'play the demo song' integrated-speaker cheap synthesizer market, and the 'it has 4096 patches, all pianos' professional keyboard. This may sound like a no man's land, but the market segment is for people who want a range of instruments, the ability to fiddle with how they sound, and don't need heavy 'piano-action' keys. Unfortunately, they don't make the Juno G anymore.

Fortunately, it's successor is the Juno Stage, which is basically version 2 - all the features of the G but without the confusion between it and the Juno D. You get knobs to control attack and release, low and high frequency rolloff, and cutoff and resonance of the filter - which you can twiddle on the fly. It comes with 1024 different patches, a variety of modes including split keyboard (SuperSaw on the left and piano on the right is a favourite) and lots of nice features that I haven't truly discovered yet. So I bought it, brought it home, and started practicing again.

Gradually my fingers are warming up again, playing scales and old tunes I used to know. But what has amazed me is the amount of pure inspiration I'm getting from the sounds. A new patch will make me start writing new melodies out of thin air, and when I find that some presets consist of an arpeggio and drum rhythm on the left hand, new mystical tunes will flow out of my right hand and almost amaze me in the process. That and the joy of working out the chord progressions (the title of this post is a nod to the classic synth line of 'Jump' by Van Halen - I hit the first two chords (C, F in my playing) and then had to figure out the next (B) later by experimentation - I don't know what the actual song used but it's easiest to play on G, C, and F) for songs I remember. Playing the Doctor Who theme or the theme to "Axel F" or "Fletch" (yay Harold Faltermeyer) is always a blast, and it all came right back to me.

So I'm now doing regular practice of my own devising, before I seek out someone to teach me how to play more. I'll report how I go plugging it into the computer (yay USB MIDI interface) in another post.

posted at: 13:18 | path: /personal | permanent link to this entry

Perl threaded database query processing
In my work I've recently had to implement several pieces of code which follow this basic pattern:

  1. Retrieve data from the database
  2. Process data
  3. Store data somewhere.
Because of Perl DBI's habit (on the systems I've used) of grabbing all the data from the database into memory before actually giving it to the caller, and because that data can often get large enough to get my process swapping or killed, what this usually turns into is:

  1. Get a list of 'grouping' items (e.g. days, months, IP addresses, etc.)
  2. For each item in that group:
    1. Retrieve data from the database for that item.
    2. Process data
    3. Store data somewhere.
This runs into an unfortunate problem when the database server you're talking to takes a noticeable time to process your query - the whole thing slows down hugely. A typical slowdown I've seen is in the order of 500% - and both the database and the client processors are mostly idle during that time, as each query has to be individually fetched, processed, dumped back to the client, and then processed. It suffers the same problem if the time to process each group of data is significant - by the time you've got back to fetching the next group, the database has gone off and done other things and needs to get its disk heads back in the right place for your data.

These days we have processors capable of doing multiple things at the same time, and so it would be nice if the client could be processing rows at the same time as it's also requesting more data from the database. This is where Perl's threads and Thread::Queue libraries come in. It seems to me to be a generalisable task, so I'm sharing my first attempt at doing this in a generalisable way here. My main subroutine is:

######################################
sub Thread_Process {
######################################
    # We take one query which returns a list of items, a query which
    # returns other rows based on each of those items, and a function
    # which processes those rows.  We then run the processor function
    # in parallel to the fetching process to utilise the connection
    # to the database and keep the local processor active.
    # Requirements:
    # The item query must be executed and ready to return rows.  It
    #   can return any number of fields.
    # The rows query must be ready to be executed, and will be
    #   executed with the row_args_ref and then the items from each
    #   row in the item query in turn (as arrays).
    # The function takes as its last argument the Thread::Queue object
    #   that data will be passed through.  It must know exactly how
    #   many items it will take from each row, and that should match
    #   the number of items returned in the query.  For reasons as yet
    #   unclear, we can't pass references of any kind on the queue,
    #   so we pass the fields in each row as single scalars.  Any
    #   arguments that it needs should be given in fn_args_ref.  It
    #   should exit on receiving an undef.
    my ($items_qry, $rows_qry, $row_args_ref, $fn_ref, $fn_args_aref) = @_;
    my ($items_aref) = $items_qry->fetchall_arrayref;
    unless (ref $items_aref eq 'ARRAY') {
        carp "Warning: got no rows from item query\n";
        return 0;
    }
    
    my $queue = Thread::Queue->new();
    my $thread = threads->create($fn_ref, @$fn_args_aref, $queue);
    foreach my $item_aref (@$items_aref) {
        $rows_qry->execute(@$row_args_ref, @$item_aref);
        while (my $aref = $rows_qry->fetchrow_arrayref) {
            $queue->enqueue(@$aref);
        }
    }
    $queue->enqueue(undef);
    $thread->join();
    return scalar @$items_aref;
}
A sample caller function would be:

sub Send_mail_to_everyone {
    my ($mail_handler, $template, $start_date, $end_date);
    my $servers_qry = $dbh->prepare(
        'select distinct mail_server from addresses'
       .' where birth_date between ? and ? and current = true',
    );
    my $args_ref = [$start_date, $end_date];
    $servers->execute(@$args_ref);
    my $email_qry = $dbh->prepare(
        'select user_name, server, full_name, birth_date'
       .' from addresses'
       .' where birth_date between ? and ? and server = ?'
       .' and current = true'
    );
    my $mailer_sub = sub {
        my ($queue) = @_;
        while (defined my $user_name = $queue->dequeue) {
            my $server = $queue->dequeue;
            my $full_name = $queue->dequeue;
            my $birth_date = $queue->dequeue;
            my $email_body = sprintf $template
                , $username, $server, $full_name, $birth_date;
            $mail_handler->send("$user_name@$server", body => $email_body);
        }
    };
    # Here most of the work gets done.
    Thread_Process($servers_qry, $email_qry, $args_ref, $mailer_sub, []);
}
Of course, this is somewhat of a contrived example, and gives you little in the way of feedback or error handling. But it's an example of how to use the Thread_Process subroutine. The mailer subroutine gets its $mail_hander and $template from being within the Send_mail_to_everyone routine.

There are two problems I've discovered so far. The first is that trying to do any kind of database operation within the subroutine doesn't work, because the database handle needs to be cloned. On the systems I've tested this on, unfortunately, $dbh->clone seems to be a no-op and the DBI engine complains that a different thread is using the database handle. I've tried passing $dbh->clone to the handler function, and doing the clone inside the handler function, but they change nothing.

More annoying is the fact that the memory used by the process continues to rise even if the number of outstanding rows is constant or dropping. I haven't traced this down, and haven't really the time now, but it seems to be related to the Thread::Queue object - I've tested variations of my handler routine that reuse existing memory rather than doing undef @array and push @array, $data in the handler, and this changes little.

What I don't know yet is whether either to package this up as a Perl module and start being a maintainer or whether it's too trivial or not generalised enough to be useful for anyone but me.

posted at: 13:11 | path: /tech/perl | permanent link to this entry

Anonymous Earpieces
I bought a "Stereo Headset Kit" at Landmark Computers in Braddon the other day. This consists of a pair of wireless headphones, a bluetooth dongle that functions as a stereo encoder, a CD, a USB cable, a charger and some basic instructions. It's almost impossible to find out exactly who made this - there's no actual brand on the box or devices and the only identifiable branding is of the USB connection software. The software does have a Linux version available but (almost inevitably) it isn't supplied - the disk is really Windows-only.

The dongle has a switch that allows it to function in either USB or Audio mode. In USB mode it is a fully-featured USB Bluetooth dongle - plugging it into my Fedora 9 install allowed me to see all nearby Bluetooth phones, computers and the headset. I haven't tried to see if I can get it to function as a Bluetooth audio device, but PulseAudio does apparently provide this. In Audio mode, it encodes input from the headphone jack on the dongle and sends it to the paired headset. This allows you to use other devices such as computers, phones and music players that don't have Bluetooth capability.

The headset supports the A2DP profile, which basically supports (reasonable quality) stereo audio over Bluetooth. The quality and the stereo separation are quite good and, although it might not be up to full studio monitoring quality, it is easily capable of delivering good quality audio for everyday use. It also supports the headset profile for phones that don't have A2DP capability, but the headphones don't have a microphone so you can't use it as a full headset.

The headphones are comfortable even after a couple of hours of use. They sit around the back of the head, and even for people who have a large skull (such as myself) they don't press in uncomfortably. They can also fold to be flat so they can easily fit in a pocket when not in use. The right speaker has a volume up/down control, a skip forward/back control (for phones that support such control) and a main button that can be used to turn the unit off and on and put it in pairing mode.

These are not a cheap device, at around $110. However, they are cheaper than many of the brand-name devices and are more comfortable than the BlueAnt X5s that I tried a while back. The larger speaker gives them a better bass response than smaller earphones and the lack of cord prevents all sorts of tangles and trip-ups. As someone who seems prone to turning away from the computer and pulling the earphones out of my ears by accident (and force), that's a good thing.

The major downside so far has been that, while they give perfectly good stereo audio between the encoder dongle and the headphones, the other two devices I've tried both have bizarre and annoying behaviour that makes them nearly unusuable. My phone, a Nokia 5310 XpressMusic easily capable of A2DP, will drop them down from A2DP to Headset protocol, detectable as a flat mono signal, and then eventually (in three tests) drop them altogether, often getting wedged on the song being played back (a different song each time which has played normally otherwise, so that wasn't the problem). This wedges the headphones too, requiring a little press of the hidden reset button with a handy bent paperclip. Don't have one to hand? Too bad. (Note to young players - the little hole beneath the reset button is actually to seal the rubber protector in place, and should not be poked into unless you want to put a damaging hole in the speaker diaphragm. And you don't.)

The computer was even worse. I got the laptop bluetooth working with the instructions at http://fedoraforum.org/forum/showthread.php?t=190468 and it all came through nicely. For two minutes. Then it went to Insanely Loud Mode. Once I'd dialled back all the settings in PulseAudio (which, for reasons as yet unclear, muted the audio completely at 60% main volume or 40% RhythmBox volume) it was listenable, although you could tell there was hard clipping going on somewhere before the volume reduction stage (audible as a 'crackliness' to the sound). Then, two minutes later, it dropped back to completely inaudible, and only by turning all the volumes up again did anything come out. Two minutes later it cycled back to insanely loud and kept doing this as long as I was prepared to put up with it. Adjusting the volume on the headset seemed to do little, although when I later connected it to my phone for a second test the volume on the headset was turned up very loud, and changing the volume on the headset altered the volume on the phone. So I assume that something in PulseAudio was 'helpfully' adjusting the volume, for reasons as yet unclear.

I haven't tested it with anything else that outputs A2DP via Bluetooth, so I haven't any other benchmarks to work against. But so far this is a device that works perfectly with its own adapter and appallingly with everything else; not a trait that endears it to me.

posted at: 13:11 | path: /tech | permanent link to this entry

Tue, 09 Sep 2008

Words For The Next Decade
I had a realisation last night that there's a new word that I suspect will be entering the news lexicon soon. That word is

Enviropath
An enviropath is a person or company who has a warped or distorted view of how to treat the environment, most commonly seeing it simply as something to exploit without consequence. Just as a sociopath cares little about their effect on society, and a psychopath cares little for their effect on people's psychologies, an enviropath cares little about their effect on the environment in the course of doing what they want.

The Urban Dictionary, which I won't link to here, has an alternate definition which basically is a derogatory term for someone too obsessed with the environment. I don't think this is using the -pathy suffix - meaning 'suffering or disease' - correctly; but then I'm sure the Urban Dictionary doesn't really care.

What it comes down to, for me, is that I believe that there are people and companies whose view point on the Earth and the natural world is that it is simply there for exploitation. They seem to believe that we can not just keep on doing what we've been doing, but actually find new ways to exploit the world, and the consequences simply don't apply to them. In this, my basic stance is completely the opposite - I believe it's time to do everything we possibly can to save the planet we live in. I also side with my dad's line of reasoning on this, in that I can afford to be wrong, but they can't.

posted at: 10:54 | path: /society | permanent link to this entry

Tue, 26 Aug 2008

Go to the Courts
There is a state in playing Go where one recognises that a move might seem to give one a small gain in pieces now but gives more power to ones opponent in the long run. While I still struggle with this, and the larger question of 'what should I play so that I do gain advantage over my opponent in the long run' is one I still find exceptionally difficult to grasp, I have at least started to recognise that getting a single eye now may actually give my opponent a double eye later.

It occurs to me, albeit as a layman with little knowledge of the real processes of law in and out of the courts, that there is a common pattern to high-profile law cases. If the objective is for A to win over B, then it is:

  1. A sues B and wins
  2. B appeals against the judgement, brings in new arguments and wins.
  3. A appeals against that decision in the high court, brings in the full arsenal, and wins.
B has lost because they have no higher court to appeal to. B has also lost because it has let itself be put in this position.

So what's odd in the whole Nine versus IceTV is that Nine has done this:

  1. Nine sues IceTV and loses
  2. Nine appeals against the judgement, brings in new arguments and wins.
  3. IceTV appeals against that decision in the high court...
Substituting Nine for B and IceTV for A in the pattern, therefore, means that it has allowed itself to be snookered by IceTV. Not only that, but the appeal decision, in my (again completely layman) view, were rather skewed: calling Nine's last minute channel changes 'creative input' is a rather large stretch, whereas calling them 'bungles' is probably nearer the mark. Then arguing that those changes then become not mere facts (that can be copied) but are promoted to copyrightable material is to call anything that a human being has any input into a creative process. It's easy to come up with counter-examples - copying numbers from a book, or assembling cars - but what may be more important is that this works in IceTV's favour, in that by the same rule IceTV are then putting creative input into the schedule and are therefore also making a creative work which is distinct from Nine's schedule by that very fact.

I'm sure the legal minefield starts well back at the start of that previous paragraph, and so I defer to Kim Weatherall and other experts, but when courts start handing down legal judgements that imply that almost any information is copywritable by someone makes the whole existence of facts in the public domain highly tenuous. Can someone copyright my name? My address? Do I somehow own a copyright to my particular choice of phone number and address that means that Telstra owes me money every time they print a phone book? (Note here that when it came to moving house most recently, I was given the choice of a couple of numbers by Telstra and I chose the one I liked - therefore, it wasn't Telstra's creative input that determined my phone number, it was mine.) If someone uses the word "PaulWay" in a way that I don't like, and I've been using it since 1992 and therefore have 15 years of established usage to back it up (again, having chosen that name creatively), can I sue them for copyright infringement without ever having to register it as a trademark? And if it's a copyright infringement, do I get those penalties that the APRA and ACA and so forth have fought for - penalties that are much worse than if it was just a defamation or trademark infringement case? Can you go to prison for creating a post-it note that copies your bus timetable or a person's phone number?

Yes, I know, it's all wild speculation. But this whole judgement feels completely at odds with how people really think about facts and raw information. While I respect the old style of directory compilation, to me it still doesn't equate to a monopoly on the information so collected. The whole "sweat of the brow" protection - that the labour itself makes it enough to be protected - doesn't wash with me, especially in a world where facts, information, opinions and news wash over us almost continually.

Anyway, back to my point. I think that Nine has, in their attempt to get their way in the short term, actually meant that IceTV will triumph in the end. By presenting a case based on such a skewed interpretation of the Australian copyright laws as they apply to facts and information, they've opened it up to the High Court leaning in the opposite direction and blowing Nine out of the water (and, I'd say, causing a considerable re-evaluation of the Desktop Systems vs Telstra case).

posted at: 16:57 | path: /society | permanent link to this entry

Fri, 22 Aug 2008

Tougher recycling
At the moment, recycling is by and large a voluntary affair. We private citizens mostly have recycling bins, and a reasonable proportion of the populace put the correct stuff in them. Companies and Government too are catching on, with recycling bins appearing in tea rooms and beside desks and photocopiers. I've even been bringing my own compost bin into work, and that's been getting a reasonable quantity of scraps in it.

However, it seems to me that there are two barriers to this being a much more wide-spread and profitable industry. The first is that in many places it's difficult to know exactly what can be recycled. In many instances, things which can be recycled aren't marked with the appropriate symbols, or the bins which take the recycling aren't marked to say what exactly they can take. As another example, if you move house in Melbourne (for example) what you can actually put in your recycling bin, as well as its size, can vary dramatically. In my view, people will tend to be conservative and not put things in the recycling bin which could be recycled in case they can't, instead of the more optimistic opposite approach.

But it seems to me that this is a minor concern compared with the fundamental problem, which is illustrated in my first sentence. The fact that it's completely voluntary, combined with the complete absence of any feedback regarding whether you're doing the right thing or not, means that the wasters out there have absolutely no incentive to change. They can keep on throwing their cans, cardboard, plastic boxes and bottles and paper into the garbage and it will keep on being merrily taken away and put into landfill, and they never have to lift a finger to change.

As a case in point, I noticed on the way into my work that there is a large skip outside the deliveries entrance. It's being used because there are building renovations going on and the scrap material is going into the bin. It was quite easy for me to see that there were may cardboard boxes and metal wall divisions, all of which could be easily recycled. While I know that a couple of the waste skip hire companies in Canberra do actually send all their rubbish through the recycling centre here, I'll bet three to one that the majority of skip hire companies in most other capital cities in Australia don't do this. Canberra has an aggressive No Waste by 2010 policy, but how the ACT Government intends to get that last 10% fixed in the sixteen months remaining is beyond me.

Imagine, for a moment, random house bin inspections. A note in your letterbox gives you a score of how good you are at recycling, and what things you may have missed. Houses with good scores might receive a discount on their rates, and houses at the bottom end might recieve fines (to compensate). A follow-up with the worst offenders in a week or two might find other ways that the household could reduce their waste, energy use and costs. A similar scheme for companies would be easy to implement, and for businesses that have a lot of variety in their waste types - restaurants and builders, for example - might be linked up with other programmes (such as worm farms for spoilt food waste or recycled building supplies resellers) to help them reduce their waste output or get it going to the best use available.

The one great flaw in this plan, however, is that Governments have tried to avoid any confrontation with the public - any situation where they have to tell people to change their ways for the good of society. There are obvious exceptions, but the key difference I see between this kind of recycling enforcement and a programme to get dangerous cars off the road or to curb violent behaviour is that the latter things break laws and are 'provably' dangerous to other people. On soft issues like good parenting, good recycling or good social responsibility, the Government has heard the NIMBY and Nanny State lobbyists and realised that it's much easier to get people to do something if opposition can be branded as somehow bad. It's much easier to get people to give up their civil liberties and freedoms if you can say that anyone who wants to walk around taking pictures of arbitrary places (for example) must be a terrorist.

Ahem. Got carried away there.

Anyway, the other side to this is for state, territory and federal Governments to make sure that they aren't providing unnecessary subsidies to industries that are deliberately wasting resources. If these companies can't see the writing on the wall when it comes to climate change, then should we really be propping them up? Lobbyists from the coal power industry love to say how other methods of power generation aren't profitable, while conveniently overlooking the hundreds of millions of dollars in funding that they get from the Government to shore up their own 'we-can't-do-any-better' behaviour.

Capitalism gone right, on the other hand, looks like ACT Skip Bins. Other companies might whinge and moan that they can't possibly recycle everything as it costs too much. Then ACT Skip Bins not only goes and does it, but then makes money from the recycled materials as well.

But despite this, I still end up thinking that there are a lot of people and companies who not only just don't care but don't have to. And until they get hit in the hip pocket, they won't care either.

posted at: 18:01 | path: /society | permanent link to this entry

Wed, 20 Aug 2008

Error Message Hell
If there's one thing anyone that works with computers hates, it's an error message that is misleading or vague. "Syntax Error", "Bad Command Or File Name", "General Protection Fault", and so forth have haunted us for ages; kernel panics, strange reboots, devices that just don't seem to be recognised by the system, and programs mysteriously disappearing likewise. The trend has been to give people more information, and preferably a way to understand what they need to do to fix the problem.

I blog this because I've just been struggling with a problem in Django for the last day or so, and after much experimentation I've finally discovered what the error really means. Django, being written in Python, of course comes with huge backtraces, verbose error messages, and neat formatting of all the data in the hopes that it will give you more to work with when solving your problem. Unfortunately, this error message was both wrong - in that the error it was complaining about was not actually correct - and misleading - in that the real cause of the error was something else entirely.

Django has a urls.py file which defines a set of regular expressions for URLs, and the appropriate action to take when receiving each one. So you can set up r'/poll/(?P\d+)' as a URL, and it will call the associated view's method and pass the parameter poll_id to be whatever the URL contained. In the spirit of Don't Repeat Yourself, you can also name this URL, for example:

url(r'/poll/(?P\d+)', 'view_poll', name = 'poll_view_one')

And then in your templates you can say:

<a href="{{ url poll_view_one poll_id=poll.id }}">{{ poll.name }}</a>

Django will then find the URL with that name, feed the poll ID in at the appropriate place in the expression, and there you are - you don't have to go rewriting all your links when your site structure changes. This, to me, is a great idea.

The problem was that Django was reporting that "Reverse for 'portal.address_new_in_street' not found." when it was clearly listed in a clearly working urls.py file. Finally, I started playing around with the expression, experimenting with what would work and what wouldn't in the expression. In this case, the pattern was:

new/in/(?P\d+)/(?P[A-Za-z .'-]+)

When I changed this to:

new/in/(?P.+)/(?P.+)

It suddenly came good. And then I discovered that the the thing being fed into the 'suburb_id' was not a number, but a string. So what that error message really means is "The pattern you tried to use didn't match because of format differences between the parameters and the regular expression." Maybe it means that you can have several patterns with the same name that will try to match based on the first such pattern that does so. But until then, I'll remember this; and hopefully someone else trying to figure out this problem won't butt their head against a wall for a day like I did.

posted at: 16:13 | path: /tech/web | permanent link to this entry

Tue, 29 Jul 2008

Django 101
At work I've started working on a portal written in Python using the Django framework. And I have to say I'm pretty impressed. Django does large quantities of magic to make mothe model data accessible, the templating language is pretty spiffy (it's about on a par with ClearSilver, which I'm more familiar with - each has bits that the other doesn't do), and the views and url mapping handling is nice too. I can see this as being a very attractive platform to get into in the future - I'm already considering writing my Set Dance Music Database in it just to see what it can do.

So how do I feel as a Perl programmer writing Python? Pretty good too. There are obvious differences, and traps for new players, but the fact that I can dive into something and fairly quickly be fixing bugs and implementing new features is pretty nice too. Overall, I think that once you get beyond the relatively trivial details of the structure of the code and how variables work and so on, what really makes languages strong is their libraries and interfaces, and this to me is where Perl stands out with its overwhelmingly successfull CPAN and Python, while slightly less organised from what I've seen so far, still has a similar level of power.

About the only criticism I have is the way the command line option processing is implemented - Python has tried one way (getopt) which is clearly thinking just like a C programmer, and another (optparse) which is more object oriented but is hugely cumbersome to use in its attempt to be flexible. Neither of these hold a candle to Perl's GetOpt::Long module.

posted at: 13:53 | path: /tech/web | permanent link to this entry

Fri, 25 Jul 2008

No good title
History has been revised. Thank you.

posted at: 21:22 | path: /personal | permanent link to this entry

Tue, 15 Jul 2008

The lost limericks list
After that post, I thought I'd just check which category I'd put my previous limericks in. To my horror, I discovered that I hadn't blogged them at all, but had (merely) posted them to the Linux Australia list. So I rescued them and posted them here for posterity.

That wonderful man Andrew Tridgell
Over SaMBa keeps permanent vigil.
SMB, it is said,
He decodes in his head,
And CIFS 2 will some day bear his sigil.
The great LGuest programmer Rusty,
Is virtually never seen dusty.
He eats 16K pages,
And has done so for ages,
Yet his moustache is clean and not crusty.
That marvellous girl Pia Waugh
Is certainly hard to ignore.
With her leet ninja moves,
Open Source just improves -
All Linux Australians show awe!


posted at: 09:51 | path: /tech | permanent link to this entry

The Wireless Jonathan Oxer
After the three limericks I wrote about Tridge, Pia and Rusty, the conversation came up on #linux-aus about whether I could make a similar epgiram for Jon Oxer, former Linux Australia president, front-line hardware hacker and all-round good guy. It took me two months, but in an email to Jon I finally cracked it, packing much more into the rhyme than I originally thought would be possible:

The wireless Jonathan Oxer,
Waves his hand and his front door unloxer.
A remote-control loo,
And home theatre too -
If you as me, his whole house just roxor!
Who's next, I wonder?

We tune to podcasting James Purser,
Long known as a rhymer and verser.
With his darling wife Karin
They are not known as barren:
Three children now stare at their cursor.
Steve Walsh, however, is going to take a bit more thinking about.

Send your suggestions of who should be next under the pen to paulway@mabula.net

posted at: 09:50 | path: /tech | permanent link to this entry

Wed, 02 Jul 2008

New Job, Same Old Business
I've just started work on Monday at my new employer, TransACT, a fibre and copper communications provider in (as the name implies) the Australian Capital Territory. I've read through the employee handbook, done all the financial documentation, been given a computer and installed Fedora 9 on it. The majority of the team here use Mac Minis as their desktop machines, because there's a high requirement to use Unix commands to manage the network infrastructure. Of course, we still have to hook into the Microsoft Windows support infrastructure, but that's hardly a challenge these days.

The reason I mention this is because TransACT and its parent company ActewAGL are featured on Microsoft Australia's "Get The Facts" pages as some kind of 'shining example' of a company that "Wave[d] Goodbye To Linux" and somehow saved money. The facts are radically different, even from the small sample I've seen so far. All the network infrastructure, from the set top boxes to the DHCP servers to the encryption server for the IPTV, run on some kind of Unix - Debian Linux seems to be the predominate flavour. Microsoft's "case study" is really just a small part of TransACT and ActewAGL's business, and it's hardly "waved goodbye" to Linux in the organisation.

posted at: 10:29 | path: /work | permanent link to this entry

Sun, 15 Jun 2008

Common code in ClearSilver 001
I've been using ClearSilver as a template language for my CGI websites in earnest for about half a year now. I decided to rewrite my Set Dance Music Database in it and it's generally been a good thing. Initially, though, I had two problems: it was hard to know exactly what data had been put into the HDF object, and it was a pain to debug template rendering problems by having to upload them to the server (surprisingly, but I think justifiably, I don't run Apache and PostgreSQL on my laptop so as to have a 'production' environment at home).

I solved this problem rather neatly by getting my code to write out the HDF object to a file, rsync'ing that file back to my own machine, and then test the template locally.

I knew that ClearSilver's Perl library had a 'readFile' method to slurp an HDF file directly into the HDF object, and a quick check of the C library said that it had an equivalent 'writeFile' call. So happily I found that they'd also provided this call in Perl. My 'site library' module provided the $hdf object and a Render function which took a template name; it was relatively simple to write to a file derived from the template name. That way I had a one-to-one correspondence between template file and data file.

Then I can run ClearSilver's cstest program to test the template - it takes two parameters, the template file and the HDF file. You either get the page rendered, or a backtrace to where the syntax error in your template occurred. I can also browse through the HDF file - which is just a text file - to work out what data is being sent to the template, which solves the problem of "why isn't that data being shown" fairly quickly.

Another possibility I haven't explored is to run a test suite against the entire site using standard HDF files each time I do a change to make sure there aren't any regressions before uploading.

Hopefully I've piqued a few people's interest in ClearSilver, because I'm going to be talking more about it in upcoming posts.

posted at: 11:10 | path: /tech/web | permanent link to this entry

Sun, 01 Jun 2008

Faith in Atheism
I was in the office of a church hall on Friday, picking up the keys for the hall for our Canberra Irish Set Dance Weekend, and while waiting for the people to work out the bill a leaflet for an upcoming talk at the church caught my eye. The topic of the talk was:

Why I Don't Have The Faith To Be An Atheist.

Now, I will freely admit that that's a catchy title, because it certainly caught my eye. And while I endeavour to understand other people's points of view I am often blinded by my own ideas of what is sensible and reasonable. But I cannot fathom how that that topic can be debated seriously in the affirmative.

On the one hand, to me it requires much more faith to believe in an arbitrary, contradictory, and often non-sensical set of teachings that fly in the face of the evidence around us than to not have to believe any of that. My Australian Concise Oxford gives its first definition of "faith" as: Reliance or trust in; belief founded on authority - the other definitions are the type of religion one believes in and a promise or intent (as in in good faith). In that context I would say that all religions have some authority, be it a book or a person, that is the foundation of their belief, whereas Atheism makes no such demand. Atheism has no book which is quoted chapter and verse, no authority figure that tells people to not trust science and believe what they teach in contradiction to the evidence.

On the other hand, if this is some kind of sophistry - some kind of cunning argument or uncommon definition of "faith" or "atheism", then I think one is entitled to ask if the speaker is going to be serious at all. If it's a straw man argument, then really what's the point of it? I can respect people who stick by what they believe even as they acknowledge the flaws in their own arguments - I can't respect someone who tricks their audience with a conveniently quelled paper tiger.

I was half tempted by Kate's sensible suggestion to actually go and see this just to actually solve this logical problem before it threatened to burst my brain. But as I have this sneaking suspicion that the whole thing will be preaching, appositely, to the choir.

I must now hide myself from the metaphor police.

posted at: 21:10 | path: /society | permanent link to this entry


All posts licensed under the CC-BY-NC license. Author Paul Wayper.