<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>Geek London - absolutely capital</title>
    <link>http://geeklondon.com/</link>
    <description>Meddling with forces I do not understand</description>
    <item>
      <title>What's in a name?</title>
      <link>http://geeklondon.com/blog/view/gnus-not-linux</link>
      <content:encoded>&lt;p&gt;I hereby propose that the &lt;a href="http://www.fsf.org/"&gt;FSF&lt;/a&gt; stop the &lt;a href="http://www.gnu.org/gnu/why-gnu-linux.html"&gt;petty naming argument&lt;/a&gt; and just give in to the linguistic inevitability of calling operating system platforms built upon the &lt;a href="http://en.wikipedia.org/wiki/Linux_kernel"&gt;Linux kernel&lt;/a&gt; "Linux" instead of demanding that we call them "GNU/Linux". I for one have a lot of &#xD;
&lt;a href="http://www.opensource.org/licenses/mit-license.php"&gt;MIT&lt;/a&gt;, &#xD;
&lt;a href="http://www.apache.org/licenses/"&gt;Apache&lt;/a&gt;, and&#xD;
&lt;a href="http://www.opensource.org/licenses/bsd-license.php"&gt;BSD&lt;/a&gt; licensed software on my machine, as well as a bunch of proprietary stuff that is decidedly not "GNU" software.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;The gamut is know as Linux because that's the luck of the draw. &lt;a href="http://en.wikipedia.org/wiki/Linus_Torvalds"&gt;Linus Torvalds&lt;/a&gt; created the first successful free unix-like kernel and so the operating systems based upon that became known as Linux. People using GNU tools on Solaris don't call it "GNU/Solaris". People (like me) using commercial Java tools on Linux don't call it "Java/Linux" for much the same reason.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;So, to the vote Let's have a look at the list of &lt;a href="http://en.wikipedia.org/wiki/Linux_distribution#Popular_distributions"&gt;popular distributions&lt;/a&gt; (whether you want to call them Linux or GNU/Linux) listed in the Wikipedia currently:&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://www.archlinux.org/"&gt;ArchLinux&lt;/a&gt;, &#xD;
   &lt;a href="http://www.centos.org/"&gt;CentOS&lt;/a&gt;,&#xD;
   &lt;a href="http://www.debian.org/"&gt;Debian&lt;/a&gt;,&#xD;
   &lt;a href="http://fedoraproject.org/"&gt;Fedora&lt;/a&gt;, &#xD;
   &lt;a href="http://www.gentoo.org/"&gt;Gentoo&lt;/a&gt;, &#xD;
   &lt;a href="http://www.knoppix.org/"&gt;Knoppix&lt;/a&gt;, &#xD;
   &lt;a href="http://www.mandriva.com/"&gt;Mandriva&lt;/a&gt;, &#xD;
   &lt;a href="http://www.pclinuxos.com/"&gt;PCLinuxOS&lt;/a&gt;, &#xD;
   &lt;a href="http://www.redhat.com/"&gt;Red Hat Enterprise Linux&lt;/a&gt;, &#xD;
   &lt;a href="http://www.slackware.com/"&gt;Slackware&lt;/a&gt;, &#xD;
   &lt;a href="http://www.novell.com/linux/"&gt;SUSE&lt;/a&gt;, &#xD;
   &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt;.&#xD;
&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;So what do they call themselves?&lt;/p&gt;&#xD;
&#xD;
&lt;ul&gt;&#xD;
 &lt;li&gt;ArchLinux - &lt;i&gt;a lightweight and flexible &lt;b&gt;Linux&lt;/b&gt; distribution&lt;/a&gt;&lt;/i&gt;&lt;/li&gt;&#xD;
 &lt;li&gt;CentOS - &lt;i&gt;an Enterprise-class &lt;b&gt;Linux&lt;/b&gt; Distribution&lt;/a&gt;&lt;/i&gt;&lt;/li&gt;&#xD;
 &lt;li&gt;Debian - &lt;i&gt;uses the Linux kernel (the core of an operating system), but most of the basic OS tools come from the GNU project; hence the name GNU/Linux&lt;/i&gt;&lt;/li&gt;&#xD;
 &lt;li&gt;Fedora - &lt;i&gt;a &lt;b&gt;Linux&lt;/b&gt;-based operating system&lt;/a&gt;&lt;/i&gt;&lt;/li&gt;&#xD;
 &lt;li&gt;Gentoo - &lt;i&gt;a special flavor of &lt;b&gt;Linux&lt;/b&gt;&lt;/a&gt;&lt;/i&gt;&lt;/li&gt;&#xD;
 &lt;li&gt;Knoppix - &lt;i&gt;eine komplett von CD oder DVD lauffähige Zusammenstellung von GNU/Linux&lt;/i&gt;&lt;/li&gt;&#xD;
 &lt;li&gt;Mandriva - &lt;i&gt;The &lt;b&gt;Linux&lt;/b&gt; desktop that's easy to try and easy to keep"&lt;/i&gt;&lt;/li&gt;&#xD;
 &lt;li&gt;PCLinuxOS - &lt;i&gt;a free, easy-to-use &lt;b&gt;Linux&lt;/b&gt;-based operating system&lt;/i&gt;&lt;/li&gt;&#xD;
 &lt;li&gt;Red Hat Enterprise &lt;b&gt;Linux&lt;/b&gt; (they are no more specific than in the name)&lt;/i&gt;&lt;/li&gt;&#xD;
 &lt;li&gt;Slackware - &lt;i&gt;the Slackware &lt;b&gt;Linux&lt;/b&gt; distribution&lt;/i&gt;&lt;/li&gt;&#xD;
 &lt;li&gt;SUSE - &lt;i&gt;this enterprise grade &lt;b&gt;Linux&lt;/b&gt;&lt;/i&gt;&lt;/li&gt;&#xD;
 &lt;li&gt;Ubuntu - &lt;i&gt;a community developed, &lt;b&gt;Linux&lt;/b&gt;-based operating system&lt;/i&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&#xD;
&lt;p&gt;Votes in favour: 10&lt;/p&gt;&#xD;
&lt;p&gt;Votes against: 2&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;b&gt;Motion carried.&lt;/b&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Language is a juggernaut. Step in its way and you'll be crushed utterly - far better to go with the flow. Stallman and the FSF can be proud of creating the environment that allowed Linux to flourish; trying to change the name to garner a bit more praise is futile and unattractive.&lt;/p&gt;</content:encoded>
      <pubDate>Tue, 02 Sep 2008 15:52:59 GMT</pubDate>
      <guid>http://geeklondon.com/blog/view/gnus-not-linux</guid>
      <dc:date>2008-09-02T15:52:59Z</dc:date>
    </item>
    <item>
      <title>Blogroll gentlemen please... (dadum, tish!)</title>
      <link>http://geeklondon.com/blog/view/blogroll</link>
      <content:encoded>&lt;p&gt;I don't normally write about other blogs because I am horribly self centred. I also don't write about them because I find the whole self-referential nature of blogging about bloggers to be self-important and parasitic. It reminds me for no very tangible reason of people who used the phrase "postmodern" during the 1990s. Oh and we fear recursion.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Still.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;The thing people most like to read about is themselves so it probably isn't a bad idea to have a digression in that sort of direction from time to time. I shall eschew the time honoured tradition of writing about other peoples' articles about me because it is vain and because there are none. Instead I shall give you a portmanteau review of some blogs that I know where "review" means ramble about briefly.&lt;/p&gt;&#xD;
&#xD;
&lt;h2&gt;Sites that I: Loathe&lt;/h2&gt;&#xD;
&#xD;
&lt;p&gt;Well, that's a bit strong and not entirely accurate. I in fact mean "used to like - a bit - and then went off." But it's not as lithe a phrase. There are only two here - there are of course plenty of others in principle, but only the ones that I have (relatively) recently become disenchanted with are fresh in the memory.&lt;/p&gt;&#xD;
&#xD;
&lt;h3&gt;Scott Adams&lt;/h3&gt;&#xD;
&#xD;
&lt;p&gt;I stopped reading the &lt;a href="http://dilbertblog.typepad.com/"&gt;Dilbert blog&lt;/a&gt; around about the time that Scott stopped saying interesting things and started saying stupid or annoying things instead. I say "around" because I carried on reading for a bit - during which time he adopted the alternate strategies of saying "No, it was just a test, you're stupid for agreeing with me" and "No, I'm right and you only think I'm wrong because of Cognitive Dissonance." I should have stopped reading as soon as he started writing about religion.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Of course Scott is famous for the &lt;a href="http://dilbert.com/"&gt;Dilbert comic strip&lt;/a&gt;, not his blog. I stopped reading the comic strip shortly after going off the blog when Scott or his minions or employers, or whatever the relationship is, decided to render the Dilbert website using a bunch of Adobe Flash panels that (a) took forever to load, (b) displayed "off page" in Firefox and (c) were not readable at all because I don't usually install Flash. Presumably this was a good idea for some particular value of "good."&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Actually I do very occasionally visit the site when someone sends me a link to a particularly good cartoon because there is in fact a hastily contrived &lt;a href="http://dilbert.com/fast"&gt;fast&lt;/a&gt; page for the whiners like me. Here "fast" is a euphemism for "actually works." Even so, I started to find the relentless uni-joke that people are stupid and annoying kind of stupid and annoying in itself. I moved on to the far more whimsical and variable &lt;a href="http://xkcd.com"&gt;xkcd&lt;/a&gt; instead.&lt;/p&gt;&#xD;
&#xD;
&lt;h3&gt;Jeff Attwood&lt;/h3&gt;&#xD;
&#xD;
&lt;p&gt;Jeff Attwood writes &lt;a href="http://codinghorror.com/"&gt;a blog of technical commentary&lt;/a&gt;. It certainly has some redeeming features, amongst them the fact that he is literate and prolific - so there is usually something new to read if the fancy so takes you.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Here I don't know if Attwood went off the boil, or if I just stopped finding the content interesting. Either way, it seems these days to consist mostly of extensive quoting of third party material and paper thin commentary upon it. Sometimes the commentary is conspicuously inaccurate (or imperceptive) too, which doesn't help.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Given the degree of quoting it started to remind me of those insanely nested Usenet "arguments" that go&lt;/p&gt;&#xD;
&#xD;
&lt;pre&gt;&#xD;
&amp;gt;&amp;nbsp;&amp;gt;&amp;nbsp;&amp;gt;&amp;nbsp; That shows you&#xD;
&amp;gt;&amp;nbsp;&amp;gt;&amp;nbsp; No that shows you&#xD;
&amp;gt;&amp;nbsp; Loser!&#xD;
Ha! Double loser and no returns!&#xD;
&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;I think I can live without a return to that.&lt;/p&gt;&#xD;
&#xD;
&lt;h2&gt;Sites that I: Like&lt;/h2&gt;&#xD;
&#xD;
&lt;p&gt;To my mind it is far more edifying to read positive stuff than negative stuff. There are quite a few writers who suddenly dropped off my must-read list when they started maligning the intellect, attitude, or quality of some other perfectly sane, adjusted, and competent writer.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Obviously I'm doing that in the "Loathe" section above, but I don't have readers to lose. Besides, I may be unusual in this respect - such a lot of people do write derogatory stuff about other people; still, it's not to my taste. So here are some sites that are super in almost every possible way.&lt;/p&gt;&#xD;
&#xD;
&lt;h3&gt;Joel Spolsky&lt;/h3&gt;&#xD;
&#xD;
&lt;p&gt;&lt;img style="float: left; margin: 2px;" src="/images/blogroll/joel.png"/&gt;The blurb on the backs of Joels' books make him sound terribly interesting because he was in the Israeli military, attended a prestigious university, and runs a software company in Manhattan. In truth he is terribly interesting because he is a fine writer - and no doubt because I happen to be interested in the subjects about which he writes.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://www.joelonsoftware.com/"&gt;His articles&lt;/a&gt; are for the most part about the business of running his small software company or about writing software. They are always witty and usually pithy.&lt;/p&gt;&#xD;
&#xD;
&lt;h3&gt;Steve Yegge&lt;/h3&gt;&#xD;
&#xD;
&lt;p&gt;&lt;img style="float: left; margin: 2px;" src="/images/blogroll/steve.png"/&gt;Steve writes &lt;a href="http://steve-yegge.blogspot.com/"&gt;Steve's Blog Rants&lt;/a&gt;, or as they once were, &lt;a href="http://steve.yegge.googlepages.com/blog-rants"&gt;Stevey's Drunken Blog Rants&lt;/a&gt; on technology. They are probably the most overtly technical of the blogs I list here. Unlike the "rant" appellation that he gives them, they are actually very well thought out essays on technology. Well, actually they might just be rants, but if so they are impeccably spelt, grammatical, accurate, and insightful. Sure, they &lt;i&gt;are&lt;/i&gt; written in the style of a stream-of-consciousness diatribe but if that's really what they are then I plan to go around to his house and snap his fingers for making the rest of us look so bloody talentless.&lt;/p&gt;&#xD;
&#xD;
&lt;h3&gt;Rory Blythe&lt;/h3&gt;&#xD;
&#xD;
&lt;p&gt;&lt;img style="float: left; margin: 2px;" src="/images/blogroll/rory.png"/&gt;I first heard of Rory when he drew the very amusing &lt;a href="http://www.neopoleon.com/home/blogs/neo/archive/2003/09/29/5458.aspx"&gt;Excel as a Database&lt;/a&gt; cartoon and this appeared in one of Joel's books. Since then I have followed &lt;a href="http://neopoleon.com/"&gt;his semi-semi-fictional&lt;/a&gt; ramblings on the Neopoleon website. He crafts a good sentence and frequently makes me laugh aloud with an unexpected turn of phrase.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;His posts to the site are intermittent which may or may not be the result of his shambolic personal life - it really is very difficult to work out which bits are true - but reliably entertaining when they do eventually emerge.&lt;/p&gt;&#xD;
&#xD;
&lt;h3&gt;Stephen Fry&lt;/h3&gt;&#xD;
&#xD;
&lt;p&gt;&lt;img style="float: left; margin: 2px;" src="/images/blogroll/stephen.png"/&gt;&lt;a href="http://www.stephenfry.com/"&gt;Not exactly a blog&lt;/a&gt;, but close enough and I don't think he would object to the term. If you are British you know who he is and already love him or hate him. He is officially a National Treasure. I'm with the people who so acclaim him.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Stephen very occasionally writes an essay for his website, which is then made available simultaneously as an audio-recording or, as he would have it, podgram. Though lamentably infrequent they are excellent. On this site are also his Dork Talk articles for The Guardian newspaper and a few other odds and sods.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;He has also &lt;a href="http://www.videojug.com/interview/stephen-fry-web-20"&gt;appeared in a video&lt;/a&gt; on the almost disappointingly squeaky clean (given the name) website VideoJug.&lt;/p&gt;&#xD;
&#xD;
&lt;h2&gt;Not Quite Blogs&lt;/h2&gt;&#xD;
&#xD;
&lt;p&gt;Most internet writing does not consist of Blogs. Of course most internet writing is barely comprehensible either intentionally as with &lt;a href="http://en.wikipedia.org/wiki/Lolcat"&gt;LOLCats&lt;/a&gt; on &lt;a href="http://icanhascheezburger.com/"&gt;icanhascheezburger&lt;/a&gt; or unintentionally where the comments on &lt;a href="http://youtube.com"&gt;YouTube&lt;/a&gt; and &lt;a href="http://slashdot.org"&gt;Slashdot&lt;/a&gt; spring pretty forcible to mind.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Some non-blog content is comprehensible, intentional &lt;b&gt;and&lt;/b&gt; good though.&lt;/p&gt;&#xD;
&#xD;
&lt;h3&gt;Jakob Nielsen&lt;/h3&gt;&#xD;
&#xD;
&lt;p&gt;&lt;img style="float: left; margin: 2px;" src="/images/blogroll/jakob.png"/&gt;Any number of self styled web designers absolutely hate this guy. His fortnightly articles espouse the benefits of usability testing. This is, of course, thoroughly self-promoting as he is one half of the Nielsen Norman Group who sell reports and consultancy in usability.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;They hate him because his site is ugly and because he tells us that pretty sites are less important than usable sites. 90% of criticism levelled at the site consists of "his site is ugly" which is profoundly missing the point.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;The occasional people who tell us that it's unusable too never actually perform any empirical testing of this. Naturally the other clarion message of Jakob's site is that opinions and approaches to usability are utterly irrelevant - only testing the site with real users and observing what trips them up is of any value.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Given the gollum-like venom of the designers who despise him you would be hard pressed to dislike his writing in the first place. Still, it's nice that it's also well written and interesting.&lt;/p&gt;&#xD;
&#xD;
&lt;h3&gt;Robert X. Cringely&lt;/h3&gt;&#xD;
&#xD;
&lt;p&gt;&lt;img style="float: left; margin: 2px;" src="/images/blogroll/bob.png"/&gt;Bob is in the non blog section only because he claims not to be a blogger (this applies to Jakob and Paul too). In fact he writes &lt;a href="http://www.pbs.org/cringely/"&gt;what's essentially a tech industry blog&lt;/a&gt; every Friday and it's always interesting if not always accurate. But then who is?&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Like every other pundit he writes a column every January forecasting the events in the tech industry for the forthcoming year but unlike every other pundit he also reviews and pretty honestly scores his forecasts from the previous January. I think that's rather classy.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Cringely has covered the IT business for long enough now that he has contacts throughout the industry (or says he does), but for me the appeal of his writing is that he doesn't just write about the people in the industry or reminiscence about the good old days of Silicon Valley - instead he sticks his neck out and makes predictions about the behaviour of the various participants. Not always right, but a good read regardless.&lt;/p&gt;&#xD;
&#xD;
&lt;blockquote&gt;&lt;i&gt;Footnote 1: Bob's book Accidental Empires is a fascinating set of stories about the founders of the modern computer industry.&lt;/i&gt;&lt;/blockquote&gt;&#xD;
&#xD;
&lt;blockquote&gt;&lt;i&gt;Footnote 2: Bob's real name is not actually Bob. Therein lies a tale.&lt;/i&gt;&lt;/blockquote&gt;&#xD;
&#xD;
&lt;h3&gt;TED&lt;/h3&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://ted.com/"&gt;The TED site&lt;/a&gt; contains a mind boggling number of videos of presentations. The videos are usually entertaining, always fascinating, and free. You can watch them online, or you can download them as MP4 video files. The participants are leaders in their fields and for the most part deliver a stunningly good performance.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;I particularly recommend &lt;a href="http://www.ted.com/index.php/talks/clifford_stoll_on_everything.html"&gt;the video of Clifford Stoll&lt;/a&gt; being self-consciously whacky while measuring the speed of sound.&lt;/p&gt;&#xD;
&#xD;
&lt;blockquote&gt;&lt;i&gt;Footnote 1: Entirely unrelated, but Cliff wrote The Cuckoo's Egg about his experiences tracking down a hacker.&lt;/i&gt;&lt;/blockquote&gt;&#xD;
&#xD;
&lt;blockquote&gt;&lt;i&gt;Footnote 2: Some people say that we should use always "Cracker" instead of "Hacker" when speaking of computer crime but honestly they are mostly being silly. Language changes; get over it.&lt;/i&gt;&lt;/blockquote&gt;&#xD;
&#xD;
&lt;h3&gt;Paul Graham and Hacker News&lt;/h3&gt;&#xD;
&#xD;
&lt;p&gt;&lt;img style="float: left; margin: 2px;" src="/images/blogroll/paul.png"/&gt;Paul made his millions selling an internet company to Yahoo and &lt;a href="http://www.paulgraham.com/"&gt;now writes a variety of essays&lt;/a&gt; about the creative process as understood by a technical and commercially minded individual. He touches on philosophy, business, sociology, and art in his writing as well, but its his digressions into aesthetics and quality that strike the deepest chords with me.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Last but not least is &lt;a href="http://news.ycombinator.com/"&gt;this discussion website&lt;/a&gt; from Paul Graham's startup-investing company Y Combinator. The sites that are linked for discussion are often very interesting and the comments that form the discussion itself seem for the most part to be better thought and more clearly written than is usual.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;The site has a nice anti-procrastination feature that allows you to set yourself a quota for the amount of time you allow yourself to spend on the site and the duration that must elapse before you  can return to it.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;I fear that Hacker News will deteriorate as new users move the mean but for the moment it is a good read.&lt;/p&gt;</content:encoded>
      <pubDate>Sun, 17 Aug 2008 19:28:54 GMT</pubDate>
      <guid>http://geeklondon.com/blog/view/blogroll</guid>
      <dc:date>2008-08-17T19:28:54Z</dc:date>
    </item>
    <item>
      <title>Completely Sodding Stupid</title>
      <link>http://geeklondon.com/blog/view/float_like_a_wasp</link>
      <content:encoded>&lt;p&gt;I'm here to let you in on a secret:&lt;/p&gt;&#xD;
&#xD;
&lt;blockquote&gt;&lt;strong&gt;You are not alone. None of the rest of us can fathom &lt;acronym title="Cascading Style Sheets"&gt;CSS&lt;/acronym&gt; either.&lt;/strong&gt;&lt;/blockquote&gt;&#xD;
&#xD;
&lt;p&gt;There, I've said it.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;In theory CSS is a great idea. By separating styling from the semantic content of a document, you allow the document to be appropriately formatted for the medium in which it will later be presented, you allow the presentation to be altered without having to amend the original source document, and because the semantic content can be pulled out on its own you can make that information accessible to the blind and other people with limited access to the stylistic content.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;There are a few odd people with bulging eyes who reckon that CSS really is all this and more. They think CSS is the answer to all layout questions. If you sigh a bit and wistfully mutter about how tables were easy to understand, they spring to their feet insisting that despite all the available evidence, CSS is intuitive.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;My arse it is.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;The really notable thing about the solutions they offer to these gripes is that they are ghastly. Complex, verbose, requiring profound understanding of the relationship between the CSS and the &lt;acronym title="Document Object Model"&gt;DOM&lt;/acronym&gt;), or ingenious integration with Javascript. Often they break in exactly the same way that table based solutions break, and when they don't they are invariably more complicated.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;That doesn't mean that I think that reverting to the use of tables is a good idea, it means that I think some more effort should be put into the &lt;strong&gt;usability&lt;/strong&gt; of CSS. There are various problems of course - sometimes CSS has features that would make things terribly easy, but the browsers' support is too patchy to rely upon. Sometimes one just needs a better understanding of some CSS feature and then it really is easy (the selectors perhaps fall into this category). And sometimes CSS just plain sucks and someone should do something about it.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;As a (mostly) server side software developer I neither know nor care whose fault it is. But I know that there are several features that I would like, and here is my wishlist:&lt;/p&gt;&#xD;
&#xD;
&lt;ol style="margin-right: 2em;"&gt;&#xD;
 &lt;li&gt;&lt;a href="#curvy_corners"&gt;Curvy corners&lt;/a&gt;&lt;/li&gt;&#xD;
 &lt;li&gt;&lt;a href="#vertical_floats"&gt;Vertical floats&lt;/a&gt;&lt;/li&gt;&#xD;
 &lt;li&gt;&lt;a href="#form_formatting"&gt;Formatting for forms&lt;/a&gt;&lt;/li&gt;&#xD;
 &lt;li&gt;&lt;a href="#floats_within_elements"&gt;Floats within elements&lt;/a&gt;&lt;/li&gt;&#xD;
 &lt;li&gt;&lt;a href="#graphical_buttons"&gt;Graphical Buttons&lt;/a&gt;&lt;/li&gt;&#xD;
 &lt;li&gt;&lt;a href="#column_support"&gt;Column support&lt;/a&gt;&lt;/li&gt;&#xD;
 &lt;li&gt;&lt;a href="#order_independence"&gt;Order Independence&lt;/a&gt;&lt;/li&gt;&#xD;
 &lt;li&gt;&lt;a href="#width_on_inline_elements"&gt;Widths on inline elements&lt;/a&gt;&lt;/li&gt;&#xD;
 &lt;li&gt;&lt;a href="#addressing_text"&gt;Addressing text within textareas&lt;/a&gt;&lt;/li&gt;&#xD;
 &lt;li&gt;&lt;a href="#omg_ponies"&gt;A pony&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&#xD;
&lt;p&gt;So let's look at those in a bit more detail. Please bear in mind that sometimes there really will be a simple solution to the problem that I'm just &lt;strong&gt;too ignorant&lt;/strong&gt; to know about. If you spot one, please tell me the super simple solution. Be warned, however, that if it requires absolute positioning, or sixteen different cascading tweaks, the addition of eight &lt;span class="code"&gt;&amp;lt;div&amp;gt;&lt;/span&gt; elements to my markup &lt;strong&gt;and&lt;/strong&gt; some Javascript I will snigger.&lt;/p&gt;&#xD;
&#xD;
&lt;a name="curvy_corners"&gt;&lt;/a&gt;&#xD;
&lt;h2&gt;1. Curvy corners.&lt;/h2&gt;&#xD;
&#xD;
&lt;p&gt;There are a bizarre number of "fixes" for this - it confuses me to find people so ready to accommodate the deficiency. There are fairly obvious solutions involving bitmaps and Javascript. These tend to work well but degrade badly in the absence of Javascript or require lots of fiddling when you change colour schemes and sizes. Then there are the utterly nuts solutions such as the one that involves taking the bullet point symbol from one of the standard fonts and molesting it until it describes a suitable arc.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;This problem is, happily, in the pipeline for a fix. CSS3 has a &lt;span class="code"&gt;border-radius&lt;/span&gt; attribute that will provide this functionality. Firefox 3 (at least) supports it as the custom &lt;span class="code"&gt;-moz-border-radius&lt;/span&gt; attribute which has the virtue of degrading nicely in other browsers, though I have no idea why they chose to use the custom name instead of including it under the standard name. Perhaps it breaks in some circumstances or perhaps it is just that CSS3 is not officially "standard" yet. I neither know nor care but roll on the introduction of the standard property.&lt;/p&gt;&#xD;
&#xD;
&lt;a name="vertical_floats"&gt;&lt;/a&gt;&#xD;
&lt;h2&gt;2. Vertical floats.&lt;/h2&gt;&#xD;
&#xD;
&lt;p&gt;Getting a piece of text or a div or a button to be positioned vertically in the centre of some other element (such as, say, the browser window) is inexplicably difficult. Typically any solution to this requires at least three elements where one should be sufficient (which is definitely a leak of the layout into the markup), taking the absolute size of one of them, and then finagling things probably by knowing the exact pixel size of the screen, the elements, or the text.&lt;/p&gt;&#xD;
&#xD;
&lt;a name="form_formatting"&gt;&lt;/a&gt;&#xD;
&lt;h2&gt;3. Formatting for forms.&lt;/h2&gt;&#xD;
&#xD;
&lt;p&gt;One of my tips for fixing all that irks with CSS would be to buy two or three of those books describing machiavellian ways to conspire against the deficiencies of CSS (anything with "hacks" or "tips" in the title) and then beat up the standard until the easiest approach to implementing everything in the book could be covered in a pamphlet.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;There are three ways to style forms with CSS.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;The first is to use a table. I don't know if you have spotted the flaw in this solution, but it's this: forms aren't tables and &lt;i&gt;excuse&lt;/i&gt; me but I think someone told us we werent supposed to be using the wretched things in the first place.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;The second is to put the labels and the blocks onto different rows. That doesn't look too awful, but it's not very flexible.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;The third requires you to know exactly what the maximum width of things will be and then specify everything in terms of absolute positioning or pixel sizes or something. Which obviously doesn't work if you're building anything that has dynamically generated field labels such as, for example, internationalized content. Sometimes I wonder if the CSS designers ever actually built dynamic websites for a living or if they were only ever in charge of static content.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Oh, there's a fourth way of course, which is to just accumulate the form elements in any old order, or bung a line break in, or - all sorts of things. But they either look rubbish or they require you to add elements to the document for styling in which case stuff it, let's just use a damn table.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Perhaps there really is some marvellous way to do all this nicely and handle dynamic content properly, but if so it's not obvious and don't tell me it is because if the subject can generate 150 different articles describing completely different approaches to the same problem, then the "correct" solution isn't obvious and don't pretend otherwise!&lt;/p&gt;&#xD;
&#xD;
&lt;a name="floats_within_elements"&gt;&lt;/a&gt;&#xD;
&lt;h2&gt;4. Floats within elements.&lt;/h2&gt;&#xD;
&#xD;
&lt;p&gt;I know you can float things within elements, but the results are never quite what you expect. The most irritating side effect is that the element suddenly decides that it has no other relationship with its daughter element and inconveniently resizes itself. I want a simple mechanism to say "float over there, but you still dictate the minimum height of the line you're on" withouth my having to tell the parent that in pixels or something.&#xD;
&#xD;
&lt;p&gt;I kind of hope this is one of the ones where I'm just ignorant of the nice simple solution.&lt;/p&gt;&#xD;
&#xD;
&lt;a name="graphical_buttons"&gt;&lt;/a&gt;&#xD;
&lt;h2&gt;5. Graphical Buttons.&lt;/h2&gt;&#xD;
&#xD;
&lt;p&gt;Why on earth do we have to do Javascript to use a bitmap as a button? Even Visual Basic knew that users wanted pretty buttons back in the late pleiocene. Ok, I personally hate graphical buttons in general, but it's not &lt;i&gt;that&lt;/i&gt; unreasonable.&lt;/p&gt;&#xD;
&#xD;
&lt;a name="column_support"&gt;&lt;/a&gt;&#xD;
&lt;h2&gt;6. Column support.&lt;/h2&gt;&#xD;
&#xD;
&lt;p&gt;Again there are a lot of smart hacks to get newspaper-style columns out of CSS and again they fail for a variety of reasons none of which are down to a lack of ingenuity on the part of their proponents. Can we just have a nice simple "display in columns" widget please? &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Yes, I know that's tricky for all sorts of reasons, but that means it's a good idea for you to standardize it so that we can all rely on a few browser-based implementations instead of requiring thousands of other people to reinvent a technology that was basically quite well thought out in 1455 by Johannes Gutenberg.&lt;/p&gt;&#xD;
&#xD;
&lt;a name="order_independence"&gt;&lt;/a&gt;&#xD;
&lt;h2&gt;7. Order independence.&lt;/h2&gt;&#xD;
&#xD;
&lt;p&gt;The order in which unrelated elements are placed within a document affects a lot of the results when that document is rendered with a particular style sheet. This just bugs me because it illustrates that there is still a significant relationship between the structure of the document and how it will actually be styled. Why, when writing my document, should I need to know that the sidebar for a page has to go after the menu for a page and not before? As far as the semantics of the text are concerned, the ordering is irrelevant!&lt;/p&gt;&#xD;
&#xD;
&lt;a name="width_on_inline_elements"&gt;&lt;/a&gt;&#xD;
&lt;h2&gt;8. Widths on inline elements.&lt;/h2&gt;&#xD;
&#xD;
&lt;p&gt;Sometimes, just for the hell of it, or for (surprise) formatting purposes, I would like to be able to dictate the width of an inline element. Why is that so wrong?&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;You know, instead of demanding that we have a use for every bloody feature before it's allowed to creep into the spec, why not just make everything as consistent as possible? It will make it easier to implement, trust me. If block level elements have widths and there's no conspicuous reason why inline elements can't (note - no moral judgement required) have them slap it on. Pretty please?&lt;/p&gt;&#xD;
&#xD;
&lt;a name="addressing_text"&gt;&lt;/a&gt;&#xD;
&lt;h2&gt;9. Addressing text within textareas (and other elements).&lt;/h2&gt;&#xD;
&#xD;
&lt;p&gt;A personal bugbear this. Go and take a look at those whizzy Javascript plugins that turn a textarea into a syntax highlighting editor. Lovely isn't it. How does it work? Well, it takes the textarea, deletes it from the document, and substitutes in an IFRAME containing a document to which markup is added, and then.... GAH! It's actually frightening that anyone got it to work at all (let alone &lt;i&gt;well&lt;/i&gt;) given the appalling kludgy nature of the hack required.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Just give us a way to say "make line seven of this green on black from the 9th character through to the 15th" and while we're at it let's have some mechanism in the DOM for figuring out the cursor position in a textarea that &lt;i&gt;doesn't&lt;/i&gt; require us to know the number of characters, the number of line breaks, the font metrics, and do a sum. Is that too much to ask?&lt;/p&gt;&#xD;
&#xD;
&lt;a name="omg_ponies"&gt;&lt;/a&gt;&#xD;
&lt;h2&gt;10. A pony.&lt;/h2&gt;&#xD;
&#xD;
&lt;p&gt;So here's the philosophy behind all this whining. Unlike most "web designers" I expect the contents of a web site to be dynamic content instead of arbitrarily pre-determined text, and I expect them to degrade completely gracefully when Javascript is turned off. Seriously, all of the above derive from that expectation. If I give up those expectations I can solve all my problems with the hacks available - but I can also go back to using tables, and frankly that is a much more attractive proposition.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Oh and while I'm complaining, can someone make an HTML form file upload capability that doesn't look like it escaped from a Borland Turbo Jaquard Loom application circa 1645 ?&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Ok, I'm done and I promise that I'm going to have a lie down for a bit now. Complaints and "oh it's so easy you dumbass all you do is..." to &lt;a href="mailto:dave@paperstack.com"&gt;dave@paperstack.com&lt;/a&gt;&lt;/p&gt;</content:encoded>
      <pubDate>Mon, 04 Aug 2008 10:50:59 GMT</pubDate>
      <guid>http://geeklondon.com/blog/view/float_like_a_wasp</guid>
      <dc:date>2008-08-04T10:50:59Z</dc:date>
    </item>
    <item>
      <title>They are not all taken</title>
      <link>http://geeklondon.com/blog/view/legerdomain</link>
      <content:encoded>&lt;p&gt;Who says there are no good domain names left?&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
dcminter@treacle:~$ whois -H deathbyfruitcake.com&#xD;
&#xD;
Whois Server Version 2.0&#xD;
&#xD;
Domain names in the .com and .net domains can now be registered&#xD;
with many different competing registrars. Go to http://www.internic.net&#xD;
for detailed information.&#xD;
&#xD;
No match for "DEATHBYFRUITCAKE.COM".&#xD;
&gt;&gt;&gt; Last update of whois database: Wed, 16 Jul 2008 12:41:57 EDT &lt;&lt;&lt;&#xD;
&#xD;
NOTICE: The expiration date displayed in this record is the date the&#xD;
registrar's sponsorship of the domain name registration in the registry is&#xD;
currently set to expire. This date does not necessarily reflect the expiration&#xD;
date of the domain name registrant's agreement with the sponsoring&#xD;
registrar.  Users may consult the sponsoring registrar's Whois database to&#xD;
view the registrar's reported date of expiration for this registration.&#xD;
&#xD;
&#xD;
The Registry database contains ONLY .COM, .NET, .EDU domains and&#xD;
Registrars.&#xD;
&#xD;
dcminter@treacle:~$&#xD;
&lt;/pre&gt;</content:encoded>
      <pubDate>Wed, 16 Jul 2008 16:45:19 GMT</pubDate>
      <guid>http://geeklondon.com/blog/view/legerdomain</guid>
      <dc:date>2008-07-16T16:45:19Z</dc:date>
    </item>
    <item>
      <title>Platforms</title>
      <link>http://geeklondon.com/blog/view/far-far-beta-thing</link>
      <content:encoded>&lt;p&gt;In &lt;a href="http://blog.pmarca.com/2007/09/the-three-kinds.html"&gt;a post from 2007&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Marc_Andreessen"&gt;Marc Andreessen&lt;/a&gt; discusses types of internet platform. The post is particularly interesting for me, because I'm currently building what he describes as a "Level 3" platform.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Marc is correct when he describes a Level 3 platform as being "much harder to build than Level 2 platforms". He goes on to say that:&lt;/p&gt;&#xD;
&#xD;
&lt;blockquote&gt;&lt;i&gt;As a platform provider, once you accept the idea that user code -- code that you didn't write and you can't vet for quality or security -- is going to run within your platform, you have a whole pile of issues you have to deal with that a Level 2 platform can simply ignore.&lt;/i&gt;&lt;/blockquote&gt;&#xD;
&#xD;
&lt;p&gt;This is all true. That's not surprising, because he has &lt;a href="http://www.ning.com/"&gt;built a platform of his own&lt;/a&gt; and anyway he's one of the real greats of software development. What he doesn't mention, however, is that building a Level 3 platform is a lot more &lt;b&gt;fun&lt;/b&gt; than the other sorts.&lt;/p&gt; &#xD;
&#xD;
&lt;p&gt;While building my platform has certainly turned up a lot of difficult problems, each of those problems has been really interesting to solve. Even testing the platform is kind of fun because I get to put together little applications in a completely different environment from the one I normally work in.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;After the best part of a year's effort I have now reached the point in its development where I'm talking to a graphic designer to make it look beautiful - never underestimate the value of first impressions - and I will be launching to a limited Beta audience fairly soon. Watch this space...&lt;/p&gt;</content:encoded>
      <pubDate>Mon, 14 Jul 2008 12:31:37 GMT</pubDate>
      <guid>http://geeklondon.com/blog/view/far-far-beta-thing</guid>
      <dc:date>2008-07-14T12:31:37Z</dc:date>
    </item>
    <item>
      <title>User Generated Discontent</title>
      <link>http://geeklondon.com/blog/view/community-spit</link>
      <content:encoded>&lt;p&gt;I had an email earlier from an IT recruitment agency asking for advice on "redesigning and rearchitecting our web site." This was not a personal request; it was a questionnaire that looks like it was sent to all the contacts in their database. I find mailshots from agencies that are not specific to particular jobs annoying - and actually I get a lot of mailshots from agencies that are so wide of the mark that I instantly add them to my "Do Not Contact" list and the email blacklist.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;What bugs me about this particular email is not so much that it is spam. I presumably have contacted these people in the past about some job or other, so we have the obligatory "business relationship." No, it is the slightly misguided "crappy website in the making" nature of the questions that makes me want to address it.&#xD;
&#xD;
&lt;p&gt;Everyone thinks their website is going to gleam when in fact it will just glisten briefly until the dust sticks to it. Still, everyone loves pontificating on questionnaires, so here are my thoughts out in the open. This way literally people (rather than person) get the benefits of my "wisdom."&lt;/p&gt;&#xD;
&#xD;
&lt;blockquote&gt;&#xD;
&lt;b&gt;What in your opinion makes a good recruitment web site?&lt;/b&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&#xD;
&lt;p&gt;Search. It is all about search. And, duh, the jobs. If you haven't got all the jobs, I'm not interested. When I'm looking for contract work I use one of the big job specific search engines. I only visit your site if the information I need is not in the advert - in which case you should have put it there.&lt;/p&gt;&#xD;
&#xD;
&lt;blockquote&gt;&#xD;
&lt;b&gt;What persuades you to use/visit a website?&lt;/b&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&#xD;
&lt;p&gt;Content. Content. Content!&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;If you haven't got content that is interesting to me, then I won't visit you. Jobs aren't sufficient - I can get those from all of your competitors or aggregated on JobServe and the like. If you want to get, and keep, my attention you need lots of high quality content on subjects that I am interested in.&lt;/p&gt;&#xD;
&#xD;
&lt;blockquote&gt;&#xD;
&lt;b&gt;If the web site had a blog feature would you read it?&lt;/b&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&#xD;
&lt;blockquote&gt;&#xD;
&lt;b&gt;Would you contribute to it?&lt;/b&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&#xD;
&lt;p&gt;These two questions together are just astonishingly clueless.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;No. The fact that you are asking if &lt;b&gt;I&lt;/b&gt; would contribute to &lt;b&gt;your&lt;/b&gt; blog suggests a fundamental misconception of how blogs work. People write blogs for a variety of reasons, but in order to get people to visit your website isn't one of them. Why would I use your blog software to write my blog? Here's why I might:&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;i&gt;Because I like your blog software.&lt;/i&gt; Not going to happen. You are a recruitment agency. Why would your software be better than, say, the software provided by a &lt;a href="http://blogger.com/"&gt;Blogging&lt;/a&gt; &lt;a href="http://typepad.com/"&gt;Software&lt;/a&gt; &lt;a href="http://wordpress.org/"&gt;Company&lt;/a&gt; ?&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;i&gt;Because I like your site.&lt;/i&gt; You are going to have to offer me something that I can get an emotional attachment to before I will think about doing free work to promote your company. Communities require community participation. You can't bootstrap that without giving away something that the community wants.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;i&gt;Because the content is good and I want to be associated with that.&lt;/i&gt; This could work, but if you are asking me to write content for you, you are clearly not planning to provide the content yourself. So we have a bootstrap issue. Who exactly is the first blogger comparing themselves to?&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;i&gt;Because I don't have a blog and this is as good as any.&lt;/i&gt; Ok, firstly see the earlier point about the software - still, you could install wordpress and have something adequate, so why not? Well, the good bloggers are already taken. So you are looking for the guys who are technical, literate, competent, don't have a blog, but want one. That sounds like slim pickings to me. The non-technical illiterate incompetents aren't going to reflect well on your company.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;i&gt;Because we are going to aggregate your blog into our site.&lt;/i&gt; Well and good, but the way you ask the question doesn't suggest that. If you do, though, you will have to go and find the good bloggers in order to keep the quality and throughput high. Worse, if I am reasonably au fait with the industry I will already be subscribed to the good ones, so I will see a lot of redundant content in your aggreblog. The guys who are not au fait with the industry? Well, are you sure you want to be selling those guys to your clients?&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;So. If you want a decent blog, you're going to have to write it yourself. That means you have to hire an interesting writer to produce content. If you publish press releases disguised as blog entries, nobody will read them. If you publish adverts disguised as product reviews, nobody will read them.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;The best advice I can give you is to hire someone who already writes an interesting and well subscribed blog and bribe them to divert some of their content exclusively to your website. I'll bet you a dollar you don't do this though.&lt;/p&gt;&#xD;
&#xD;
&lt;blockquote&gt;&#xD;
&lt;b&gt;What features of recruitment web sites do you dislike?&lt;/b&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&#xD;
&lt;p&gt;Well, I certainly never apply for jobs where I am required to provide all my details through the agency website. I have a &lt;abbr title="Curriculum Vitae (the British term for a Resume)"&gt;CV&lt;/abbr&gt;, and I will submit that or nothing.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Other than that, unless I'm actually on contract through you, your website is somewhere I visit as a desperate last measure.&lt;/p&gt;&#xD;
&#xD;
&lt;blockquote&gt;&#xD;
&lt;b&gt;Is there anything that you would like to see on the site?&lt;/b&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&#xD;
&lt;p&gt;Content. Content. Content.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Competently written articles about running a small business. Technical articles. Articles about managing your finances as a contractor. Articles about issues related to IR35. Articles about ethical issues. Articles about the professional organisations open to us. As soon as you post a single boring article that is obviously paid for by an advertiser, however, you lose all your credibility. Don't even think about doing that.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Forums with interesting, eloquent posts about topics that relate to me. Discussion forums about the articles. Long rambling threads about dreadful mistakes we made earlier in our careers. All managed with a deft hand of moderation so that off-topic discussions abound but illiterate or offensive tirades do not.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Frankly, if you want to create a community, it's going to be a lot of work. In my opinion it will be worth it, but I have serious doubts that you're prepared to invest the kind of time and effort that is required. But then, if you don't put that kind of effort in the people arriving at your website will tend to be there through serendipity or misfortune.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Take my advice or leave it. Hey, I publish my blog in black text on a blue-grey background; what do I know? Still, please don't produce another cookie-cutter "community" website with five contributors and three readers (one of whom is staff) and kid yourselves that it's what you wanted.&lt;/p&gt;</content:encoded>
      <pubDate>Thu, 03 Jul 2008 13:49:06 GMT</pubDate>
      <guid>http://geeklondon.com/blog/view/community-spit</guid>
      <dc:date>2008-07-03T13:49:06Z</dc:date>
    </item>
    <item>
      <title>Linux Offline</title>
      <link>http://geeklondon.com/blog/view/very-quick-fix</link>
      <content:encoded>&lt;p&gt;&lt;a href="http://www.kubuntu.org/"&gt;Kubuntu&lt;/a&gt; Linux is my main development platform at the moment as I work on &lt;a href="http://chromeserver.com/"&gt;El Project&lt;/a&gt;. Occasionally I get caught out by unexpected behaviour. The other day I was trying to demo part of the project to a friend and everything failed quite incomprehensibly (note: don't do project demos in the pub unless it's &lt;i&gt;before&lt;/i&gt; you've had lots of beer).&lt;p&gt;&#xD;
&#xD;
&lt;p&gt;My development environment requires the laptop to play the role of multiple different servers. To facilitate this it has a bunch of entries in the &lt;span class="code"&gt;/etc/hosts&lt;/span&gt; file to loopback what would be real web addresses to &lt;span class="code"&gt;127.0.0.1&lt;/span&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Rather surprisingly the default behaviour in Kubuntu is to resolve IP addresses from the hosts file &lt;i&gt;unless&lt;/i&gt; you're in offline mode, at which point it tries (and obviously fails) to get them via a DNS lookup. Hmm.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;The solution it turns out is to amend the &lt;span class="code"&gt;/etc/host&lt;b&gt;.conf&lt;/b&gt;&lt;/span&gt; file. Before:&lt;/p&gt;&#xD;
&#xD;
&lt;blockquote&gt;&#xD;
&lt;pre&gt;&#xD;
multi off&#xD;
&lt;/pre&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&#xD;
&lt;p&gt;After:&lt;/p&gt;&#xD;
&#xD;
&lt;blockquote&gt;&#xD;
&lt;pre&gt;&#xD;
multi on&#xD;
&lt;/pre&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&#xD;
&lt;p&gt;That was relatively painless. If only I could stop Firefox from &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=339814 "&gt;going into offline mode&lt;/a&gt; whenever KNetworkManager drops the Wireless connection I'd be all set (I &lt;i&gt;hate&lt;/i&gt; it when applications sneak to each other about the network state).&lt;/p&gt;</content:encoded>
      <pubDate>Sat, 14 Jun 2008 15:24:32 GMT</pubDate>
      <guid>http://geeklondon.com/blog/view/very-quick-fix</guid>
      <dc:date>2008-06-14T15:24:32Z</dc:date>
    </item>
    <item>
      <title>Hibernate setParameter versus setEntity</title>
      <link>http://geeklondon.com/blog/view/mystic-runes</link>
      <content:encoded>&lt;p&gt;Here's an odd one. &lt;strike&gt;I must investigate and find out what's really going on. I don't even pretend to understand this bug!&lt;/strike&gt; &lt;i&gt;&lt;b&gt;See updates at end&lt;/b&gt;&lt;/i&gt;. Unfortunately this doesn't fail in my unit tests (against HSQL DB rather than PostgreSQL) and similar code elsewhere in my app doesn't fail either, so I can't build a &lt;a href="http://sscce.org/"&gt;SSCCE&lt;/a&gt;.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;I retrieve a &lt;span class="code"&gt;User&lt;/span&gt; entity and use it in a named query. The query is being created as a Spring &lt;span class="code"&gt;HibernateCallback&lt;/span&gt; within a Sring Hibernate template &lt;span class="code"&gt;executeWithNativeSession()&lt;/span&gt; method, so although I'm in a Spring environment it &lt;i&gt;ought&lt;/i&gt; not to be affecting the behaviour.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;The &lt;span class="code"&gt;User&lt;/span&gt; entity is not null, and I am constructing a &lt;span class="code"&gt;Query&lt;/span&gt; object from the string &lt;span class="code"&gt;from Quota where user = :user&lt;/span&gt; (a static final constant to the &lt;span class="code"&gt;Quota&lt;/span&gt; class). I've checked and it's an authentic Hibernate &lt;span class="code"&gt;QueryImpl&lt;/span&gt; object, incidentally.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;The original (broken) code which does not work:&lt;/p&gt;&#xD;
&lt;blockquote&gt;&#xD;
&lt;pre class="code"&gt;&#xD;
&lt;span class="keyword"&gt;final&lt;/span&gt; Query quotaQuery = session.getNamedQuery(Quota.&lt;span class="literal"&gt;FIND_QUOTA_BY_USER&lt;/span&gt;);&#xD;
&lt;b&gt;quotaQuery.setParameter(&lt;span class="literal"&gt;"user"&lt;/span&gt;, user);&lt;/b&gt;&#xD;
log.info(&lt;span class="literal"&gt;"Executing: "&lt;/span&gt; + quotaQuery);&#xD;
&lt;span class="keyword"&gt;final&lt;/span&gt; Quota quota = (Quota)quotaQuery.uniqueResult();&#xD;
&lt;/pre&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;Here's the failure in the logs:&lt;/p&gt;&#xD;
&lt;blockquote&gt;&#xD;
&lt;pre class="code"&gt;&#xD;
INFO: Executing: QueryImpl(from Quota where user = :user)&#xD;
13-Jun-2008 15:52:27 org.hibernate.util.JDBCExceptionReporter logExceptions&#xD;
WARNING: SQL Error: 0, SQLState: 22023&#xD;
13-Jun-2008 15:52:27 org.hibernate.util.JDBCExceptionReporter logExceptions&#xD;
&lt;b&gt;SEVERE: No value specified for parameter 1.&lt;/b&gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;That's followed by the usual stack trace dumped by the JDBC driver. The replacement code which does work is:&lt;/p&gt;&#xD;
&lt;blockquote&gt;&#xD;
&lt;pre class="code"&gt;&#xD;
&lt;span class="keyword"&gt;final&lt;/span&gt; Query quotaQuery = session.getNamedQuery(Quota.&lt;span class="literal"&gt;FIND_QUOTA_BY_USER&lt;/span&gt;);&#xD;
&lt;b&gt;quotaQuery.setEntity(&lt;span class="literal"&gt;"user"&lt;/span&gt;, user);&lt;/b&gt;&#xD;
log.info(&lt;span class="literal"&gt;"Executing: "&lt;/span&gt; + quotaQuery);&#xD;
&lt;span class="keyword"&gt;final&lt;/span&gt; Quota quota = (Quota)quotaQuery.uniqueResult();&#xD;
&lt;/pre&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;I'm baffled. I know calling &lt;span class="code"&gt;setParameter&lt;/span&gt; can cause problems where null values are involved, but I thought that as long as the type was compatible with the HQL parameter there weren't any other issues. Even assuming that there are other issues I don't follow why it works ok in my unit tests against HQL, but not in the development environment against PostgreSQL and works elsewhere in my code with very similar queries.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Odds are that I'm misunderstanding a subtlety of &lt;a href="http://www.hibernate.org/hib_docs/v3/api/org/hibernate/Query.html#setParameter(java.lang.String,%20java.lang.Object)"&gt;&lt;span class="code"&gt;setParameter&lt;/span&gt;&lt;/a&gt; versus &lt;a href="http://www.hibernate.org/hib_docs/v3/api/org/hibernate/Query.html#setEntity(java.lang.String,%20java.lang.Object)"&gt;&lt;span class="code"&gt;setEntity&lt;/span&gt;&lt;/a&gt; (their entries in the Hibernate API documentation are virtually identical), but I think in future I will consider &lt;span class="code"&gt;setParameter&lt;/span&gt; to be bad practice and try to use the type specific set methods at least until such time as I figure out exactly what is failing here!&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;For now, file under "voodoo fixes" as I really don't understand &lt;i&gt;why&lt;/i&gt; this has resolved the problem. I'll post an update if I get time to investigate this properly.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;i&gt;&lt;b&gt;Update 1:&lt;/b&gt;&lt;/i&gt; The following approach works OK too, so it looks like it may be some kind of bug in the type inference used by the two argument &lt;span class="code"&gt;setParameter&lt;/span&gt; method; that or my query type really isn't as unambiguous as I thought:&lt;/p&gt;&#xD;
&lt;blockquote&gt;&#xD;
&lt;pre class="code"&gt;&#xD;
&lt;b&gt;&lt;span class="keyword"&gt;final&lt;/span&gt; Type type = Hibernate.entity(User.class);&#xD;
quotaQuery.setParameter(&lt;span class="literal"&gt;"user"&lt;/span&gt;, user, type);&lt;/b&gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;&lt;i&gt;&lt;b&gt;Update 2:&lt;/b&gt;&lt;/i&gt; I understand the basis of this now. The problem is indeed with the type inference process. The heuristic first looks up the query to see what type it is expecting - in this case it's expecting not a &lt;span class="code"&gt;User&lt;/span&gt;, but a &lt;span class="code"&gt;org.hibernate.type.OneToOneType&lt;/span&gt; representing the &lt;span class="code"&gt;Quota&lt;/span&gt; class's association with the &lt;span class="code"&gt;User&lt;/span&gt; type. By default, if you don't ask for a specific type, this is what it will use.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Unfortunately because I loaded User via a query earlier on, this is actually a proxy that has the &lt;span class="code"&gt;ManyToOneType&lt;/span&gt; (it was loaded via a many-to-one association with another entity). So at this point the types are incompatible.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;The reason the two argument &lt;span class="code"&gt;setParameter&lt;/span&gt; approach was working elsewhere is that in those cases the query parameter type was a &lt;span class="code"&gt;ManyToOneType&lt;/span&gt; already, so they were compatible, or in the case of the unit tests the entity wasn't a proxy in the first place. I'm a little surprised that Hibernate can't spot that the association-wrapped proxy entity is actually compatible in these circumstances, but this does seem to be the issue.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;The other problem of course is that instead of throwing a suitable type incompatibility exception the parameter is simply not passed on to the query. Oops. That seems quite naughty. Perhaps it's excusable on performance grounds. Do we want the type checking in a potentially performance sensitive spot? Or perhaps it's a simple oversight. It definitely is the origin of the problem though; the following abomination produces the same error with no type-related exceptions:&lt;/p&gt;&#xD;
&lt;blockquote&gt;&#xD;
&lt;pre class="code"&gt;&#xD;
quotaQuery.setParameter(&lt;span class="literal"&gt;"user"&lt;/span&gt;, user, &#xD;
   &lt;span class="operator"&gt;new&lt;/span&gt; OneToOneType(&#xD;
      &lt;span class="literal"&gt;"com.fatmoggy.users.User"&lt;/span&gt;,&#xD;
      ForeignKeyDirection.FOREIGN_KEY_TO_PARENT,&#xD;
      &lt;span class="literal"&gt;"id"&lt;/span&gt;,&#xD;
      &lt;span class="literal"&gt;false&lt;/span&gt;,&#xD;
      &lt;span class="literal"&gt;false&lt;/span&gt;,&#xD;
      &lt;span class="literal"&gt;false&lt;/span&gt;,&#xD;
      &lt;span class="literal"&gt;"com.fatmoggy.users.Quota"&lt;/span&gt;,&#xD;
      &lt;span class="literal"&gt;null&lt;/span&gt;));&#xD;
&lt;/pre&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;Whereas this (equally abominable) one works just dandy:&lt;/p&gt;&#xD;
&lt;blockquote&gt;&#xD;
&lt;pre class="code"&gt;&#xD;
quotaQuery.setParameter(&lt;span class="literal"&gt;"user"&lt;/span&gt;, user, &lt;span class="operator"&gt;new&lt;/span&gt; ManyToOneType(&lt;span class="literal"&gt;"com.fatmoggy.users.User"&lt;/span&gt;));&#xD;
&lt;/pre&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;Note that if I try to do something more conspicuously stupid such as casting to a primitive type, the cast will be carried out explicitly and so we'll get a type related error after all. I.e. this will produce the expected ClassCastException:&lt;/p&gt;&#xD;
&lt;blockquote&gt;&#xD;
&lt;pre class="code"&gt;&#xD;
quotaQuery.setParameter(&lt;span class="literal"&gt;"user"&lt;/span&gt;, user, Hibernate.STRING_TYPE); &lt;span class="comment"&gt;// Fails "cleanly" with a class cast exception.&lt;/span&gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;Happily the solution is simple. Always specify the type, either by calling the three argument &lt;span class="code"&gt;setParameter&lt;/span&gt; method, or by calling the type-specific set method (such as &lt;span class="code"&gt;setEntity&lt;/span&gt;) on the query object.&lt;/p&gt;</content:encoded>
      <pubDate>Fri, 13 Jun 2008 15:17:27 GMT</pubDate>
      <guid>http://geeklondon.com/blog/view/mystic-runes</guid>
      <dc:date>2008-06-13T15:17:27Z</dc:date>
    </item>
    <item>
      <title>Reuben Harris</title>
      <link>http://geeklondon.com/blog/view/malice</link>
      <content:encoded>&lt;p&gt;Someone is trying to blacken the name of an acquaintance of mine, Reuben Harris. I have every reason to believe that these claims are completely untrue. If you are told something unpleasant about him and I am mentioned as corroborating the story in some way, then the story is both inaccurate and malicious.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;If you read something online apparently &lt;i&gt;by&lt;/i&gt; Reuben admitting to anything similarly unpleasant, then this is certainly someone impersonating him. His Hotmail and GMail accounts at a minimum have been compromised. Please ignore any such messages.&lt;/p&gt;</content:encoded>
      <pubDate>Mon, 26 May 2008 13:25:23 GMT</pubDate>
      <guid>http://geeklondon.com/blog/view/malice</guid>
      <dc:date>2008-05-26T13:25:23Z</dc:date>
    </item>
    <item>
      <title>Profanity Filler</title>
      <link>http://geeklondon.com/blog/view/buttbuttination</link>
      <content:encoded>&lt;p&gt;Thanks to &lt;a href="http://forum.java.sun.com/thread.jspa?threadID=5297783#10260588"&gt;a thread on the Sun Java Forums&lt;/a&gt; I discovered the joy of a new word coined in the white heat of badly constructed software. The word is &lt;a href="http://www.google.com/search?q=clbuttic"&gt;clbuttic&lt;/a&gt; and it's what happens when an excessively prim automated censor has absolutely no sense of context. In America, you see, "ass" is a naughty word. But me no butts.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Of course as soon as I found out about this the inevitable reaction was to see how many equivalents I could find. Once I'd discovered a few, I had to call in &lt;a href="http://www.interact-sw.co.uk/iangblog/"&gt;my fellow researcher Ian&lt;/a&gt; just so I could accuse him of being a &lt;a href="http://www.google.com/search?q=buttembly+language"&gt;buttembly language&lt;/a&gt; programmer.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Between us we discovered the secrets of the &lt;a href="http://www.google.com/search?q=U.N.+General+buttembly"&gt;U.N. General Buttembly&lt;/a&gt; and other such &lt;a href="http://www.google.com/search?q=hbuttles"&gt;hbuttles&lt;/a&gt;. Personally I'm concerned by the existence of &lt;a href="http://www.google.com/search?q=mbutt+hypnotists"&gt;mbutt hypnotists&lt;/a&gt; almost as much as the notions of &lt;a href="http://www.google.com/search?q=%22holy+mbutt%22"&gt;holy mbutt&lt;/a&gt; and &lt;a href="http://www.google.com/search?q=clbutt+war"&gt;clbutt war&lt;/a&gt;.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;The idea of &lt;a href="http://www.google.com/search?q=buttisted+suicide"&gt;buttisted suicide&lt;/a&gt; is fairly alarming, but not perhaps so much as the observation that &lt;a href="http://www.google.com/search?q=china+buttails+australia"&gt;China buttails Australia&lt;/a&gt;.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;I think that &lt;a href="http://www.google.com/search?q=buttume"&gt;buttume&lt;/a&gt; sounds kind of cancerous, but Ian thinks it's probably some sort of unpleasant perfume. Either way I think I'll decline to sample the &lt;a href="http://www.google.com/search?q=cbutterole"&gt;cbutterole&lt;/a&gt;.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Other "found" phrases include:&lt;/p&gt;&#xD;
&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;"You know what they say about buttuming?" [Er... no, actually...] &lt;/li&gt;&#xD;
&lt;li&gt;"When you buttume you make an BUTT out of U and ME" [Ahhh!]&lt;/li&gt;&#xD;
&lt;li&gt;"Disbuttembly of the proprietary OS is buttumed legal here" [But possibly not in Texas]&lt;/li&gt;&#xD;
&lt;li&gt;"My unbuttisted birthing positions"&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&#xD;
&lt;p&gt;It has not been a productive evening.&lt;/p&gt;</content:encoded>
      <pubDate>Tue, 20 May 2008 23:04:59 GMT</pubDate>
      <guid>http://geeklondon.com/blog/view/buttbuttination</guid>
      <dc:date>2008-05-20T23:04:59Z</dc:date>
    </item>
  </channel>
</rss>

