I am weak (Review of Saitek "Eclipse" Keyboard)

This isn't an essay I've had in mind for any time, but the photo is kind of neat, and it happened today.

I have managed to avoid purchasing a keyboard for almost a year now. Apparently this is too long:

dscn9730

Today briefly before lunch, the "Alt" key on my Bluetooth DiNovo finally gave up the ghost. It's still under warranty, but I was in the middle of hacking with Emacs, and you can't really do that without a meta key. I really do destroy keyboards at an unbelieveable rate. As a backup, I purchased a somewhat sturdier and cheaper board; the Saitek Eclipse PC Keyboard.

While it doesn't meet any of my normal criterea for a good keyboard, i.e. it doesn't use mechanical keyswitches and it's not slim form-factor, something about this keyboard just exudes quality. This wasn't a dramatic or somehow amazing keyboard like the Tactile Pro, but it is a quietly comfortable and definitely high-quality keyboard. It's a bit paradoxical - I generally hate membrane keyboards with a lot of travel, but this one seems to be quite comfortable. The keys are a good size, the incline is comfortable, and I seem to be able to break 140wpm consistently in the hard drills at the end of gtypist. It has exactly the keys I need: no funky spatter of random "internet" function buttons that don't work with Linux anyway. All the keys are in exactly the right place; they didn't pull any weird tricks like expanding the Delete key, moving around the backslash or backquote, or sliding the Alt somewhere other than under the thumb. The nominal Control keys are nice and wide, when you need to use them, and the Caps Lock isn't castrated to make it useless as a Control.

But of course, these are all just mistakes they didn't make. It feels nice, and I don't know why. The only concrete difference I can really put my finger on (no pun intended) is the lack of "squeak". Perhaps there is a better word for this, but I have only tested this concept experientially - here's what I mean.

Try this with a normal $5 keyboard: push hard on one of the keys, then slide your finger back and forth. You will notice that it squeaks when you wiggle your finger back and forth, sending vibrations up your arm. I always take this as a sign of the quality of the construction of the keyboard, because the squeak is coming from bits of plastic rubbing against each other which are never really supposed to touch. On really awful keyboards this is bad enough that you can feel the squeak while typing; on others there is just the occasional hint of it.

While this particular feature isn't a deal-breaker for me (even the DiNovo has a tiny bit of squeak) it is definitely a good sign that the Eclipse doesn't have it. I'm enjoying typing on it immensely so far. Its first day it saw a prodigious amount of use, as I was preparing for a rather intense deadline :).

Twenty Megabytes

Today I'm playing with Flickr to see what the buzz is about (and of course, to get some ideas for Divmod's photo-sharing features). I often think of blog narratives that involve photos. I'm going to post a few samples of ideas that I've had for months, but just haven't found a moment to upload.

I maxed out my upload ratio on my first night: 20M of photos goes really quickly.

By the way, I uploaded all the photos with FlickrUploadr, an unofficial GTK+ tool to upload photos written, inevitably, in Python.

what we need more of is surveys

I made some science

metaclasses: like candy for sociopaths

If you've ever tried to use __slots__, you might have noticed that it comes with a pleasant side-effect: it makes it impossible to assign extra, garbage attributes to your objects. While normally not a serious problem, objects with extra, unintentional crud stuck to them can make object databases hell to work with as you struggle to figure out where it came from or why it is in your database but not in memory. Therefore, this semantic feature is handy in addition to reducing the memory footprint of objects if you have large numbers of them lying around.

If you've noticed this, you've also probably noticed that it is damn near impossible to use __slots__ because you have no control over what slots are used from your base classes.

Here is a solution to this problem that I have been working on for a while: SlotMachine. While it breaks isinstance - you weren't using isinstance anyway, right? - it does do the sane thing that you would expect a cooperative __slots__ implementation to do; you can subclass from random other classes (provided that you properly specify all their attributes as slots on your object) and other SlotMachines, and even other objects that define __slots__, without giving up the explicit specification of attributes or the ability to inherit from things.

I'll add some more comments to that file later tomorrow, I think.

Releasery

We managed to release something yesterday - Pyflakes, a tool similar to PyChecker but about a zillion times faster and provides fewer useless warnings. The author is Phil Frost, one of our developers and the lead maintainer of the Unununium OS project. Pyflakes was previously available through his home page, but we've started hosting it on divmod.org in the hopes that it can get some wider exposure and use and raise the average index of Python code quality throughout the universe.