I was gratified to rack up my first ever Fedex win! The standard was high, and I put my win down to the quality quantity of jokes I made in my presentation – and people's reluctance to hand out back to back wins to Matt Ryall.
Why NNTP?
I think my entry – an embedded NNTP server plugin for Confluence – raises some interesting issues.
Two of the finalists – Per and Chris's entry and mine – were both trying to solve the same problem in different ways.
The general statement of the problem is: "How do you keep up with recent changes from a Wiki (or a set of blogs, or some forums) without being overwhelmed, but without missing things you want to see?"
The usual answer to this is to subscribe to one or more RSS feeds from a website, having configured your preferences on the web site, or the parameters of the web site's feed generation system to give you what you want.
That NNTP is a better protocol was first suggested by my colleague Ian Daniel. RSS stands for Really Simple Syndication, so it isn't surprising that it has some drawbacks compared to NNTP:
- RSS is one dimensional
- Comments are not threaded.
- Comments aren't associated with the original page.
- RSS isn't interactive
- To reply to a comment you have to click on a link and wait for a page to load, then click reply and wait for another page to load.
- Your RSS reader doesn't notify you when new spaces you might be interested in are created.
- RSS is ephemeral
- A typical RSS reader contains only a few previous comments/page updates, so searching is not useful, and looking at the context of a comment probably means clicking on a link and waiting for a page to load.
NNTP clients can make all this much easier, and have some other advantages:
- Tell it to ignore a comment thread you aren't interested in.
- *PLONK* particular authors in a killfile.
There are disadvantages:
- No HTML preview of Wiki markup while you're composing a reply.
- Some clients won't display HTML (but some – e.g. Thunderbird – will).
Implementation
My colleague James Dumay suggested Apache James as a starting point – I hadn't known that it included an NNTP server.
Starting from here saved me a lot of work.
Apache James is designed to be run inside an Avalon server, but rather than trying to run Avalon inside Confluence I decided to cut the NNTP server away from its dependencies. This was fairly easy to do, but of course I lost some of the Avalon server management features along the way.
The repository of news articles which the NNTP server serves to clients is well abstracted, so I created implementations of NNTPRepository, NNTPGroup and NNTPArticle and I was on my way.
Presentation
The key to winning Fedex is a good presentation, so I pitched the NNTP server as the 'next generation' 'post Web 2.0' user interface using the OpenGL based visualisation tool shown below:
Only one part of my presentation was actually fake (albeit prophetic):
all.add(new NNTPGroup() { public String getName() { return "alt.fan.tomdavies"; } public String getDescription() { return "An Appreciaition of Greatness"; } public int getNumberOfArticles() { return 1259345; } ...
Further Work
To get this plugin to production quality we would need to:
- Time out clients who don't disconnect correctly.
- Shut down the server when Confluence is stopped or the plugin nis disabled.
- Make the mapping between news item ids and news group sequence numbers more robust by using a persistent data store.
There are many possible enhancements:
- Expose tags as newsgroups.
- Expose favourites as newsgroups.
- Allow creation of child pages and spaces via NNTP (at present, any reply creates a comment, and any new post creates a top level page).

Comments (1)
Jul 01
David Peterson says:
Neat. Does FedEx code actually get published anywhere?Neat. Does FedEx code actually get published anywhere?