Skip to content


Test-driving Google calendar

Well, I guess I feel similarly to JWZ when it comes to calendar software. Yesterday I downloaded the Lightning 0.1 extension for Thunderbird. It's a partial improvement over running Sunbird; it's handy to be able to view the calendar right there in thunderbird, but it clearly needs a lot more polish before it can be really used.

I was all set to switch over to Lightning from Thunderbird, but then I read JWZ's entry that mentioned Google Calendar at the bottom, and it looks good.

The major points that appeal to me:

  • SMS notifications prior to events. You don't have to be at your desk to get the reminder, or even to have your computer turned on.
  • It's online, accessible from anywhere that's connected to the 'net
  • Public events can be published as RSS and iCal (find mine in the geeky sidebar to the right)
  • The whole thing (including private events) can also be published as RSS and iCal
  • You can import existing calendar data from iCal and CSV files
  • UI is nice

So, I think I'll be using google calendar to manage my calendar. I still need to be able to see the private OmniTI calendars, so I'm still using Thunderbird/Lightning to do that.

Upcoming conference appearances

I'll be giving my "usual" PDO talk at both MySQL Users Conference 2006 and OSCON 2006 (the MySQLUC version of the talk will have a MySQL focus).

If you're interested in PDO and haven't had the opportunity to see me give this talk yet, please consider trying to get to one of these conferences. My talk covers the design decisions behind PDO, suggests some best practices for using it, highlights portability concerns (particularly because PHP programmers have been "dummied down" by the older mysql client library API) and more.

As usual, I'm always open for questions during the talk (I'm there for your benefit after all) and I try to make myself more generally available during the conference, so if you want to ask me questions, or even just have a chat, then feel free to approach me.

Solaris libumem port on SourceForge

I've had an incredibly busy year so far, having spent the better part of half of it on-site with a customer/partner across the atlantic, and it's only March. In addition to working with them on a large scale deployment proof-of-concept project (I'll blog more about that when I'm sure it's ok to blog about it), we've been hard at work on our Ecelerity 2.1 release, which is just about out-the-door (just some final QA to go).

One of the internals features in our new release is the adoption of the Solaris slab memory allocator, libumem. We already had our own slab allocator, but there are some interesting innovations in libumem that reduce lock contention and cache invalidations that make it attractive for a very high performance multi-threaded application like Ecelerity.

Since Solaris is OpenSourced under the CDDL, we were able to incorporate the allocator into Ecelerity and port it to Linux and Windows and not be forced to open-up our entire source-code. The CDDL requires that we publish the code that we modified, so we set up a project on SourceForge. The code isn't out-of-the-box usable just yet, as it lacks its own configure script and makefile, but it won't take much effort to create those.

Thanks Sun for opening up such good quality code under a commercial software friendly license!

Happy New Year, and by the way, we think you don't do shit

I have to say that I'm disgusted at the attitude of two of our prominent PHP developers.

PHP is a volunteer project guys. If you don't like the fact that I lead a very busy professional life then that's your problem.

I know how many hours I've spent developing PHP and maintaining its systems over the last year. (Guess who gets paged when our mail systems run into problems?)

Getting snarky because I'm on vacation for a week is just plain wrong. Really.

PS: if you think that attitude will motivate me into doing more for PHP you're wrong. It just makes me want to go and do anything else instead.

EvilDesk 0.8 Released

I've been enjoying my vacation time, spending a good bit of it hacking on EvilDesk. This is something of an eyecandy release, with some visually appealing refinements. I'm always wary of eyecandy for eyecandy's sake, so I've tried really hard to balance resource consumption with visual goodness. To that end, the eyecandy features can all be turned off, and can also be tuned to reduce (or increase, if you like) their memory consumption. So, what features are new?

  • Added the ability to customize the appearance of slits and the task switcher. Each slit can have a custom background tile, as can the task switcher. You can also change the font, style and colour.

  • Added a window thumbnail cache. This is used by the alt-tab task switcher and also by Overview.

  • alt-tab uses the thumbnail cache to show previews of the applications as you're alt-tabbing.

  • The new Overview plugin is inspired by OSX exposé; pressing Win-F9 (configurable) will show a zoomed-out overview of all the open windows on each monitor attached to the system. You can then click on a window thumbnail to switch to that window. Unlike exposé, Overview performs no animation.

I also made it possible to set all the settings from the .evdm, which should make things significantly easier to configure.

Check out the full change log for more details.

You can Download EvilDesk here.

Happy New Year!

WinXP Desktop Shell Replacement, 2nd Release

[Update: Newer releases are available]

As a follow-on from the last release, I've uploaded the latest iteration of my EvilDesk shell replacement for Windows XP.

The changelog goes something like this:

  • much more robust installer, which should address most of the problems that were reported with the last release.

  • improved window state tracking. Console windows now respect the desktop state.
  • improved multi-mon behaviour.
  • improved window title display for really long window titles when alt-tab'ing.
  • new putty context menu plugin (read the docs for details)
  • experimental tweaks for changing the target slit and gravity for plugins (so you don't have to have everything on the right hand side of the screen). Registry editor required; no GUI. See docs for details.
  • fleshed out the Tweakage menu, making it more useful. The shell will use RunAs for the system level items, for those of us running without admin privileges.

Some random notes/comments:

  • During my debugging, I found that WinLogon doesn't like spaces in paths, so I've changed the default installation destination to \\EvilDesk on your system drive. Sorry about that, but it is a Windows bug.
  • You MUST have admin privileges to install the package; the installer will not modify your shell, so this is safe. Most people will be running with full admin rights anyway. (if you're one of those people, you should be reading The Non-Admin Blog)
  • Sadly, you can't use RunAs to invoke the control panel without invoking explorer.exe for the admin user. I'm open to suggestions. For now, control panel is launched using your privileges via explorer.exe.
  • On a related note, people running XP Home might not be able to launch the control panel. Tough luck, you should be running XP Pro anyway.
  • Gaim still has weird interactions (probably other gtk+ apps will do too). If you rapidly switch desktops, the gaim window sometimes gets mashed up, as though its layout engine has gotten confused. Not sure if thats my bug or GTK's bug. The workaround is to close the chat window when that happens.
  • Thunderbird/firefox: again, rapid desktop switching sometimes confuses them, causing them to not restore from minimized state properly. I have added code to spot this situation and make it less inconvenient. Again, not sure if (how?) it's my bug, or a bug in the toolkit used by those apps.
  • MSDN help browser: seems to do something funky with its top-level window (could be GDI+ related) that has some weird interactions when using the Win-W popup menu in evildesk.

If you want to download and install it, you should first read the following disclaimer:


The software is provided as-is in binary form only with no warranty. I am not liable for any bad mojo, be it mental, physical or meta-physical, that arises from its use. By downloading it, you assert that you will not decompile or reverse engineer the software in any way, and that you will not re-distribute it to any third party in any form without my express consent. All rights reserved; All liabilities disclaimed.


  • Download evildesk.msi
  • As the Administrator, install it, by double clicking on it. Note that this act will not change the shell of the administrator.
  • As the user(s) that plan to use the shell, login and run the "Set Shell" shortcut from the Start Menu:
    Start | Programs | Evil, as in Dr. | Shell | Set Shell
  • You should now reboot. Yes, rebooting sucks, but if you don't reboot, the Win-E will cause explorer.exe to load the taskbar. This is an issue with explorer.exe and affects all replacement shells. Sorry.
  • When next you login, you'll be running my shell.

EvilDesk 0.7 Released

Well, the bug fixes I made in the last release left me feeling empowered again, so I've followed up with a couple more features and some more bug fixes:

  • Added new MATCH CREATE window matching configuration option, which allows actions to be taken when windows are created. For example, you can cause all VMWare windows to start on a given workspace, or have your mp3 player automatically stick to all workspaces when it starts up.
  • Fixed a slit layout calculation bug.
  • Avoid blocking the flasher when the flashing app (eg: gaim 2.0 beta) hangs itself
  • Balloon tips now display the body of the balloon text, instead of the tooltip from the tray area, and will rise all the way to the top of the z-order.
  • Improved detection of deleted tray tooltips, so that balloon tips are not wiped out at the wrong time.
  • When a window was made sticky, it would remain in the minimized state on the inactive workspaces. This has now been corrected.
  • Fixed a string termination bug in the PuTTY plugin for sessions that have spaces in their names.
  • Environmental variables are now expanded when processing the MergeDirs directive in the .evdm file

EvilDesk 0.6 Released

Having finally found some time to myself, I thought it was about time that I push out a release with the changes that I've been using for the last few months. Some of these changes are based on feedback from users; keep it coming folks! :)

Feature changes in the new release include:

  • Revised plugin loading system. Slits are defined via the new SLIT directive and plugins are loaded via the new LOAD directive in the .evdm file.
  • Slit windows will hide themselves when an application goes fullscreen (and come back when it leaves fullscreen mode). I've tested this with PowerPoint (when viewing the slideshow) and PuTTY (alt-enter) and it seems to work ok.
  • Altered the gravity of the tray plugin so that it sinks below the flasher. Why? When double-clicking on the gaim tray icon, the first click would open the buddy list, causing it to flash. The flasher would bump the tray up, causing the second click to land on a different tray icon--usually the wifi icon, popping up the wireless network selector.
  • Added more internet-facing apps to the SaferExec line in the default configuration. No idea what that means? Read more on "Browsing the Web and Reading E-mail Safely as an Administrator".

Bug fixes include:

  • Fixed a race condition where windows could bleed across to the target workspace when switching workspaces.
  • Fall back to the system default icon in the task switcher and flasher if the window in question has no icon of its own.

Go get EvilDesk!

Merry Christmas!

MinimizeToTray + thunderbird == lower memory usage

Having just set up the mozilla calendar plugin to launch when I open thunderbird, I was wondering how much memory I was going to be sacrificing to the GUI god. I was very pleasantly surprised to see that thunderbird.exe was consuming less than 2MB when minimized.

I put this down to MinimizeToTray. My guess is that it's calling SetProcessWorkingSetSize(GetCurrentProcess(), 0xffffffff, 0xffffffff) to swap the process out of memory when minimized.

Yep, after a while, the memory usage creeps back up again, as thunderbird does its background bits and pieces, like checking mail.