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:
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
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
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
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:
So what's odd in the whole Nine versus IceTV is that Nine has done this:
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
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
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
url(r'/poll/(?P
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
When I changed this to:
new/in/(?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
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
No good title
History has been revised. Thank you.
posted at: 21:22 | path: /personal | permanent link to this entry
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!
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,Who's next, I wonder?
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!
We tune to podcasting James Purser,Steve Walsh, however, is going to take a bit more thinking about.
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.
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
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
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
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.