This is my (in)activity log. You might like to visit my employer
Novell which is an amazing company, and also
Dell who in days of yore provided me with a
free laptop for Gnome development / conferences.
Also if you have the time to read this sort of stuff you could enlighten
yourself by going to Unraveling Wittgenstein's net or if
you are feeling objectionable perhaps here.
Stuff Michael Meeks is doing
Poked mail, Evolution patch merging and packaging fun
with Michael and Peter; good to see them on IRC. Spent time
prodding at testing SOCKS proxy support.
J. out counselling in the evening; managed to get much of
the 360 X bearing plate assembled and running nicely; worked late
poking at PackageKit and patches.
Up early, mail digging, nursed the gnome-shell build;
seemingly building mozilla with a non-system nss is an infernal
mess. Why not use pkg-config uniformly, rather than requiring these
configure arguments ?
Moved OSCON flight so I can get to GUADEC on time, call with
Jared. It's good to know that "You can't just go around taking
photos" according to the MET.
Mail triage, admin. Tried some more to get jhbuild
to build Gnome 3.0 on SLED11-SP1 - lots of problems going beyond
the libtool one. The most evil problem is a bogus
dependency chain of doom: everything requires gvfs which
requires gnome-disk-utility (uh?) which requires udisks
(which requires lots of rather recent pieces). Suffered
with the retarded setup of 'device-mapper', atasmart,
build-your-own udev, latest avahi-ui etc.. Of course - I
had no desire to do anything clever with my disks at all.
Bad. Interestingly this mirrors some acute madness and
package splitting required for MeeGo in exactly this area.
Notable examples would be device-mapper's habit of trying to
force root user ownership, and gnome-disk-utility's wonderful
hard-coding of system paths in Makefiles, urgh:
Advisory call with Stormy & co. Martin over in
the evening with spare ATX PSU, played printing pieces and
catching up at some length.
Up early, tended babes; while printing plastic springs.
Off to setup tents - a very sunny day for church without walls
on Studlands Park green.
Back to collect babes, and water for the masses; church
service on the green. Back for barbeque with Chris & Claire
Much lying around in the sun, watching assorted babes
splashing in the pool etc. Let E. over-sleep, leading to a
tragically interrupted night of non-sleep for us.
Up late. Pottered around printing pieces of reprap out
and assembling them with H. for much of the day, got the y
carriage assembled. J. out to a party with both babies in the
morning, and N. in the afternoon. Played with H. making an
assault course in the garden in the sunshine; lovely.
Dropped babes to school, cleaned church, picked up racking
from John; to work. Prodded at a really nasty nasty in g-ir-scanner.
Prodded once more at jhbuild, breaking again in libtool -
which is fine at linking things, but gets highly confused by system
.la files (it seems), and I refuse to do a bulk delete of my nicely
package-managed .la files; eventually caved in and moved them to
some safe place for future testing.
Chatted with David wrt. some Evolution bug fixes, and was
amused and pleased to see Alan attribute this sage advice to him:
"Policy is a poor man's substitute for common sense."
-- David Woodhouse
Prodded at mail. Rethink Wireless have been spamming me for
some considerable time, but I got hooked somehow on reading their
updates. Of course, I know nothing about the handset market, but it
is sad to see Nokia
taking a beating. It remains incredible to me that the huge opportunity
presented by the N900 -
was abandoned in favour of non-user-visible tech warfare. Time to
market ? or are the times changing ?
Poked at jhbuild, time to have a real, full GNOME environment
building instead of working with patches everywhere I suspect. Worked
with Joey on image bugs.
Lunch; booked hotel for OSCON. Boggled at Sam Varghese's latest
trolling - refreshingly of Network Manager; apparently manually editing
a text file is how all right thinking people should setup networking;
and everything else (eg. point and click to select a wifi network, DHCP
as default for network address selection) is "high grade bull ... will
drive people away ... voodoo world of Windows". Re-assuring that my
tenouous grip on the real world (amongst the source files) is stronger
than some others'. Perhaps a
better article title would be: "I watched the world cup instead of
thinking about what to write, so now I have to generate three pages of
mindless drivel that will get lots of hits ... what could it be ?".
Printed out some nice plastic pieces in the evening; slicer
seems to be doing its job at least - a reliable extruder is really key
in getting a robust shape it seems, far more so than the internal
fill spacing. Out to Cell group to distribute leaflets for church on
the park on Sunday. Back early to watch DVD with Lydia & J.
More mail catchup, attempted to organise travel more effectively.
Why did my extended family all manage to get born at times co-incident with
a peak in the conference season.
Fixed a nasty PackageKit / zypp crasher or two, and fired off some
patches to MeeGo. Managerie of phone meetings in the afternoon; pleased to
meet caillon there.
Re-wrote the repsnapper slicing algorithm in the evening; tragically
by removing some hideous bugs (a broken 2D point hash), I managed to make
slicing far more accurate, and yet pragmatically worse. Added an orphaned
point connector to get the most perfect slicer yet; sadly better slicing
breaks Logick's shrinking algorithm; hmm.
Fell over another joy of C++ - default copy constructors and the
pImpl pattern: wonderful to hide your implementation details behind a
private pointer; less wonderful to have the default copy constructor
duplicating that pointer, causing wonderful crashes via two destructors
freeing the same pointer.
Prodded mail; finished and reviewed LXF column, dug at some
bugs with Ben. Read some of Kohei's Ixion. Conference calling action
Up early, took babes to school with some triumphent six to
nine times-tables; perhaps they are finally getting them.
Prodded mail, triaged meego bugs, Clarity, admin, read news.
Thrilled to read that Intel finally did the right thing, and
the requirement for (C)
assignment (of whatever form) to be able to contribute to
clutter - making it a truely open project; nice ! I feel a sudden
urge to contribute, something, anything now it belongs to us all.
It seems the H open published an interview
based on a not completely separated pastiche of some new bits with
some rather older quotes from around the web.
- To me, the most
interesting thing about OO.o that needs fixing - is the developer
community. That is still predicated on the Sun guys perceiving that
it might be nice to work together with others to build one, and
considering careful compromises to help make that a reality.
To recap - the problem is that Sun (and some other corporates)
simply refuse to include code under the LGPLv3 (which would be our
preferred solution) unless they can avoid it's terms by owning the
My favorite awful compromise of the month (that retains the
well known barrier to entry, distrust breeding ground etc. that is
assignment) - but might at least make some progress would be to:
(wait for it) - assign everything to Oracle ! so they can own it
and do what they like with it - but - only on condition that
majority non-Sun written code modules are continued to be made available
to others under LGPLv3 plus a more lax license: perhaps MPL/CDDL,
Apache, BSD (in order of increasing laxness). That would effectively remove
the value of the exclusive ownership of code written by others (for
unseemly back-room arm twisting), while at least for the forseeable
future, not impacting the proprietary value of the bulk of the code-base.
Clearly, by far the best approach is to pick a license you can
accept, with a suitable license steward, and go eclectic ownership -
letting creativity flourish: the Mozilla approach. This is also -clearly-
in the spirit of the (pure) Marketing around the 'Shared' nature of the
'Shared' Copyright Assignment (SCA) : if it is truly shared (it is not),
then why not allow it to be available under another license ? And again,
it is regrettable that they will not accept code simply under the terms
of the LGPLv3; our problem is not with the license - but the assymetry
between it and outright ownership of our code.
I still hate (C) assignment with a fear and loathing; and
continuing it for OO.o drives away the developer help we need; but perhaps
this compromise might help re-unite the wider OO.o community, and at least
having the bigger corporate contributors working together can't hurt to
Printed out a gear and (at great length) a new geared extruder
housing, which (hopefully) will improve the reliability of the beast,
as/when I can knurl the M8 studding involved.
Up early, tended babes while J. slept. Dropped David into
Cambridge for his conference. Home, played with the machine briefly,
woke J. and off to NCC. DT preached, and the babes were good in
Back for lunch, tidied up, lazy afternoon printing pieces
of very mixed quality - seemingly the extruder is a tempremental
beast and getting the right amount of 'pinch' is quite difficult
- currently far too little yielding stringy and fragile output.
Bed early, programmed on repsnapper in bed for a while,
some shapes (even simple ones like
appear to have un-cut-able layers missing GCode completely - most
odd. Having an SSD makes the laptop -so- quiet, and gives you
confidence that your data is stored on something solid, just the
tap of the keys for noise.
Up later; got dressed, babes playing with the play-doh,
a result of Guy's bounty. Tried to find horses in an over-crowded
town, and dropped Guy at the station.
Home for lunch, coughing on alternate lungs. David's
suspension spring broke in half - leaving him needing a train
journey to get here; bother. J. out shopping in town. Prodded
at the plastic printing machine a little - and sat at the
table assembling it with E. helpfully adding washers here &
Popped out to check on the machine - apparently the
thread jammed, purged the nozzle, and turned to see E. fallen
down the step, cut her head & crying - grief. Packed babes
into the car, zoomed off to A&E, remarkably speedy throughput
there too; only 1:30 door to door. Nothing much wrong, glued her
up, returned to J. and a rather late lunch.
Off to Erin & John's house; for a barbeque; good
to see them, and Mike & Katy & lots of kids. Tried to
stop E. doing all the normal head-banging behaviours: trampoline,
jumping off steps, attempting to climb bikes that are clearly far
too large for her. Picked up David from the station.
Home, packed babes to bed, up late talking to David and
printing out small pieces to bolt onto the reprap; really good
to catch up.
Up early, still feeling poor. Breakfast, and train/bus
into Cambridge to see the lovely Collaborans. Meetings, wandered
the streets of Cambridge inclemently. Conference call with Nokians
later in a cafe with Guy.
Back by train, for a birthday (thirty third) dinner with
the wifelet & Guy. A most pleasant evening, bed late.
Up early, fever gone (for now); feeling groggy, got
train to London to meet up with Guy & Intel. Wandered
between various 'Eat' restaurants before finding Guy. Meetings,
out for a fine lunch with Paul & Matthew. Good to catch up
with the guys there.
Tubes and trains home with Guy, enjoyed the garden in
the evening, and a little tea. Lydia arrived to meet with J.
Bed, tired variously.
Up early, feeling pretty awful; fuzzy head, painful right
lung - normally you have to smoke to feel this bad (surely) ?
Worked through mail sloowly. Feeling terrible. Bed before
the children with a fever.
Locked out of the house; J. attempted to raise Bert, but
eventually had to clamber over and get through a window; downer.
More mail prodding. Jon pointed out that perhaps a more
horrible drop-off around C++ streams for printing things is the
lack of sane l10n support due to fragmenting the strings, and not
allowing re-ordering; good point.
Apparently avoiding E-mail during hack-week was bad; I
missed the chance to vote in the Foundation election; bother,
still (unlike OpenOffice.org) at least I was E-mailed to remind
me to vote.
Poked at evolution packaging, and misc. MeeGo fixes there,
submitted an update or two. Boggled at C++'s hash_map (apparently
non standard, and with some unpleasant compile-time warning), but
it's replacement 'unordered_map' can't be included without other
warnings of not-yet-ready-ness (perhaps just a SLE11 issue).
Off to have the car fixed, hacked from a nearby fitness
club with WiFi; JP's staff meeting. On the 'probability clusters'
front, got a call from the dear wife - once again locked out -
presumably the result of normally having a husband firmly rooted
Car failed MOT due to a small windscreen crack; bother.
Lydia & Janice over for the evening - pottered about with the
machine - re-built the extruder securing to be ultra rigid. Printed
a test part.
Read mail, admin pieces. Pleased to see Neelie Kroes make
some (apparently) rather sensible
statements about the evils of proprietary software. Now if we can
only ask governments to encourage / prefer Open-(Source) or Free
Software - we can not only reduce our tax burden, and government
effectiveness, but have a winning strategy (unlike the 'open standards'
game, at which large entrenched monopolies are only too adept at
Knocked up some screenshots of repsnapper, with package
repo for openSUSE: repsnapper.
I really need to get all the avr toolchain (and the like) inherited
into and available from there, along with the arduino tools and
ArtOfIllusion; and an openSUSE / Studio bootable image. Repsnapper
looks like this:
Sadly missing some /dev/ttyUSB0 detection (though Rick is
working on it).
Interesting to do some more C++ programming, and see what
fltk is like (not my personal choice, but what was there). What did I
It seems the
single file, containing GUI and
code, that can be compiled into .cxx & .h files by a
head-less binary is quite a nice model; why ? because
you still have a self-contained binary that doesn't drag XML
files with it (across platforms), and it is easy:
fluid -c UI.fl is pretty simple to add to a
Makefile. We should have done this years ago with glade 1: it
would be have been pretty trivial.
C++ is not a panacea; it's still easy to mess up
memory allocation, cut and paste code, and produce a foul
mess that is hard to unwind. A great example would be fltk's
void Fl_Widget::label (const char *a); -
used to set the label on a widget. As a thing of
beauty it stores the raw const pointer value. But - as a
bonus there is extra code and lifting for a
Fl_Widget::copy_label (const char *a); that
does the sane thing. Don't assume other toolkits share good
taste in copying conventions.
sprintf the C++ way is unutterably
lame; at least - as I understand it (perhaps that is the
problem). Full of enthusiasm for the C++ way, I wrote this
sort of thing
oss << "You are " << setw(2) << years << " years " << months << " months old\n";
which is all pretty and everything (and notably only a single line).
Sadly it turns into five function calls plus frame setup, plus
exception unwind tables. Contrast with the standard 'va_args'
approach in fprintf - a single function call, and some frame
setup. I can only imagine what this does to your code size when
you have hundreds of debugging statements around the place
doing cunning stuff of the form:
dbg << "data is: " << a << ", " << b << ", " << c << "\n";
etc. I guess you have to compile them out. A more discerning va_arg
version (in C++) could still do nice, powerful object printing
(perhaps) but with less of a footprint. Then again, I guess C++'s
hidden pointer adjustment makes var arg functions something of a
Mary Rogers over for dinner in the evening - lovely to spend
some time with her again.
Up early; tended babes for a while, while washing up the
remains of yesterday's carnage. Off to NCC, Tony spoke on Jesus'
Back for lunch with June; managed to print a Y axis mount,
albeit with some acute warping; hmm - need a heated bed, or cheap
hair-dryer I guess.
Out to James' birthday party at the Wood's - good fun.
Back, tired, put everyone to bed; dinner, tinkering, bed.
Lie in, off to the market to stock up on necessaries for
the party. Light lunch, barbequeing action, lots of fun-sized people
arrived to play. Lovely afternoon in the garden in the sun celebrating
two lovely years of Elizabeth.
Prodded at printing plastic in the evening; started to knock
up a wooden spindle to hold the filament that might actually be
turned by the extruder stepper.
More bootchart2 hacking, and some repsnapper pieces, fixed
misc. bugs, packaged for openSUSE. In a fantastic irony, I spent
fifteen minutes chasing a C++ bug whereby I had declared a bogus
return type of std::string that I didn't return; it turns out gcc
-Wall is almost as lame as python in that
regard. Discovered a number of other sillies eg. people assuming
the compiler will do string uniquification and they can do:
if ("Pause" == "Pause") type things (with some
added indirection) in C.
Prepped for E.'s 2nd birthday tomorrow. J. made a fantastic
Got a certain amount of amused feedback on my python rant;
even from some professional sufferers. Patryk Zawadzki kindly recommended
pylint. Tried the former on
the GUI code. It found a number of unused local variables (wonderful)
and imports I didn't need, but not a missing 'return' in a method: nice.
Tried the latter: apparently as part of 'sudo python setup.py install' it
does a number of web downloads and runs the result (shudder); after that
masterly horror - it mentions the method that doesn't return a value has
Missing docstring, but nothing else. Of course it generated a
ton of false positives - un-loved variable names etc. Tried to clean it
up a little, caught exactly zero real bugs; sigh.
Booked flights for OSCON
More bootchart2 prodding, generated and dumped the nice
process hierarchy, and started poking at the python to render it.
I have to say that a great, great loathing is growing in me
what you are !). I feel like adding comments before each method of the form:
And of course just that simple example took me sixty seconds
to unwind: dig back to each constructor to be sure.
# CairoContext, Process, ProcessTree, float, float, Tuple(x,y,w,h), Tuple(x,y,w,h)
def draw_processes_recursively(ctx, proc, proc_tree, y, proc_h, rect, clip) :
Feeling good about yourself ? time to start using
VBA, or it's moral equivalent: python, for a while. You could argue
that the way to fix this is to impose 'self discipline' (similar
to the just-a-sub-set-of-C++ argument) - and either mangled
the type into all your variable names (but I am not Hungarian), -or-
to try to use the same variable name everywhere for a given type
(until you have two in the same method).
Python: it scales to two whole screen-full of code
without loosing readability! Python: why write code to be read,
when it's so easy to write it new ? Python: great if you can hold
the whole program in your head. Now if only Google could target
... we might have a readable language, with an incrdibly
heavy-to-start run-time (hmm).
My next bug-bear was return values. Isn't it magic to have
a function call that may not return a value, yet gives no
warning (somehow I lost the ultimate 'return' statement in a
sub-method - perhaps it still lurks, nicely indented, somewhere
else in my code):
Nice; I spent half an hour finding the missing return.
As a helpful reminder, here is what a real language would say:
# some code, conditions, forget to return ...
a = doit()
if a: # is not None
# do something.
doit.c:8: warning: control reaches end of non-void function
Eventually (by crawling) arrived at the goal of beautiful
rendering, despite loosing both feet in the process.
Dinner, and put the babes to bed, while J. went out to
counsel a new client. Prodded at the reprap. After re-working
and tightening the X axis yesterday; I turned up the Y axis
power (being right on the edge is not so good), for the Z axis
tweaked the gear teeth, tightened the belts, applied mini (DRAM)
heat sinks to various chips, and ... got my first real, complete
print-out, of a coat-hook; generated by repsnapper (nice); fast
Printed out a beer
bottle opener, and had an Alsterwasser to celebrate (after mangling it
a little by omitting to insert a suitable one cent coin). Apparently
rep-straps are sufficiently easy to build that any old idiot can do it.
Drawings of ply-wood, and openSUSE packages to follow.
It seems that repsnapper's optimistic approach of dead
reckoning without ever resetting to the end-stops works rather well,
and faster too. Surely it is somewhat amazing that the machine can
get tens of 0.4mm layers on top of each other reasonably precisely
with those means.
Prodded at bootchart2 much of the day. Re-factored the
/proc task list polling, and implemented a threaded netlink based
PROC_EVENTS approach instead. That should provide two benefits:
first true 'parent' (ie. who forked whom) detail - instead of the
ppid fictions: which should provide a much cleaner graph, and
secondly far quicker response to get command-line and argument
details out of short lived processes.
Fixed reprap detection; it is not necessary to wait for a
board reset to be sure that we are connected. Lydia over for dinner,
prodded at the reprap mechanics in the evening, re-building the X
axis carriage to be more rigid, and moving the extruder board to the
top of the machine.
Hack week begins; spent much of the day clearing out mail,
and admin pieces, bother.
Fixed up the repsnapper build, tested it on openSUSE,
simplified the build process a little, added native file selector
support, command line arguments for loading STL files etc. FLTK is
quite interesting (and awful at the same time), poked at it
variously. Some packaging love tomorrow.
Poked FunkyPenguin's MeeGo on openSUSE packaging pieces
Mini lie-in; off to NCC, ran the creche. Home for lunch,
with John Madden. Babes played together happy to be re-united.
Out to a party with N. Back, prepped the house for a movie and
watched "Up" with Lydia, John, Martin, DT, Zoe & Patrick
- which was great. Bed lateish.
Up early, with a pair of small invading the bedroom, and
helpfully patting me etc. no doubt questing for the missing Mother.
Read the note I should have read yesterday, and discovered
another set of good things for picnics prepared in the fridge.
Spent a considerable time attaching a new baby-seat to my bike,
in conjunction with the trailer-bike.
Cycled off into town by back roads for some play-ground
goodness, E. apparently much pleased with her new cycling
experience. Picnic, play, ice-lolly, back home.
E. to bed, M. watching CBeebies videos on the BBC; and
demanding 'milk warmed up', and complaining of the service. Fair
sentiment, unhelpful articulation. Cleared and cleaned up
frenetically for J's return, tea, packed everyone to bed.
J. returned, Jacket Potatoe dinner appeared to work for
everyone, packaged H. & N. off to bed quickly; B. & A.
left, bed exhausted.
Bruce & Anne arrived early to take J. H. and M. off to
Rochester Castle and then the Eurostar to France (nominally to practise
their French); leaving me with the babies: M. and E. Pottered around;
made a packed luch.
Drove to Norwich, parked in the Castle Mall, walked to the
Castle (via several exciting escallator rides). Enjoyed the huge,
open keep for a while, though E. terrified of the glass covered well.
Then onto various exhibits Boadicea, stuffed animals (as slaughtered
en-masse during the colonial era), and so on.
Out for a picnic lunch in the sun; interestingly you are more
aware of slipping discipline when you're with the babes all day. Played
on a mini playground & back for more castle-ing.
Eventually exited via a scary prisoners tunnel to the
regimental museum, and back to the car via Maplin & more escaltor
Sleeping babes in the car at home, warmed dinner, and fed them
spag. bog. bathed, and packed them to bed - rather sad not to have their
Mother to kiss them to sleep.
Cleaned up & set too at the reprap; played with repsnapper,
and off to hack at the software. Ported HEAD to Linux again (removing a
number of Win32-isms), and pushed a git branch Rep-Snapper that really
builds (albeit not prints yet). Bed late.
Poked mail, strained at the build service, unwinding an
odd dependency loop. Struggled on trying to work out how ImageMagick
apparently the solution (at revision 208) to my reprapping software
woes; for all the reasons
listed by Giles.
Plugged away at build problems, strace -f'd two parallel osc
builds to compare, finally found the answer; duh - ImageMagick + perl
is not a good place to be.
J. & babes returned full of bounce from visiting Joy &
Chris at Oak Hill, put the babes to bed; dinner, back to work a bit.
Poked at interesting mail, wrote an analysis or two. Briefly
prodded a fascinating OO.o crasher on MeeGo apparently related to
some compiler over-enthusiasm.
Interested to discover the Janice (our Pastor's wife) is an
ace knitter of things, eg. a digestive
tract (for teaching purposes of course); encouragingly creative.
Soldiered on with the repstrap - un-shorted and re-attached
the stray thermistor; tried printing gears again; hmm - the in-fill
seems a bit over the top; I'm suspicious of the rather over-enthusiastic
extruder reverse/return cycle spewing extraneous plastic. Something
a bit like a gear appeared though: teeth and all - nice.
Interested to see the C++ in gcc discussions going on;
having done a little hacking on gcc as someone unfamiliar with
the code-base; it took a large amount of time to get into. This
was seemed un-related to the language choice, and instead to the
habit of re-using generic types for everything - presumably (in
part) because the garbage collector can walk them without extra
effort. If changing the language helps focus people on improving
readability, that's all to the best. Of course, C++ has some
hideous readability problems built-in: operator overloading,
void non_obvious_mutator (int &x);
and so on.
Mail, and admin, sync call with JP. Nice to see the MeeGo
blog entries from Thomas
(on zones), and Travis
on Telepathy/Empathy. Nice Ars
Technica review too with a lot of shots (a shame WiFi didn't
work for them though).
Lunch, quick advisory board call.
Having heard about the Israeli helicopter raid on the
(difficult-to-board) boat, and given that my sentiments are
generally with the oppressed, state-deprived Palestinians - who
apparently also get regularly attacked by illegal Israeli settlers,
I was suitably unsympathetic to the (apparently obvious
propoganda) of the Israeli military about how they were beaten
by pipe wielding crazies, and so on; and much more convinced by
the apparent peace-nicks: "not going to pose any violent
resistance" line. On the other hand, I hate being
by the radio. For how long will an armed man under
attack watch his colleagues get beaten before he authorises a
disproportionate response ? Perhaps that is not news. Then again
looking for the blamelessly virtuous in the cycle of violence and
suffering in the Middle East seems a pretty fruitless quest; sigh.
Just to exacerbate my strategy of offending everyone
concurrently (divide and conquer) - I have some sympathy for Foxconn
whose no doubt appallingly normal (for China) working conditions
might be only the grit in the oyster of their problem. Could this be
a Micronesian Teen suicide type epidemic.
Pleased and amused to see (finally) some closure on the
unusual backwards I/O patterns that iogrind showed at startup, more
juciy details from Taras.
Dinner, Lydia & Janice came over. Plugged away at the
repstrap - mounted the bulk fillament somewhat lamely on the ceiling
above the machine, really needs a proper spindle & bearing.
Calibrated both sides of the Z axis nicely, re-made the Y and X opto
end-stops using biscuit tin lid. rather than beer can: for a more
durable action, tightened everything - finally got a reasonable print
of the bottom few layers of a cube, though eventually (due to a raised
lump in the middle) the thermistor became detached; well pleased with
progress; and with a very tough square of plastic.
In case it's not painfully obvious: the reflections reflected here are my
own; mine, all mine ! and don't reflect the views of Novell, The
Lithuanian Gov't or Arnold Schwarzenegger. It's also important to
realise that I'm not in on the Swedish Conspiracy.
Occasionally people ask for formal photos for conferences,
Michael Meeks (firstname.lastname@example.org)