February 27, 2005

Deep linking to Vodafone content

VodatrainThe other day I wanted to check train times on my mobile (which is the "killer app" for WAP/Web on my mobile phone, it sucks too badly for anything other than this, because of the low speed and the screen size).

I have a bookmark to the "My Trains" page of Vodafone Live! which currently links to http://vodafonelive.mytrains.kizoom.co.uk/index#main. At the time, this link resulted in a 404 Not Found error. Cue much cursing and swearing: finding the particular deep link you need on the Vodafone Live! site is a combination of horrific price gouging (as Vodafone force large unnecessary images down your throat in order to make a quick buck on GPRS charges) and the need for endless patience (as you work through the unintuitive menu screens which are only usable once all the images have loaded).

I saved a bookmark to the new train times page, which has the delightful URL of http://live.vodafone.com/idserver/dserver/!?url=http%3A%2F%2Fvirtual-cae%3A8224%2Fcae%2F3pi_wrappedML%2Fdisplay.do%3FnodeName%3Dcon08_findandseek_travel_liveinfo,4kdf5yV5vM.

Someone at Vodafone needs to do a bit of reading up on the basics of web application design. Firstly, Cool URIs don't change. I should never EVER see a 404 on a service such as this. Each 404 is a reason for me to stop using the Vodafone Live! service on my mobile phone, and is therefore a direct hit on Vodafone's profitability (if you multiply it either by the number of annoyed potential users of the service or the amount I personally spend on my mobile... )

Secondly, that URL needlessly tells us a bit about how their back-end application is working. It looks to me like a chunk of their back-end content is stored in XML and they are passing in the node to load (a reference to a bit of XML) via the URL. Ugly and IMHO destined to break in the future because of the implied tight contract between the URLs and the XML file structure. Of course, the URL could actually belie a truly elegant and well-architected back-end system. But if the people that design their back-end systems also design their URLs, I'm not holding my breath.

Thirdly, when every bit counts, a 170+ character URL hurts (especially if you think a URL like that will probably be loaded for every page you view). If I was being pessimistic, I'd say the maximum URL length for the first page would be 50 characters - e.g. http://live.vodafone.com/trains/?sessioncookiehash. And that's assuming they couldn't drop 'live' and shorten 'vodafone' and that you have to store the cookie reference in the URL (I can't recall if WAP supports cookies, and I'm not assuming they will risk storing a session reference based on your mobile phone connection). On an average use, I reckon there's about 6 hits to the server to get the information you want. That's 1020 characters the old way or 300 characters the new way ... a difference of 720 characters. Quite a bit of overhead on just the URLs alone. Remember, this is on a slow GPRS link where you're lucky to get 3000 of those characters a second on a download. You want to save some of that space for useful information ...

So what about the alternatives? Well, National Rail Enquiries mobile phone information refers to a branded version of the original kizoom service that Vodafone offered. The URL of the first page? http://wap.nationalrail.co.uk/bm/ followed by a string of 15 alphanumeric characters which I assume is a hash referring to my mobile phone number and my phone type. And the URL of the timetable lookup page? http://wap.nationalrail.co.uk/keep_history_consent?a=prompt&consent=true&js=AbCdEfghiJKlmN1O&seq=1&sid=45_1234567#main ... at 118 characters, it looks like they are trying to emulate Vodafone's "best practice".

Posted by savs at 10:27 AM

February 26, 2005

links for 2005-02-26

Posted by delicious at 10:20 PM

Badminton

14-7 14-7 16-14 to me.
Previous games here and here.
Posted by savs at 9:37 AM | Comments (1)

February 24, 2005

Cambridge

Soggy SpiresI'm in Cambridge for the OSS Watch Advisory Committee meeting. A Cambridge venue (CARET, to be precise) is a distinct bonus for me as it's just an hour down the road from Norwich, meaning I can travel at a humane time of day.

It's been a while since I've been to Cambridge, so I took some time to walk about a bit. It feels like the whole city has turned into a building site: the work to replace John Lewis with an arcade seems to have consumed a big chunk of the centre.

The Advisory Committee meeting was very interesting (a fair bit in a "gossip I can't repeat here" kind of way). It's always refreshing to be in a room full of people that are clued up on the whole Open Source thing, and good to know that OSS Watch are doing well at spreading the word and providing common-sense neutral advice about FLOSS. I was quite wary of them at the start of their tenure, but they really seem to have hit their stride.

Perhaps the biggest surprise for me today was Brian Kelly bringing up the subject of podcasting. I'm used to him being ahead of the curve when it comes to all things web (he was going to W3C conferences when I was just starting out as a webmaster). I've only really become a podcast fan in the last four months, and I consider myself an avid RSS consumer. So hearing it brought up in a meeting of information technology aficionados was ... well, cool.

Brian cited an Auricle podcast he'd participated in the other day, using Skype. His idea was that a series of short podcasts about FLOSS and general web manager stuff could be done. I'd not really thought about how podcasts could be used this way, but it makes sense. What better way to get up to speed on the tech issues of the day than wired through your headphones on the daily commute?

There was also quite a lot of discussion about Skype, which seems to be the bad boy of VOIP due to the way it utilises the network. Apparently several academic institutions are banning it. I'm happy with sacrificing the network to do away with firewall issues and to have audio conferencing with more than one other party, but I'm not a network administrator. I just hope UEA isn't one of the institutions banning it, since our office connection piggybacks off them.

Several other topics came up, which I'll write about when I've digested them and when I've got a fast link to do a bit of research.

On that note ... I wish all meeting venues provided WiFi by default. I know there's a trade-off: with WiFi there's a temptation to be virtually absent from the meeting you're physically in, and it can turn into a collection of people sitting in a room staring at their laptops. But the benefits ... being able to check your facts before speaking, being able to email meeting members as you think of stuff... I just can't carry things around in my brain any more, and there's a limit to how much offline content I can keep on the laptop.

Cambridge Rail Station Coffee ShopI know I grumbled a bit about the state of "building site Cambridge", but there is one positive change to report: the train station now has a decent waiting room coffee shop. It's warm, it serves a passable cup of tea and good blueberry muffins, and it's clean. WiFi would be nice, and a monitor showing train departure information, but this is a good start. It's certainly a leap ahead of Ely (Worst Coffee Shop Ever) and Peterborough (Most Boring Waiting Room Ever). It seems to be leased and run by AMT Coffee (Fair Trade too!), so let's hope they spread to a few more stations that I pass through.

Posted by savs at 4:54 PM | Comments (1)

February 23, 2005

links for 2005-02-23

Posted by delicious at 10:20 PM

Three for the price of two

The train to Norwich had engineering difficulties and was an hour late pulling in to Norwich. All taxi companies had closed because of a whole load of snow that fell in Norwich in that last hour of journey. Luckily we managed to get the last black cab out of the station.
I think it may be a slightly later than normal start in the morning.
zzzzzzzz

Posted by savs at 3:13 AM

Last train home

Laptop Ipod CokeI'm on the last train back to Norwich from London. It's been an interesting day: the bulk of it was a meeting with David and Jeremy, providing an opportunity to catch up, chew the fat, and discuss the future. High-bandwidth discussions, particularly about the crossover between Rails and Cocoon. More on that later.

Serendipitously, Paul was also in London for a Websphere developer conference, and so he joined David, Jeremy and I in the pub later along with Thom, for much beer and intense discussion.
I also got the opportunity this evening to catch up with some random chick (sic), whom I haven't seen for 10 years. That was cool (for want of a different word). She's over here monitoring training for her company. It was great to see her, though a shame it was at the end of a long day when I was suffering from brainache, with not enough words left in my head. But great to see her again, and it didn't really feel any different from a decade ago. There's a ton of stuff to discuss right there. Another day.
The last train home is a weird beast. I'm wrapped in my iPod cocoon, watching the people around me sleep off their busy day and/or alcoholic excess. Yes, that's you, Paul ;-) It's one of the things I love and hate about Norwich in equal measure: the distinct barrier between London (frenetic activity) and home (tranquility, security). Whilst I really appreciate the separation, I'd also welcome the opportunity to be instantly at home from time to time, without the two hours of decompression.
Anyway, time to thrash the last five minutes of life out of my mobile phone by uploading this.

Posted by savs at 12:41 AM

February 18, 2005

Network coverage

Yeah, I'm bored on the train and therefore blogging like crazy.
An interesting fact: I can now get from Norwich to March before my GPRS network connection drops. They've obviously GPRS-enabled more masts along the route, or installed a few new ones.
The only downside is my powerbook battery is not as effective as it used to be, and after one and a half hours of reading, blogging and GPRS, the battety is dead :-(

Posted by savs at 2:12 PM

Coincidence?

Sudden spate of blogging from me. Not enough network connectivity to play World of Warcraft. Coincidence????

Posted by savs at 1:40 PM

The joy of Vodafone

.... or, Ruby on Rails is soft pr0n?

Vodafone Content Control
Trying to access the Ruby On Rails wiki page on i18n, I got the above error. I've no idea why Vodafone are suddenly sending this again - I've turned off content control before.
If Vodafone are going to implement this sort of scheme, they could at least get it right. Their filtering is obviously a bit dumb (I can't think of any reason why that page would be blocked, other than maybe the '18' in the URL).
The whole feature seems like overkill (at least for GPRS). How many under-18s do you know that browse the web for dodgy content via their mobile phones?
Anyway, enough ranting here. I'm gonna go call Vodafone and rant at them until they reclaim the GPRS charges it cost me to unlock content control again.

Posted by savs at 1:40 PM

Gracefully downgrading

Question: does WebKit automatically downgrade graphics based on your connection speed?
I'm traveling this afternoon and catching up on my RSS subscriptions whilst chatting via GPRS. All the images that NetNewsWire is downloading appear to be low-quality jpgs ... where usually they would be normal quality. Is WebKit really that smart?

Posted by savs at 1:29 PM | Comments (2)

February 16, 2005

links for 2005-02-16

Posted by delicious at 10:19 PM

February 15, 2005

Conference calls

This morning I participated in a multinational conference call using Skype ... a good test to see how the technology works. Answer: it's almost there, but it's not quite ready for prime-time (or maybe we're not quite ready for it yet).
The good things: in contrast to conference calls using plain old telephones, I find setting up and instigating a skype conference call much easier. Select the menu item for start a conference call, pick the people you want to talk to, and dial. No need to remember the telephone number for the conferencing service, no need to pre-book a virtual conference room, no need to enter pass codes. You can also see who is available for the call in advance, and you can use instant messaging during the call - so no need to spell out those cumbersome URLs.
The downside: it seems not all Skype clients are equal. In this morning's call we had two Macs, two linux machines (I think), and one windows machine. The linux clients kept failing to connect. My Mac client required the occasional restart. You also really need the right gear - headsets with headphones and microphones are thoroughly recommended. You can just about make do with headphones and a laptop mic, but be prepared for a lot of noise from typing, and a deafening rumble when the laptop fan kicks in. It's all but unusable if you use laptop mic and speakers, as the feedback echoes mean you can only talk in short sentences.
If you take into account the new hardware requirements (which at £30 for a usable headset are not prohibitive), and are prepared for some weird bugs between platforms, Skype is a more than adequate alternative to traditional conferencing services. Given the price that companies like BT charge (we've spent hundreds of pounds on calls in the past), this is definitely a good thing.

Posted by savs at 9:41 AM

February 14, 2005

Wow indeed

Russ has an excellent write-up on the World of Warcraft experience.
I did indeed go buy it on Saturday after badminton, and I gotta say .... wow. It's with good reason it's also known as warcrack. I think I played for maybe 20 hours over the weekend, and I never play games for that long. Actually, I rarely play games - Half-Life 2 was the first I'd bought in about four years, and that took me about two months to get round to completing.
I've never been a fan of D&D but don't let that moniker fool you. This game is action, adventure, first-person beat 'em up, whatever - it crosses several genres and looks amazing. And as Russ mentions, the place is huge. HUGE. John has also been playing, and it took me an afternoon to cross from my part of the world to his (including taking an underground tram). And that represents a distance of less than one eighth of the map. Ouch.
The thing that gets me most is the interaction with other players. See someone getting beaten up? Help 'em out. Need more people in order to defeat the bad guys? Form a group and act in unison. Get helped out whilst being beaten? Say thanks. Suddenly, you're playing and chatting and joking with people who could be on the other side of Europe. Incredible. Of course, the fact that it's real people in there does lead to some quirky issues - like late on Saturday night (well, Sunday morning) half the characters in the game were stood around motionless. I guess their owners had fallen asleep.
Another nice thing: you can create lots of different characters and play as whichever one you want. I have two characters on the go at the moment (one of which is playing in a team with John), and it's quite good fun to see how your style has to change based on your character's type. You can't stealthily creep around when you're an 8 foot tall bull ;-)

Posted by savs at 8:57 AM

February 12, 2005

Badminton

Scores: 14-9, 14-6, 14-6 (first two games to John... ouch). We're either getting better or getting slower, as we didn't complete the last game - which I'm sure I would have won ;-)

Posted by savs at 10:03 AM

February 11, 2005

World of Warcraft

I'm not much of a fan of MMPORGs, but I think I will make an exception for World of Warcraft, which comes out today in the UK. Everyone that I've spoken to about it tells me it's rather good...

Posted by savs at 10:37 PM

February 10, 2005

links for 2005-02-10

Posted by delicious at 10:19 PM

February 9, 2005

February 8, 2005

MySQL makes me sick

Have I mentioned that working with MySQL makes me physically sick?
Apparently yes, I've mentioned it once or twice.
Today I have cause to reacquaint myself with it. I needed to get a database and user set up for a third-party piece of software I'm using. So as root I create a database called 'foo', and I create a user called 'bar' who will be working with said database.

CREATE DATABASE foo;
Query OK, 1 row affected (0.00 sec)
GRANT USAGE ON foo.* TO 'bar'@'localhost' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.00 sec)
FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

$ mysql -u bar -ppassword foo
ERROR 1044: Access denied for user: 'bar@localhost' to database 'foo'

$ mysql -h localhost -u bar -ppassword foo
ERROR 1044: Access denied for user: 'bar@localhost' to database 'foo'

Hah. hahahah. Ok.
Take two.

GRANT USAGE ON foo.* TO bar IDENTIFIED BY 'password';
FLUSH PRIVILEGES;

$ mysql -h localhost -u bar -ppassword foo
ERROR 1044: Access denied for user: 'bar@localhost' to database 'foo'

Hah.

GRANT ALL ON foo.* TO bar IDENTIFIED BY 'password';

$ mysql -h localhost -u bar -ppassword foo
ERROR 1044: Access denied for user: 'bar@localhost' to database 'foo'

GRANT ALL ON foo.* TO 'bar'@'localhost' IDENTIFIED BY 'password';

$ mysql -h localhost -u bar -ppassword foo
Welcome to the MySQL monitor. Commands end with ; or \g.

FINALLY.
I wonder what incredibly bright person thought "USAGE" was a good synonym for "user exists but can do absolutely nothing until you add lots of permissions"?
I've always hated the mysql permissions tables. I think I always will.

Posted by savs at 12:54 PM | Comments (2)

February 7, 2005

links for 2005-02-07

Posted by delicious at 10:18 PM

Exciting times in Luminas towers

Lots of good stuff going on here:

  • Jeremy's just got our Cocoon-based (forms 'n' flow) use-case tool "Lucet" reading and writing directly to Subversion, so you can have a fully-versioned backend repo tracking your use-case changes. Much help from Giacomo and Gianugo made this possible. Jeremy's write-up of reading and writing to svn is on the wiki (or will be shortly).
  • David's just completed what I think is his first documentation patch, providing a Spanish translation of Jeremy's QueryBean interface. Small acorns, hopefully there'll be lots more where that came from.
  • Last and least, I've cleared a small hole in my schedules (added an extra hour to my 36-hour days) to begin committing stuff to Cocoon: minor documentation tweaks for now, but I have a few other things in the pipeline, too.

It's all quite exciting.

Posted by savs at 6:45 PM

Ruby on Rails on Mac

I've been getting the Ruby on Rails framework installed on my Powerbook in order to play with it and find out what everyone's so excited about, and because David is proposing it for a small upcoming project.

There's an excellent guide to installing Ruby on Rails on OS X, which gave me a clue about requirements and so on. I didn't follow it to the letter because (a) I am using fink, not darwinports and (b) I'm going to try and avoid running MySQL, opting for Postgres instead.

I installed Ruby 1.8.1 via fink. I grabbed the RubyGems package management framework (yet another package management framework ... sigh) from the RubyGems wiki. Finally, I did sudo gem install rails which is where I hit the first problem:

Successfully installed rails, version 0.9.5
Installing RDoc documentation for rails-0.9.5...
WARNING: Generating RDoc on .gem that may not have RDoc.

lib/rails_generator.rb:34:46: Skipping require of dynamic string: "#{path}/#{name}_generator.rb"
Installing RDoc documentation for rake-0.4.15...
Installing RDoc documentation for activerecord-1.6.0...
Installing RDoc documentation for actionpack-1.4.0...

lib/action_controller/scaffolding.rb:87:37: Skipping require of dynamic string: "#{model_id.id2name}"
ERROR: While executing gem ... (NoMethodError)
undefined method `find_module_named' for nil:NilClass

It looks like this is only a problem with documentation, so fingers crossed.

One thing I did note during the gem install process was that I was asked if I wanted to install each dependency individually - rather than the Debian-style "the following packages will also be installed" approach. I prefer Debian's method: it means I can just leave the install running, rather than having to keep a close eye on it. Perhaps a better example is perl's CPAN package installer ... but I can't remember how it behaves with dependencies. I seem to recall it follows them automatically, but it's been a while.

The other problem I have is installing Postgres. There are at least four options:

I opted for the Liyanage package - it's recent, and it's quick and easy to get running. A quick install of that, the startup item from the same page, and /usr/local/bin/createuser myusername, and I'm up and running.

To give me a quick overview of Rails, I decided to work through the excellent "Rolling with Ruby on Rails" tutorial at ONLamp.

The Rails Tutorial gave me the information for connecting to a Postgres database in Rails, and it was trivial to convert the ONLamp gratuitously-GUI MySQL setup to Postgres:

psql template1
create database cookbook;
\c cookbook
create table recipes (
id serial unique,
title text,
description text,
date date,
instructions text,
category_id integer
);
create table categories (
id serial unique,
name text
);

This is where I came temporarily unstuck: sudo gem install postgres. I got:

Attempting local installation of 'postgres'
Local gem file not found: postgres*.gem
Attempting remote installation of 'postgres'
Building native extensions. This could take a while...
ERROR: While executing gem ... (RuntimeError)
ERROR: Failed to build gem native extension.
Gem files will remain installed in /sw/lib/ruby/gems/1.8/gems/postgres-0.7.1 for inspection.
ruby extconf.rb install postgres\nchecking for cygwin32_socket() in -lwsock32... no
checking for socket() in -lsocket... no
checking for gethostbyname() in -linet... no
checking for gethostbyname() in -lnsl... no
checking for sys/un.h... yes
checking for socket()... no
checking for cygwin32_socket()... no

Results logged to /sw/lib/ruby/gems/1.8/gems/postgres-0.7.1/gem_make.out

Thankfully, sudo gem install postgres-pr worked. I don't really know what the difference is.

So now I have Ruby on Rails working. I'm going to play with it a bit more before passing judgement on it.

Posted by savs at 1:38 AM

February 6, 2005

Postfix spam fix

Another weapon in the fight against mail spam, blocking incorrect HELO usage. Via kasia.

Posted by savs at 8:45 PM | Comments (2)

February 5, 2005

Owww

Racket Prince CatalystOuch. It's inhumanly early to be alive on a Saturday. I'm off to play a spot of badminton with Mr Billings at the Sportspark. I'm not saying it's been a long time since I played, but when I eventually found the racket, there was a layer of dust on it. I also don't think last night's bottle of wine is going to contribute to my playing ability.

Just getting the excuses in ahead of a predicted resounding loss.

Update: 14-6, 14-9, 14-4, 14-9. To me :-)

Not particularly through any sporting excellence... John played with more skill, I was just using the brute force and ignorance method.

Posted by savs at 7:50 AM | Comments (1)

February 4, 2005

links for 2005-02-04

Posted by delicious at 10:18 PM

Snack disaster

Kettle Chips Headline in the newspaperOh no!

"Plumes of smoke blackened the sky above a Norwich crisp factory yesterday as an oil fire raged through the building".

Arghhhh! Kettle Chips are made just round the corner from where I live, and are some of the best crisps in the world if you ask me. Finding out the factory was on fire .... shock! Horror!

Kettle BagThankfully, the fire hadn't caused panic buying - at least not until I got to the supermarket. Phew. The local free newspaper is pretty low quality, but you have to admire the quote they end the story on. Speculating about possible causes of the fire, they quote a manager as saying "We make chips and use oil, that's all I can say."

Posted by savs at 8:46 PM | Comments (1)

Cleaning up your blog

Here's how to sort out your MovableType 2.661 installation if you're plagued by trackback spam or comment spam, using SQL (if you've got a db backend):

Turn off comments on articles older than seven days:

UPDATE mt_entry SET entry_allow_comments = 2 WHERE entry_blog_id=1 AND entry_created_on < date(current_timestamp) - '7 days'::interval;

Turn off trackback pings on all entries:

UPDATE mt_entry SET entry_allow_pings=0;

Remove all unwanted recent pings (adjust XX based on when your last useful ping was):

DELETE FROM mt_tbping WHERE tbping_id>XX;

Hope that helps.

Posted by savs at 10:58 AM | Comments (3)

Cheap flights

On treating customers right:
Klm CoverBack in November I had an unfortunate experience with KLM, when my flight back from Zurich was cancelled and I ended up flying back to a different part of the UK. Getting home cost me a shuttle bus and train ticket, and I decided to claim it back.

Last month I received a cheque, and possibly the best apology letter I've read in a long time. So kudos to KLM for doing the right thing - it's definitely made me consider flying with them again. That's the apology letter they sent over on the right.

On cheap flights:

I noticed a new airline advertised on the side of a bus the other day. In Norwich. Oh gosh. One of my long-term rants is how Norwich is too far from anywhere, and if Ryanair or Easyjet were to start flying from here, it would be a much more reasonable place to do international business.
It seems that the number three low fairs airline in the UK (which I guess means the first one that isn't Ryanair or Easyjet), flybe, is starting cheap flights from Norwich. Hurray!
Sadly, flights are limited from Norwich at the moment - destinations are Edinburgh, Glasgow, Belfast and Jersey - but it's a start. Hopefully they'll add more destinations soon... I'd request Rome, Milan, Madrid, and Zurich to begin with.

Posted by savs at 8:52 AM | Comments (1)

February 3, 2005

Lists

So, it's goodbye to ALUG, textmate, spi-general, spi-announce, w3 semantic-web, w3 ws-arch, w3 ws-desc, www-tag, sounder, lugmaster, oai-general, oai-implementers, forrest-dev, debian-devel-announce.

rdf-interest, slide-dev, slide-user get to stay, for now...
Hello to simile dev and general.

Getting rid of all those won't give me more time to read the other lists. It will hopefully give me more time to manage spam though.

Posted by savs at 10:36 PM

Mac Mail app, not all it could be

I'm going through clearing out a selection of mailing lists I simply don't have time to follow any more (54,910 unread messages and counting ...). It turns out Mail is pretty dumb: if I delete a folder and it happens to be updating it's cache of the folder, it does not stop the update and then do the delete. Oh, no ... that would be too easy. It deletes the folder during the cache update.
So now for each mail message in the folder it just deleted, I'm getting:

Unable to open "*** Orphaned mailbox foo" IMAP command "SELECT" failed

There were over 8000 emails in that folder. That's an awful lot of times to click "OK".
Maybe it's time to switch to Thunderbird?

Posted by savs at 10:18 PM | Comments (5)

Eroding blogs

One of the things that really drew me to blogging was that it was such an open multidirectional conversation. I could have my corner of the web and write there with ease, and other people were welcome to come along and comment. If they wanted to write a little more, they could use their own blog, and link back to my thoughts, and the magic of trackback meant links would appear on my blog too.
After a while the scum of the earth started posting comment spam. At first it was just annoying, then it became a hassle, and eventually it became a serious problem. It ended up as a cat and mouse game: hiding the comment scripts so that automated spam tools would struggle to attack. Adding restrictions to posting. Generally raising the barrier, making it harder for spammers, but making it harder for the regular user, too.
For the last three days, like a lot of other people, I've been hit by trackback spam, averaging around 200 hits a day. So now I have to turn off trackback, and that little slice of the jigsaw is closed too.
Sure, I could update to a new blog engine, but that takes time I don't have right now. Sure, I could police the blog and take out the trash, but I don't have time for that either. It's gone from being a fun multidirectional conversation to a chore.
What's scary is that it took email maybe 35 years to reach the point of being completely useless. It's taken blogs less than five years to become seriously crippled. Ah, progress.

Posted by savs at 9:23 PM | Comments (1)