Phage 0.2.1

April 30, 2007

I just fixed a bug that caused Phage to be confused about whether you or the AI had won the game. This would sometimes cause Phage to declare that the AI won the game, when in fact you had. Pesky cheating AIs. At least I get to test whether auto-updating with Sparkle works then, which I introduced in the last release.

Download Phage 0.2.1 (0.5 MB disk image). Visit the homepage.

Phage 0.2

April 26, 2007

There’s not a lot of changes in here, but one of them should make incremental releases much more manageable. I also gave the website a little face lift, so hopefully it shouldn’t scare off people now.

The changes in this release are:

  • Added a progress indicator for things that go on in the background.
  • Added a “Move hint” menu item. Selecting this makes the AI give
    you a hint for a move.
  • Added a “Check for updates” menu item to check if new versions
    are available, using the wonderful Sparkle framework.
    You also have the option to automatically check for new
    versions on startup.

Download Phage (0.5 MB disk image). Visit the homepage.

We’ve had a Royal Mail redirection in place since we moved from our last flat in Stanmore nearly a year ago. It’s mostly been working OK, though occasionally it gets the hiccups and Nadia’s mail is sent to her sister instead (and her mail to us), but at least those letters get to the right addressee in the end.

This last blunder, however, is a bit more of a mystery. We’ve got mail redirected to us from an address we’ve never lived in: we were in 27 Lady Aylesford Avenue, but the redirection is from flat 28. Ok, so somebody might have been a bit chubby-fingered; 7 & 8 are, like, right next to each other. It turned really interesting when I opened the pack and found two letters to a Mrs King in 18 Embryo Drive—a person we don’t know, at an address we’ve never heard of.

There’s only one way I can imagine how this could happen: Someone must have been behind on their workload and decided to just make stuff up to make it seem like they were catching up. Or maybe they were on their last day, or were excruciatingly hung-over, and decided to have a little fun.

By the way, Mrs King, it looks like it’s just spam from Argos. You want it, or should I just throw it away?

Tuffmail & Sieve

April 11, 2007

One of the reasons I used to run my own mail server was so I could do server-side mail filtering of messages into various folders depending on their content. I’d normally reach for procmail for this but with Tuffmail, which I’ve recently started using, server-side mail filtering is provided by way of Sieve filters.

Writing Sieve filters isn’t particularly hard, but here’s a few things worth noting (I believe them to be Tuffmail-specific):

  • Most tutorials and examples on the ‘Net use ‘.‘ as the mailbox separator, while Tuffmail use ‘/‘. Your Sieve rules must use slashes as mailbox separators if you want to file mail into nested folders (e.g. INBOX/Lists instead of INBOX.list). (Alternatively, you can change the separator back to being a ‘.‘)
  • Folders are not created automatically. If you configure Sieve to deliver mail into a folder that doesn’t exist your mail will just go to INBOX instead.
  • The ANS (Alternate Name Space) setting must be taken into account when filing mail into subfolders. (If it is off, you’ll want to file into INBOX/Lists/Doxygen; if it is on, use Lists/Doxygen.)

In addition to these caveats I found the Sieve documentation to be rather impenetrable. To help you get started using it, here’s a snippet that files Svk and Doxygen mailing list messages into their own folders and all other list messages into a third:

require "fileinto";

if header :contains ["List-Id"] "doxygen" {
    fileinto "INBOX/Lists/Doxygen";

} elsif header :contains ["List-Id"] "svk" {
    fileinto "INBOX/Lists/Svk";

} elsif exists ["List-Id"] {
    fileinto "INBOX/Lists/Misc";
}

The “List-Id” header is an RFC<mumble> header used by well-behaving mailing lists to identify themselves, so it’s a great header to filter on. The last clause is a catch-all—it just checks if the List-Id header exists at all.