Apr 21

"I thought a repository was something you shoved up your ass until I discovered Ubuntu."

Jan 18

Human beings have different kinds of memory; they remember things in different ways. Three common classes of memory are spatial memory, visual memory and verbal memory. (There’s also chronological memory, but that’s not relevant to my point here.)

I have excellent spatial memory. It’s what I rely on most. For example, if I start to think about how to get to a given place in town, I literally find 3D visualizations of my route flashing into my consciousness. I also have pretty good visual memory; when I make the journey, I verify that I’m going the right way by comparing the visual appearance of buildings and landscape that I pass with the scenes I remember.

My linguistic memory is terrible. If you asked me to name the actual streets on the route, I’d have a hard time remembering them. My mental map of London, for example, only has 6 street names. This makes me a really bad person to get directions from. “You take the narrow road that heads off at a thirty degree angle, right at the place with the green copper roof, over the light colored bridge…”

There’s an upside to my condition. If you rely on verbal memory to navigate, as soon as you step outside your known area you are pretty much lost until you can find a familiar street name. In contrast, I have a pretty good chance of navigating between two known points, even if the area in between is totally new to me.

This hierarchy of types of memory also applies in my interaction with computers. When I want to find my password manager, I don’t remember its name. Instead, I remember that it’s in the bottom hierarchical menu of my KDE menu, positioned near the top, and has a green icon.

I know this experimentally, incidentally: back in the System 6 days there was a joke Mac INIT that removed all the text from the menus. I tried it, and was quite startled to discover that I could still use most of my favorite applications.

With that background out of the way, I would like to talk about why for me, the new KDE 4 application launcher is a user interface disaster of epic proportions.

Continue reading »

Jan 01

In mid November, our contract with AT&T (formerly Cingular) expired. We switched to T-Mobile and got BlackBerry Curve phones.

I was a BlackBerry skeptic for a long time. I didn’t think I wanted a phone with a full QWERTY keyboard. This changed when we looked at the phones available. It turned out that the Curve was only marginally wider than the average phone, perhaps a centimeter or so. It’s otherwise comparable to mid-range phones in size. It ends up being pretty much as portable as our Sony Ericsson Z520a phones.

The BlackBerry UI is best described as “retro”. The icons look like 1990s Windows, the text fonts look like 1980s Atari ST, and the general method of navigation most resembles Palm OS. This is both a good thing and a bad thing. Starting with the good, the UI is clearly designed from first principles to work well on a handheld device. The central trackball handles scrolling, pointing and clicking. It sits easily and naturally under the thumb. You can do pretty much everything with one hand, including browsing the web and checking e-mail.

This is in marked contrast to the iPhone, which pretty much requires two-handed operation. Windows Mobile devices suffer from having a desktop UI squeezed into a handheld form factor, and also require two hands, and often a stylus. Symbian is designed for phones, but the UIQ interface for smartphones uses a stylus. Overall, then, the BlackBerry works better than other phones I’ve tried when you’re standing in an airport with a coffee in one hand.

On the downside, it’s hard to find the icon you want in a hurry, because of their visual clutter. Perhaps a replacement UI theme would help; I’m a little tempted to grab the theme designer and start working on one, but it’s Windows only. The fonts were initially problematic too; nowhere near as nice as Apple’s, and they took some getting used to.

But when it comes time to reply to an e-mail, niggling issues with fonts were forgotten as I got to grips with the keyboard. Yes, it requires both hands, or more accurately both thumbs. It’s not as fast as a full size keyboard, but it’s faster than Palm Graffiti or Windows Mobile pen input, and much faster and less frustratingly error-prone than I found the iPhone’s on-screen keyboard to be. Unless Steve relents and allows a Son of Newton to use the Newton’s non-cursive text recognition, I can’t see it being bettered.

Textual messaging is where the BlackBerry really shines. It’s quite possible to thumb out fairly lengthy e-mail responses, or even update your web site. As far as IM, there’s support for Google Talk and AIM built in, as well as Yahoo Messenger, Windows Live Messenger and ICQ if you know anyone who still uses only those. There are third party clients for non-Google Jabber and other protocols, and in addition, there’s BlackBerry’s own BlackBerry Messenger, previously called PIN messaging.

If you have a friend who also has a BlackBerry, PIN messaging is definitely the way to go. The manual doesn’t cover its benefits, so I’ll digress a little here. Unlike other IM systems, PIN messaging is tied to the BlackBerry device by a unique ID. You connect with another person initially by sending them an invite via their BlackBerry-specific e-mail address, or any other address they access via BlackBerry e-mail. When they reply, their device records the device ID you sent, and sends you theirs.

The primary benefit of PIN messaging is that it’s push-based. The recipient doesn’t need to be logged in. If their phone is switched off, the message will be queued until they log on.

The second benefit of PIN messaging is that it’s reliable. Unlike SMS, messages don’t get randomly dropped. In addition, you get delivery confirmation automatically for every message: when you hit enter, the line you typed appears in the transcript with a small icon next to it indicating that the message is going out over the network. When your device receives positive confirmation that the recipient’s device has displayed the line you sent, the icon changes.

If that’s not enough, there’s a third benefit over IM or SMS: there’s a separate “ping” option. So you can set up your regular notification to be something discreet, and know that your spouse can ping you to set off something more noticeable if necessary.

Other than that, PIN messaging has the usual file transfer, allows you to send voice memos, and looks and behaves like regular IM. For us, it has completely replaced SMS, not least because it doesn’t cost 15¢ a message.

One interesting feature of the BlackBerry is that as well as individual icons for each messaging system, there’s also a unified inbox that shows IM, SMS and e-mail in one place. This makes sense, as they all have pretty much the same UI on the Curve; the protocol is almost an irrelevant detail. I believe that if you attempt to send pictures via SMS, the phone automatically uses MMS, but I haven’t tried it.

Web browsing is a mixed bag. The built in BlackBerry browser has two modes, mobile mode and “desktop” mode. Although there are references to WAP, the browser copes with both, the mode just determines how the page is formatted for display. In mobile mode it works like a typical phone browser, in desktop mode it tries to deal with things like tables, CSS and JavaScript. Overall it makes for a pretty good browsing experience, as phones go. (If you haven’t tried browsing from a phone, the main issue isn’t usually layout–it’s latency. Each page request takes a ridiculously long time to send, compared to a desktop system. I assume this is something to do with the mobile network.)

An alternative is Opera Mini, which takes the “thumbnail of page with moveable active area” approach to web browsing. It works surprisingly well with sites that the built-in browser can’t cope with, like zagat.com. (Yeah, good move, make a web site of restaurant reviews that doesn’t work with a phone browser.)

Maps are another strong point. There’s a map application supplied, but I downloaded Google Maps for BlackBerry, which is free and offers pseudo-GPS location by correlating your active cell to its geographical location. Accuracy can be as little as 50m or so in cities, up to 1km in the countryside. The Google Mail application also works well once downloaded.

The BlackBerry OS appears to be Java based, and is pretty solid. It’s more reliable than a Palm; I’ve only managed to crash it once, which is comparable to Linux on the N800 in solidity. Initial bootup (after inserting a battery) is horrendously slow, but once running it seems to use a soft power off which doesn’t require a full boot. The UI is generally responsive at all times, unlike some Sony Ericsson phones. You can put the phone into standby mode by holding down the power switch. In standby the screen and keyboard deactivate, but you can still receive messages and calls. The same hold-down-button action brings the phone out of standby instantly.

The one bug I’ve found so far is in the BlackBerry web browser. After a while the cache gets full and slows browsing down tremendously. The workaround is to empty the cache once a week.

The phone shows a lot of attention to the details of how a mobile device should best operate. For example, an ambient light sensor behind the notification LED turns the screen brightness down in dark areas, and automatically turns on the keyboard backlight. The LED itself has behavior customizable through the notification options; each event (phone call, IM, SMS) can have any or all of a user-chosen sound, vibration, and LED flashes. You can even set different messaging systems to have different notification; for example, I have IM just flash the LED a few times, unless it’s a PIN message from the spouse.

Mac sync is a bit of a sore point. There’s a package called PocketMac that BlackBerry purchased and now give away for free. It worked for me, more or less, but had some annoying bugs. (For example, syncing with a subset of address book records didn’t work, and editing records on the BlackBerry resulted in duplicates.) The solution is simple enough: Mark/Space have a Missing Sync for BlackBerry, which makes everything work, and even syncs user pictures so you can see the face of the person calling you if you’ve given them a picture in OS X.

Overall, it’s the best mobile phone I’ve used. Whether it’s good for you will of course depend on your use cases. If you’re someone who likes to talk to people or use voicemail rather than IM or e-mail, or if you have little patience for customizing software, the iPhone is probably a better bet. It certainly look prettier. But if you prefer text to voice and prefer functionality to prettiness, the Curve beats the iPhone hands down. This may change once they stop crippling the iPhone and open it up to third party applications; we’ll see. For now, I’d pick the Curve again, even if the iPhone wasn’t tied to AT&T.

Update: Oh yeah, the Curve is also a quad band phone. That’s de rigeur, so I didn’t even think it was worth mentioning.

Nov 20

Dear Amazon,

You’re so almost there with your new Kindle e-book. There are just a few minor details you need to fix to get me on board.

First of all, you need Mac support, and preferably Linux support as well, both for content creation and for reading books. There’s really no excuse for not having reader support, as you have a working Mobipocket reader in Java that will run on Mac and Linux, you just haven’t taken the time to package it up properly. The creation tools ought to be a pretty simple task to port too; a command line version would be fine. I don’t even care if it can’t apply DRM; I just want a way to be able to package up free text.

Secondly, you need to either drop the DRM, or drop the price of the books. Let’s consider a real example here. I’m about to start reading Charlie Stross’s The Atrocity Archives.

Let’s get one thing straight here: because there’s DRM, I can’t sell the book when I’m done with it, which breaks the first sale doctrine. Therefore, you’re not actually selling e-books, you’re renting them to me for an indefinite period of time, a bit like Netflix does with DVDs. I’d respect you more if you admitted that.

Anyhow, If I go the Kindle route, it’s $9.99 for the book.

Suppose I go the paper route instead. I can pick up a new copy on amazon.com marketplace for $12 plus $4 shipping = $16. When I’m done reading it, I can sell it for $9 second hand. Total cost to me = $7.

So the Kindle is more expensive, and I can’t actually buy the books. That to me is a poor deal.

Oh, sure, Kindle prices include network bandwidth… but with paper books, I had to include the cost of physically shipping dead tree across the country, and I still came out ahead. If you can’t beat the paper book price-per-reading, you’re doing something seriously wrong.

We’ve all watched the music industry flail around overcharging for DRM-burdened files and get nowhere. Learn from their mistakes. Drop the DRM, or drop the book prices to $5 or so (comparable to a DVD or video game rental, plus some markup to cover network costs) and I’ll order my Kindle tomorrow.

Update: Of course, if you gave me the Kindle for free, I’d use it to buy books from you, and look on the extra cost as a convenience fee.

Oct 23

One of the things I found confusing about bash was its startup scripts: there were so many of them. Eventually I snapped and sat down with a terminal and the man pages, and worked out how it actually behaves. Here’s a summary.

Interactive
login
Interactive
non-login
Non-interactive Remote shell
/etc/profile A      
/etc/bash.bashrc   A†    
~/.bashrc   B   A
~/.bash_profile B2      
~/.bash_login B3      
~/.profile B4      
~/.bash_logout C      
BASH_ENV     A  

On startup, bash executes any script labeled A in the table above, followed by the first script B it finds. On exit, it executes any script labeled C above.

Let’s look at the column headings in a little more detail.

  • An interactive login shell is a shell that you are typing into, that is the first such shell you execute on the machine. Typically you will have had to log in immediately before the shell starts. For example, when you SSH to a remote system and type commands to that system, you are typing into an interactive login shell.
  • An interactive non-login shell is a new shell started once you have already logged in; one which doesn’t require that you log in again.For example, if you open a new terminal window in your graphical user interface and get a shell prompt, that’s an interactive non-login shell. Another example of an interactive non-login shell would be a sub-shell started from inside a text editor; for example, typing :sh in vi.
  • A non-interactive shell is a shell which doesn’t prompt you; it just runs a program and then exits. The most common example of this is any program written in shell script, such as a configure script, a startup script in /etc/init.d, or any other file marked as executable that has #!/bin/bash on the first line.
  • A remote shell is a shell started by a program such as SSH or rsh in order to run a command on a remote machine.For example, the rsync and scp commands use SSH remote shells in order to copy files between machines.

So looking at the second column, an interactive login shell will execute /etc/profile always. It then looks for ~/.bash_profile, ~/.bash_login, and ~/.profile in turn, and executes the first of those it finds. On logout, it executes ~/.bash_logout.

The /etc/bash.bashrc A† item is special; whether bash searches for it is dependent on a compile-time option.

BASH_ENV is an environment variable which allows you to make non-interactive non-login shells (such as shell scripts) execute a startup script. Set BASH_ENV to the filename of a script and then invoke a sub-shell, and the script will be executed when the sub-shell starts up.

Problems with bash’s behavior

Given the above table, the short summary is:

  • If you want something executed only when you first log in, put it in ~/.bash_profile
  • If you want something executed only for additional shells (such as OS X terminal windows and xterms), put it in ~/.bashrc

But there are a couple of problems with this arrangement, problems which suggest that bash’s startup behavior wasn’t really thought out with users in mind.

Firstly, if you are anything like me, most of the things you want to put in shell startup scripts are things you always want executed. Command aliases, for example; or environment variables that tell pieces of software where to find their bits (JAVA_HOME, ECLIPSE_HOME).

You could put those in both .bashrc and .bash_login, but that represents a maintenance problem: if you change something, you have to remember to change it in both places. So, you might set up a third file for global stuff, and use the shell command source to read it in from both .bashrc and .bash_login. I’ve seen some Linux distributions set this up as the default. I don’t like it, however, because it means you now have 3 different startup files floating around, and when you want to change something you have to remember which file it’s in (or sit and work it out).

The second issue with bash startup scripts is that the distinction between login shell and non-login shell isn’t a very useful one these days. Most of us use graphical user interfaces, so we never see a login shell on the machine we’re using. (For example, any terminal window you open on OS X is a non-login one.) Even when I use SSH to shell into a remote system, I don’t generally want that first login to behave differently to any other shell I start (such as shells inside screen).

What I do care about, on the other hand, is whether the shell is interactive. I don’t want my reminder program printing stuff when rsync is trying to connect and transfer files. I don’t want all my custom commands and aliases getting in the way when running scripts to configure or build software. And I don’t want to slow things down loading cdargs unless I’m actually going to be maneuvering around the directory structure by typing.

So what I want is to have a single customization script, and be able to split it into stuff that is always run, and stuff that is only run when I’m using the shell session interactively. Here’s how to do that.

Simple all-purpose bash initialization script

Start off by moving all your current bash startup scripts into a temporary directory, so you have a clean slate. Then, create a skeleton ~/.bashrc that looks like this:

### Start of universal section ###
# Commands in this section will be executed by both interactive and
# non-interactive shells.
# Commands here must produce no output, or they will break commands
# like scp and rsync.

### End of universal section ###
[ -z "$PS1" ] && return
### Start of interactive section ###
# Commands in this section will be executed only by interactive shells.

### End of interactive section ###

Next, cd ~ if you’re not already in your home directory, then ln -s .bashrc .bash_login

Now you have a single customization file for all your shell sessions, called ~/.bashrc. You can copy in each command from your old customization files, placing them in the appropriate section according to whether you need them all the time, or just in shells that you’re typing in to.

If you really care about login shells

If for some reason you do want to have login shells behave differently from non-login, that’s pretty simple too. Instead of the ln -s command above, create the following ~/.bash_login file:

if [ -f ~/.bashrc ]; then
  source ~/.bashrc
fi
# Commands for login shells only go under here

Now you have two places customization commands may be placed, but you get the option of having login-specific stuff.

Dealing with multiple systems

Another trick I use is to examine the host name of the machine. This lets me use the same .bashrc everywhere; my Mac’s .bashrc is the same as the one I use on my Linux box and the System z mainframe at work. Here’s the code:

if [ "$HOSTNAME" = "T41p" ]; then
  # Customizations specific to the ThinkPad laptop go in here
fi

You can use code like this in either the interactive or non-interactive section of the .bashrc above.

Jun 23

Getting a Second Life

Imagine a world where you could create literally anything you could imagine, and explore it in 3D. What would you make?

If your answer was “strip malls and casinos”, I know a place you’ll love.

◊ ◊ ◊

A while back I had the unusual experience of having my employer suggest that I spend some time trying out Second Life. IBM is quite interested in the commercial possibilities of 3D shared environments, and has even set up some experimental conference spaces.

I managed to get into Second Life via the experimental Linux client build. It was slow, but did the job. It was also very good at making ATI’s buggy video drivers crash. But between crashes and bouts of net lag, I managed to explore a little.

What I found was mostly depressing.

When Linden Labs set up Second Life, they had a vision of a William Gibson style cyberspace, with people flying around in 3D conducting business. So they set up their digital world as a free market, with its own currency, exchangeable for real money. Unlike the real world, however, land in Second Life isn’t purchasable; instead, you have to rent it.

This has had an unfortunate effect on the virtual world. If you want to build any kind of building, you need land. If you want land, you need to pay for it with Linden dollars. So you need an ongoing source of Linden dollars, or you need to spend real money. Hence, about half the buildings in Second Life seem to be either strip malls or casinos.

The strip malls mostly sell clothing and other accoutrements for your virtual body. If you buy a building you need land to put it on, and most people don’t have land, so there’s not much point selling buildings.

The space not taken up by casinos and strip malls is taken up by nightclubs. My guess is that they’re mostly owned by the same people who own the adjacent strip malls, and are used as a tool to stimulate the sale of fashionable clothing.

◊ ◊ ◊

I don’t want to give you the impression that it’s all commercial trash, though. There are some great places in Second Life. My favorite is the International Spaceflight Museum, which has scale models of an enormous selection of real life spacecraft. There are some nice Zen Gardens in Achemon. Braunworth has a reimplementation of the town of the first Silent Hill video game which I quite like wandering around.

Sadly, the quality of 3D objects is additionally limited by the fact that everything has to be built inside the game; there are no proper 3D tools, and you can’t (say) construct something with Google’s SketchUp and import it into Second Life.

So, if 95% of the population can’t afford land, can’t work out how to make things, and eventually get bored with watching pixels dance in a nightclub, what does everyone do? Well, mostly Second Life is a giant chat system. It’s IRC with 3D graphics. There’s nothing wrong with that per se, but it seems such a waste of a 3D rendering engine. And in practice, the 3D doesn’t really add much to the IRC experience.

There are also technical issues. Each patch of land has a limit on how many people can be in it, and the limit gets hit fairly regularly. IBM has resorted to buying a square of 4 patches of land, and building the conference hall where the corners meet. The client is also slow and chews CPU. Even on my brand new MacBook Pro, the frame rate drops rapidly as soon as ten people turn up in the same place.

So, is Second Life the future of the Internet? I’m going to say no, not without some pretty radical improvements. It’s an amusing place to spend a few minutes every now and again, but so far, that’s about all.

Jun 15

On average, computers last me for about 4 years. Last week, I was still using an 800MHz iMac.

Partly this is down to my being frugal. It’s like the TV situation, where I didn’t buy the HDTV until my family visited and laughed at the 20″ TV, and seemingly made it die of shame shortly afterwards.

Partly it’s because Macs remain usable longer than PCs. A PC Magazine survey found that Macs tend to last 3.9 years on average, compared to 2.4 years for Windows PCs. (Of course, with Linux you can keep an old machine usable for even longer.)

Partly, though, it was because I wasn’t wild about any of Apple’s offerings. The Mac Pro is too big and expensive. The current iMac is unergonomic and (in my view) ugly. The Mac Mini is too limited. The MacBook Pro series used ATI graphics. I was going to wait, and maybe get a plain MacBook as a kind of stopgap, more by a process of elimination than as a matter of choice.

Then Apple revved the MacBook Pro. They ditched the ATI graphics, and put in an LED backlit display in the 15″. I was sold. So, I have a shiny new Mac.

One advantage of making computers last 4 years is you really notice the upgrade when it comes. Going from a 16MHz B&W Mac to a 180MHz PowerPC color Mac was awesome. The switch to a wide screen and dual core CPU is almost as good. I can leave GraphicConverter optimizing PNG files, and the machine stays totally usable. Mail also flies with multiple threads able to run in parallel.

I use each upgrade as a cue to go through my files and clear up. I move old stuff to CDs, make my folder structure more consistent, get rid of cruft, and so on. This time there’s a lot to throw away, because any PowerPC Mac software I was keeping around is now obsolete. One problem area is PhotoShop Elements, because Adobe still haven’t got an Intel native version. The PowerPC one will run under emulation, but I’d rather wait for Adobe to get their act together.

On the plus side, now I can go try all the cool stuff that has appeared in the last year or so, that was too CPU-intensive for my old machine. And maybe do an official Red Pill Intel release.

Jun 09

Friday was definitely the worst Friday ever.

I wandered in to the office with my coffee, and discovered that my main work laptop—an IBM ThinkPad, obviously—had mysteriously powered itself off overnight, instead of merely going to sleep. I booted it, only to get the dreaded Fan error message.

(If you’re falling asleep already, skip down to the moral of the story.)

A fan error is pretty much the kiss of death for a recent laptop. The quest for ever faster and slimmer portable computers means that today’s portables are designed with fans that suck cooling air through their innards. No fan means the machine overheats as soon as you do anything that strains it a bit; and that could be something as trivial as leaving a web browser running on a Flash-heavy web site, especially if you have Eclipse running in the background.

Still, I have a backup laptop, for exactly this eventuality. I keep it mostly synched up with the main one. I started transferring my recent data across. Before long I was logged in to work via the VPN.

I’d just gotten my first batch of e-mail when I discovered that a clever user had found a way to bypass ACL security and replicate an old, shut down database with a new, in production database. This had wiped a chunk of important configuration data.

I found the backup I could get at most quickly, and did a temporary restore. Then I asked a colleague to pull a more recent backup onto a spare partition of the System i server (aka AS/400), which I then used to do a proper restoration.

I had just about finished documenting what had happened and putting new precautions in place to stop it happening again, when my laptop locked up solid. I suspected the ATI video drivers, so I switched back to the open source ones (which are less buggy) and continued.

Overnight, it locked up again. This was very suspicious. To have Linux lock up once, well, that’s not unheard of when proprietary drivers are involved. But to have it lock up twice, the second time with no closed source software running in the kernel—that smelled fishy.

I ran a Memtest86 diagnostic, and sure enough: bad RAM in my backup laptop. Oh joy. I flipped the machine over and swapped the RAM with the DIMM from the machine with a dead fan. The errors continued. So, it looked like an error in the internal RAM. I took the DIMM out of the RAM slot and ran Memtest86 again. Hypothesis confirmed.

I consulted the handy Hardware Maintenance Manual. It turns out the internal RAM can be replaced too, but you have to remove the keyboard to do it. So, I did that and swapped the internal DIMM. This time Memtest86 still looked good after a couple of minutes, so I powered off, put the second stick of RAM back in, screwed everything back together, and now I have it running an exhaustive test.

Monday, I’ll get the dead laptop and bad RAM shipped to the service department.

The moral of the story: Always buy the extended warranty on a laptop. Even the best ones are significantly less reliable than desktop systems; they are more prone to overheating, and their tiny fans tend to get clogged easily or simply burn out. When something does go wrong, laptop parts are significantly more expensive than desktop parts. Repairs frequently involve motherboard or display module replacement, and can easily cost as much as the machine is worth.

Feb 28

Running OpenSuSE? Suddenly getting a message about MISSING KEYS: GPG#6b9d6523 from APT or Smart? It’s because the OpenSuSE maintainers have failed to include all the necessary keys in their repository.

Solution:

  1. Download GPG key 6b9d6523 manually, say via wget -o key.txt "http://pgp.mit.edu:11371/pks/lookup?op=get&search=0x6B9D6523"
  2. Use rpm --import key.txt

Posted here for the benefit of people Googling the problem. Share and enjoy.

Feb 28

At the weekend I decided to give in and get a USB keyboard. I went to Fry’s, hoping to find something suitable, but fearing that all they’d have would be Microsoft keyboards.

I know Microsoft’s hardware quality is better than their software quality, and their keyboards are definitely much better than the trash you typically get with a new PC. They are also to be commended for providing a reasonable ergonomic layout at an affordable price. However, I just don’t like the key mechanism; there’s too much resistance, and it feels cheap.

The keyboard isle at Fry’s had a pretty good selection, including exotic gaming keyboards, glowing l337 h4×0r keyboards, and the extremely overpriced Logitech diNovo Edge.

After some hands-on testing, I settled on a Kensington SlimType keyboard. It’s basically the same mechanism as an IBM ThinkPad laptop, but as an external keyboard. It also manages to provide a full keyboard, with number pad, in a lot less space than my IBM Model M. I was frankly gobstruck to note that it was only $30. I may end up getting the Mac version for the other half of my desk.

My Linux keyboard problems went away immediately with the new device. No more unexpected screenshots or X locking up. I even managed to get all the fancy extra keys working; I can type Euro characters with the Windows key, and accented letters with the menu key, thanks to KDE. Getting the multimedia keys working was a bit harder, and required a ~/.Xmodmap file:

keycode 174 = XF86AudioLowerVolume
keycode 176 = XF86AudioRaiseVolume
keycode 160 = XF86AudioMute
keycode 162 = XF86AudioPlay
keycode 153 = XF86AudioNext
keycode 144 = XF86AudioPrev
keycode 223 = F14
keycode 161 = F13

These keycodes seem to be fairly standard for multimedia keyboards (they match what someone reports for a Dell keyboard), so they may be useful to other people. I made the moon key (161/F13) turn the laptop display on and off. The rightmost multimedia key is presumably supposed to be for firing up your MP3 player, as the icon looks like something rectangular with buttons. I decided to make it fire up Nonpareil, an HP calculator emulator, in HP-16C mode.

So far the new keyboard is working out well, apart from my hands having to get used to a new layout. So if you need a compact keyboard, the Kensington is recommended.