Tip Jar Archives, page 3

Posts so helpful you might be compelled to tip me.

I can never remember how to create a new MySQL user

Anyway, here’s the mother-lovin’ SQL all in one place:

create database db_name;
grant all on db_name.* to 'user_name'@'localhost' identified by 'password';
flush privileges;

For simple, personal projects, db_name = user_name = password, just to make life a little easier.

Carry on.

Importing Haloscan comments into WordPress (v2.3 and up) from Blogger

Note: Even though I originally wrote this for WordPress v2.3, it continues to work for all versions of WordPress through v2.9.x.


WordPress logoWho knew that when I migrated my Blogger blog to WordPress way back when, I’d still be supporting a hacked together Haloscan importer 3 years later!

Awhile back, I don’t remember if it was during WordPress 2.2 or 2.3, the folks at Google revamped Blogger, which meant the old Blogger importer no longer worked. So the heroic coders that do the heavy lifting for WordPress set out to write the-Blogger-importer-to-end-all-Blogger-importers, this time using Blogger’s feed-based “API”.

The problem for you classic Blogger folk with Haloscan comments is that the only way to link your Haloscan comments to their post is via Blogger’s postID. Which is apparently not accessible in the feed API. Grrr. Which meant my previous hack for associating the postID with the newly imported WordPress post no longer worked.

Last night, I finally went back to the drawing board and came up with a new solution. I’ve tested it successfully on two different blogs.

Continue Reading

Web Photo Editor extension for GIMP

Updated for GIMP 2.4!

Wilbur The Gimp …or how to “Justinify” your photos
…or how I learned Lisp on a Saturday night

Yesterday I was working on a project where I needed to resize and “retouch” over a hundred photos for the web.

I tried playing with ImageMagick’s command line mogrify tool, but I wasn’t too pleased with the results—that and there’s something inherently tedious about making visual transformations from the command line. I performed the same operations in GIMP to compare, and it looked much better.

So I was confronting the idea that I’d have to manually edit all 100+ photos when I finally decided to buckle down and learn how to script GIMP.

GIMP uses Scheme (of all things) as its scripting language; Scheme being one of the two popular modern dialects of Lisp; Lisp being the holy grail of high-level programming languages (and the second oldest, after Fortran). So little did I realize, scripting GIMP was going to force me to learn Lisp…

I have to admit I’ve thought for a long time it’d be great to have a tool that brought together all of the settings I usually tweak when I’m editing a photo (color balance for brightness, contrast, saturation, and sharpening) because in GIMP they’re located deep in three different submenus. But doing one photo at a time was never motivation enough to dig under the hood. The thought of retouching 100+ photos, however, was the anvil that broke the camel’s back.

I learn best by looking at very simple but functional examples, so I started scouring the web to see what other people were doing, eventually landing on Dov Grobgeld’s Basic Scheme tutorial at gimp.org. It goes from how to add numbers in Scheme to creating your first extension in less time than it’s probably taken you to read this far. David M. MacMillan’s Some GIMP Scripts-Fu was also a great resource.

I have to say the best thing about GIMP’s extensions is that they enable the creation of rudimentary user interfaces for inputting configurable parameters. So I wasn’t limited to just my standard defaults for contrast and saturation—I could actually “build” an interface with tweakable values. Hot!

Around 3am last night, I finally put all the pieces together. Here’s what the Web Photo Editor looks like:

Screenshot of the Web Photo Editor extension for GIMP

Continue Reading

Playing with rsync on Ubuntu

Update: it was announced on May 13, 2008 that a vulnerability was discovered in a Debian patch to a library used to generate SSH (and SSL) keys. If you followed these instructions before May 15, 2008 to generate a passphraseless key, you’ll need to update your system. All you need to do is goto System > Administration > Update Manager and click “Install Updates” from the GUI (or sudo apt-get update && sudo apt-get dist-upgrade at the command line). If you don’t know what I’m talking about, you’re probably not affected.

Right after I wrote How to regularly backup Windows XP to Ubuntu, using rsync for my T42 ThinkPad, I ended up installing Ubuntu on it. In the end I was mostly interested in backing it up for the purpose of safely wiping Windows. So much for regularly.

Then something unexpected happened: I started to use my 5 year old X23 exclusively. Partly because I’d already gotten comfortable with Ubuntu on it, and partly because I was using it at the time to edit photos on the bus ride home from work. When I got home, it didn’t make sense to switch to another laptop to finish whatever I was working on.

It also may have something to do with a feeling that I think Mark Pilgrim put well:

There’s something magical about breathing new life into old hardware, hardware that you had given up on. I don’t know quite how to describe it. It’s very… tender.

So I’ve been meaning to get back to rsync to start regularly backing up Ubuntu to Ubuntu. Well my little Mini-ITX server with external hard drive is already up and running. So that half of the equation was in place. What I was a little rusty on was how to set the whole thing up to run without needing a password.

That turns out to be really easy. If you’ve got ssh, then you’ve probably got ssh-keygen, which exists for the sole purpose of generating public and private keys, which when created without a passphrase can be used for password-free logins. So I ran ssh-keygen to generate a 2048 bit RSA key without a passphrase (aka a passphraseless key). I could also have generated a 1024 bit DSA key. I’m not sure I understand the difference. I’m not sure it matters.

ssh-keygen -b 2048

Inside ~/.ssh, ssh-keygen created two standard files, id_rsa and id_rsa.pub, the private and public keys respectively. The next and final step is to copy and “install” the public key on my backup server (

ssh-copy-id -i ~/.ssh/id_rsa.pub jwatt@

ssh-copy-id uses ssh to copy the public key to the remote server and appends it to the ~/.ssh/authorized_keys file. Of course I didn’t know about ssh-copy-id when I started, so I just scp-ed the file over and pasted the public key into the authorized_keys file.

At which point I could use ssh to login without a password! ssh knows to automatically check for the existence of the id_rsa private key and try logging in with that.


Hot damn! That alone makes me want to start distributing my public key around to every server I access regularly. Of course the other benefit (and the whole point of this post!) is that now I’ll also be able to cron an rsync backup without requiring a password.

My ideal backup is a relatively current mirror of my home directory. I’m not looking for modified file snapshots or entire bootable filesystem images, I just want to know that if my hard drive crashes, most of my data (especially the photos) is recoverable. To that end, my rsync needs are relatively simple, though it took some tweaking to get to this point:

rsync -aze ssh --delete --exclude=".*/" /home/jwatt/ jwatt@

The -a option means archive files—it’s really an alias for a lot of other options having to do with maintaining permissions and timestamps, etc. The -z option uses compression when transferring files. The -e ssh option tunnels the file transfer over an encrypted ssh connection. The --delete option deletes any destination files that have been deleted from the source. The --exclude=".*/" option skips hidden files and directories. Finally the last two parts are the source (in this case everything under my home directory) and the destination I’ve already set up on my backup server.

And that’s it. I added it to my cron to run daily at 10pm. Set and forget it.

How to mount a parking permit sticker on a scooter

I think I may have found a solution to my pressing aesthetic dilemma: where to put a residential parking permit sticker on a Vespa?

It’s called an inspection plate—useful in states (unlike California) that require an annual inspection sticker displayed on your vehicle. Or in my case, a parking permit. There are several varieties and locations for mounting the plate on motorcycles, but I think this one looks the best on scooters:

black motorcycle inspection sticker plate

I ordered it this morning from J&P Cycles for only $2.99—of course shipping and handling brought the total to just over $11 and they wouldn’t let me ship it to my work address, but whatever.

Will post photos when it arrives.

Update (September 10, 2007): Woo-hoo, it arrived, just as I expected. No more living in fear of the man. Immediately broke out the toolbox and installed it between the license plate mount and the license plate.

Inspection sticker plate installed, with San Francisco parking permit

Good news is, the thing is diminutive. A half inch of the sticker is hiding under the plate—the self-obvious part that says “Motorcycle Parking Permit.” But it also meant I couldn’t use the license plate frame that Vespa SF so kindly put on my bike after having it serviced. Guess it’s time to order another accessory.

Here’s how it looks in full.

Inspection sticker plate installed, with San Francisco parking permit