Changing Jabber status based on my calendar

Eileen Brown writes about the new Office Communicator:

you know, its the little things that make such a difference. Like the fact that my status automatically turns to busy – (a blue no entry sign) when my Outlook calendar is marked with a meeting

Bingo! Wow, what a nice feature that really is – especially useful in the workplace, let alone at home. So, how can I emulate it in my IM clients? Let’s start with (what I hope are) some facts:

  • my preferred client, Psi, does not support plug-ins
  • although we use Outlook at work, I have a Python script which extracts my Outlook calendar into the iCalendar (.ics) file format
  • Miranda and Exodus, among other popular Jabber clients, support plug-ins
  • a third-party (such as a bot) can’t trigger a change in another user’s status

So then. What can be done? For the clients without a plugin architecture, I don’t think there’s anything that can be done (this kind of thing is too niche to become an accepted patch although of course you could build your own if you were a sado-masochist). For the others though, there’s a real chance that this could become quite a useful feature.

I can’t see, by the way, how Office Communitor isn’t going to be massively popular in businesses all around the world.

Use accesskeys for navigating Google search results pages with Greasemonkey

The Greasemonkey script: Enables navigation through Google search results pages using ALT+, and ALT+..

This script enables accesskeys for navigating through pages of Google search results using ALT+, for “previous page of results” and ALT+. for “next page of results”. I find it useful, so maybe someone else will too 🙂

I’ve been using Jesse Rudermans Search Keys Firefox extension since he first released it. It’s brilliant – when you perform a search on any of the listed search engines it inserts the numbers 1-0 after them, and makes them links, so that pressing “1” will take you to the first result, “2” the second, and so on. This has proved very useful for me, because I’m quite the keyboard fan, and tend to search Google from the address bar, and then just press the number of the result I want to see.

The problem was that if the result I wanted wasn’t on the first page then I had to grab my mouse and click “Next”, or use find-as-you-type and hope that the word “next”, or “xt” wasn’t in any of the links already there. This script helps me get around that, so that now I have a guaranteed method of moving between pages of the Google search results. Marvellous.

What’s your app’s minimum limitation on username size?

Six characters? Three? Do you have a minimum at all? Should there be a minimum length for a username? Why can’t I have a one-letter username? Obviously there’s a fair chance that someone might have taken it before me, but still, what’s stopping me? Are enforced-username lengths a security issue? If you allow one-letter usernames, then perhaps there’s a better chance of brute-forcing the password?

Regardless, it’s completely frustrating to try and sign up for an account, only to be told after you’ve entered your registration details that “Oh no, sorry, your username actually has to be at least six characters long. Didn’t we mention that? Oh, sorry.”

Well, thanks and goodbye. Your service may be great, but now I’ll never know.

More on Jabber non-adoption

Jabber frustrates me a great deal, mainly because I think it should be doing a lot better and acting more coherently than it currently does. The decentralised nature of the system itself seems to have persisted into development efforts (i.e. there are eight different open-source Jabber server implementations, and another six commercial implementations; that’s fourteen different server implementations. You can tell it’s too many because in the “Feature Score” column on that list, not one of them scores 100% and the highest score for an open source server is 79%).

The clients, as I’ve discussed before, are in an even worse state.

The_Tick discusses some of these issues and more in his latest blog post “Some of the reasons that jabber isn’t where it should be“.

My problem, of course, is that I’ve got a big mouth, and not much to back it up with (my main dev. language is Java, and all of the Java clients are comparatively immature). So, OK, what can a frustrated developer do to help things along? First thing – don’t start a new client. Next, look at the state of the current clients and see what you can do there. So OK, let’s look at’s list of recommended clients for Windows:

  • Exodus – open source, Delphi
  • Gush – closed source
  • JAJC – closed source, possibly dead
  • Pandion, open source, nasty disconnection bug
  • Psi – open source, C++, QT
  • Trillian, closed source

So OK, realistically you’re now down to contributing to Exodus and Psi (or fixing Pandion’s disconnection bug, which doesn’t look like an easy task).

Until recently, even looking at the source for Psi was pointless because it depends on QT, which hasn’t been available (for free) on Windows. Trolltech recently announced that starting with QT4, QT will be available for open-source development on Windows for free (see what the Psi forums had to say). This is great news, because Psi is my favourite client; but on the other hand Psi used to advertise itself as the Jabber client for power users (they don’t do this any more), and whilst they’re now doing massive work on usability and the development community is very active (they have leadership and focus, I think the Psi community is very impressive) I think it’s likely to stay fairly focussed on power users.

Personally, I’ve always found Exodus pretty hard going, but it *is* in Delphi, which I can write, and it looks as though it should pretty simple to make a number of improvements to the UI without too much hard work, but I don’t have a copy of Delphi 7, which it appears to be written in, and which no longer seems to be available from Borland. Which would be a problem.

So, given that I’m lazy, this leaves me doing one of the following:

  1. buying (or, er, “obtaining”) Delphi and hacking on Exodus
  2. searching for another client with equally good JEP support to hack on
  3. spending my life unconstructively complaining on my blog, frustrating all and sundry

but seeing as I hate both whiners and hypocrites I’ll aim for the first 🙂

Textile your textareas with Greasemonkey

First of all, the link to the script: Textile your textareas with pure JavaScript.

Roberto De Almeida has posted a Greasemonkey script that makes all textareas textilable which works by injecting a button after your textarea which sends its contents off to his public PyTextile service and then replaces your contents with the parsed results, which means that although you have the full power of the latest version of PyTextile at your fingertips, it can be a little slow to respond.

But of course, Textile has been ported to JavaScript, so here’s a script which does the Textile transformation locally. It’s more limited than Roberto’s version, but still covers most of what you might want to do, like headings, lists, images, text-styling (bold and so on), but no tables and the more complex elements.

It’s based around Roberto’s script and uses Jeff Minard’s SuperTextile for the actual transormation. There’s currently something slightly wrong with it as it sometimes takes a few seconds to run through the final regexes, but I’ll probably just live with it.

“Microsoft Unveils ‘Office Communicator'”

so says BetaNews.

I can’t imagine anything I’d want less than an IM client inside of Word. You’d hope that instead of tacking in all this shit they might try and make Office stable.

“The relationship between Istanbul and LCS is similar to that between Exchange and Outlook,” a Microsoft spokesperson told BetaNews. Jesus. Well, if that doesn’t fill you with fear and dread, nothing will.

Finding related items in your RSS datastore

Jon Udell’s latest screencast “The on-demand blogosphere” shows how he mines the data stored by his aggregator to find out who on his blogroll has made a post related to what he’s reading at a given moment, based on anything from the currently selected word in a block of text, to the URLs the text links to.

It’s all very clever, and probably quite useful if you only skim read your aggregator, or have a veritable mountain of sources to look at, but it’s clearly version 0.1 as far as this kind of thing goes (as Jon himself suggests).

For me, the next step would be to automate the searching; using either Greasemonkey or an extension to display either a sidebar or a section in-page containing the related links.

Taking Jon’s step of then searching out through the blogrolls of the people you’re subscribed to is harder by an order of difficulty, primarily because there’s no easy way of discovering exactly who they subscribe to (if they even make it public). There’s always the chance that they might have a FOAF file, but then the problem becomes one of identifying which link in their FOAF file is to a blogroll file (probably in OCS or OPML) before you’ve actually downloaded it.

I imagine there’s some way you could centralise it all by using Bloglines and associating the blogs you read with user IDs, and then harvesting the public blogrolls, but that’s just a wild guess.

Tantalisingly though, all this stuff seems just out of reach. I can’t think of any truly practical way of going about it (especially in a decentralised way, which would be the most useful). I’m sure this is the moment where I’m supposed to say that the semantic web will save us, but I really can’t think of any way it helps here, sorry 🙂

Goodbye, Allconsuming

I’ve given up with, it’s just too slow (when it’s responding at all) and too much work to maintain my books there.

Over the next few days I’ll be exporting my data via the HTTP API, and probably converting it to RDF using the RVW format so that I can later do with it what I like.

What this means is that I’m in the market for a replacement. It doesn’t have to do all the social engineering part, but it does have to be easy, pretty, and let me export my own data if it’s a hosted service.

I’ve known this was on the cards for a few months, but I’ve not really given it anything other than idle thought before now. I had considered using, but I don’t just want a list of titles and 255-character descriptions, I also want the book cover and the ability to thousand-word descriptions should I so desire, as well as multiple dates for things like “bought on”, “started on”, “finished on” etc. and they shouldn’t just be tags.

I had vaguely considered using Alf‘s suite of tools like rvw! and blaxm!, but I don’t think they’re what I’m after. rvw is all well and good if I want to post a review to my own site, but I don’t. blaxm! is a kind of interesting experiment, but that’s all it really looks like. I’m sure the code underneath it is enough to give me 70% of what I’m after, but the services as-is aren’t enough, and my Perl’s probably not good enough to run with the code even if Alf was kind enough to let me see it.

I must admit, it’s pretty tempting to just forge on ahead and knock it all up myself (how hard can it be, right?), but basically I can’t believe that someone out there hasn’t already done this (and I’m kind of dreading using the Amazon API too).

So what say you, my readership? I know you’re out there, I see your aggregator polling me right now! Does anyone know of any service that’s like Flickr, but for books?

Downloading via SSL in IE

Edd Dumbill’s been having problems getting IE to download dynamically generated files and today posted the solution he discovered:

The sort of situation that causes IE not to cache is either an SSL session, or where caching is turned off for other reasons, such as using PHP’s session facilities. This latter reason was the problem I was having.

The answer is remarkably simple, which is to add a Cache-control: public header to the download. This causes IE to keep the downloaded file around.

I ran into this about a year ago, and as far as I can remember, this solution doesn’t work when the download is both over SSL and your app is hosted by Tomcat behind IIS. I ended up having to both write my own server-side download handler and set the Cache-control header.

At the time it was all a bit of a last-minute discovery which didn’t get much investigation (both Firefox and Opera worked fine without any additional work which is why I hadn’t seen it earlier), and I just went with the first working solution, so if anyone knows better, please let me know 🙂