Category Archives: Uncategorized


Today I link you to a video narrated by the legendary Carl Sagan – The Frontier is Everywhere.

Partial quotes:

We were hunters and foragers. The frontier was everywhere. We were bounded only by the earth, and the ocean, and the sky. The open road still softly calls. Our little terraqueous globe as the madhouse of those hundred thousand millions of worlds. We, who cannot even put our own planetary home in order, riven with rivalries and hatreds; are we to venture out into space?

By the time we are ready to settle even the nearest other planetary systems, we will have changed… For all our failings, despite our limitations and fallibilities, we humans are capable of greatness… How far will our nomadic species have wandered, by the end of the next century, and the next millennium?

Our remote descendants, safely arrayed on many worlds through the solar system, and beyond, will be unified, by their common heritage, by their regard for their home planet, and by the knowledge that, whatever other life may be, the only humans in all the universe, come from Earth.

They will gaze up and strain to find the blue dot in their skies. They will marvel at how vulnerable the repository of all our potential once was, how perilous our infancy, how humble our beginnings, how many rivers we had to cross, before we found our way.

Can you imagine seeing Earthrise?

Earthrise, 1968 December 24


Development Freedom in New Platforms

I started writing code when I was somewhere around 1st grade, hacking some rudimentary BASIC on a TRS-80. Since then, I’ve used more programming languages than I can count; everything from C to Prolog, Python to Haskell, and probably a dozen others. I enjoy diversity in programming languages and tools.

I’ve had an interest in both web and mobile development for some time, but have done little with either. Reflecting on that lately, I realize that both platforms severely restrict my freedom to use the tools I choose. Even on an old x86 with 640K of RAM, I had choices; BASIC, Pascal, and C would work under DOS. (Plus assembler, but I had yet to learn that at the time.) On Android, my choices are Java or… Java. (OK, or something that compiles to Java, but those selections are still limited.) Plus it seems like I’d have to use Eclipse, which seems to have taken the kitchen sync crown from Emacs long ago, and not in a good way. On iOS, the choices are Objective C. And on the web, it’s JavaScript.

The problem with all this is that there’s little room for language innovation on those platforms. If predictions about the decline of development on the PC pan out, how will the next advance in programming languages gain traction if the hot spots for development are locked down to three main languages? Will we find ourselves only willing to consider languages that can compile to Java/Dalvik bytecode? And won’t that put limits on the possible space for innovation to occur within?

Yes, I know about things like Mono and the Android Scripting Environment, which offer some potential for hope, but I think it’s still safe to say that these platforms are pretty closed to development in “unofficial” languages. I don’t know of major apps in the Android market written in Python, for instance.

I know of efforts such as Ubuntu’s, but even they simply lock down development to a different toolkit. There is no choice there of GTK vs. Qt, or such things.

Sadly, I don’t think it has to be this way. My phone has way more power than my computer did just a few years ago, and that computer was capable of not just executing, but even compiling, code written in all sorts of different languages.

But I don’t know if there’s much we can do to change things. Even with native code on Android, plenty still has to go through Dalvik (at least that’s my understanding). If you wanted to write a Python app with a full graphical touch interface on Android, I don’t think this would be all that easy of a task.

Sometimes, it’s best not to know

Jacob, Oliver, and I were driving back home, about an 8-hour drive. At one point I heard Jacob say from the back seat, “Oliver, you can’t have my book. It has a bookmark in it!”

Aside from the apparent anti-sharing properties of bookmarks, I sort of smiled at Jacob inventing a bookmark.

An hour later, I heard Oliver saying, “Jacob, you can’t have MY book. It has a bookmark too!”

And again I thought that sounded rather cute. The thought of traveling boys — and they did travel very well — bookmarking the books I brought for them was a nice one.

And then I realized: I hadn’t brought bookmarks. Or, as far as I could recall, bookmark-making material.

I really wanted to say, “Uhm, Jacob, just what did you make that bookmark from?” But I didn’t. I figured everyone would be happier not having to deal with that question.


One of the benefits of working from home is that I have a great view of Kansas from my desk. While I work, I have seen sunrises, snowfall, birds, rain, ice, and all sorts of wildlife. I heard this verse of Home on the Range the other day, which reminded me of this:

“How often at night when the heavens are bright
With the light from the glittering stars
Have I stood here amazed and asked as I gazed
If their glory exceeds that of ours.”

One time, I asked Jacob if I should wake him up at night to see the stars. He said an excited yes! So when it was dark outside, I woke him up, carried him outside, and held him while he looked up. He said a long, breathy “Wooooow!” Then he went back to bed, curled up with his butterfly, and fell asleep smiling. Every so often, we repeat this little routine.

There are many opportunities in life to just stand somewhere and be amazed. You don’t have to be in Kansas. Children know this. The rest of us just have to notice.

Milk, Cookies, and Delight

Sometimes an attic is all it takes to delight children.

This afternoon, the boys and I made cookies. Jacob has been talking about setting out milk and cookies for Santa Claus for several days, and of course the fact that we had made cookies reminded him of this – as I figured it would. So after the boys got into their pajamas and all ready for bed, we set out milk and cookies for Santa.

The boys have always known that Santa is pretend, but love the stories and traditions anyhow. Never mind that Christmas was 3 days ago, and they’ve already opened their presents. It’s SANTA! It’s magic! It doesn’t matter!

I asked Jacob, “Would you like me to pretend to be Santa tonight?” A big grin, then “Oh yes, dad! Do it!”

So after I read them their bedtime story, sang them a song (Jacob chose a Latin hymn – that’s my boy!), and tucked them into bed, I pretended to be Santa. I went back downstairs. I drank the milk and ate the cookies. Then I went to my small future present stash, selected a few small items, and put them under the tree. I gave it a few minutes.

Then I crept up to the attic. I snuck along the wood floors quietly, until I was above the boys’ room.

Then I jumped. And I scraped a wood chair along the floor. And then I yelled out – “HO HO HO! Merry Christmas!” I had a brief conversation with Rudolph, then made some sliding noises. I was silent for a few seconds, then made some more noise and said, “Wow, Rudolph, Jacob and Oliver left some great milk and cookies! Let’s go deliver the rest of our presents!” And made some vague sleigh taking off from the roof of a house noises.

I crept back down the stairs. I put my ear to the outside of the closed door to the boys’ bedroom. I heard Jacob excitedly jabbering, “He said milk and cookies! He liked them! He really liked them! Ooo butterfly, he was here!” (Butterfly is a stuffed, er, butterfly that he sleeps with.)

I gave it a minute or two, then I went in. “Jacob, did you hear something?”


“What was it?”

“Well, it was a loud thud! I sat straight up like this. [ he demonstrates ] Then I heard ‘ho ho ho’! And ‘milk and cookies’! And I was excited like this!” [ more demonstrations ]

“What do you think happened?”

“I don’t know! Dad, what did you do?

I told him. It only increased his delight.

“Did it sound like Santa’s sleight landing?”

“(annoyed) No, dad. It sounded like a crash. (brightening) And then Santa coming down the chimney with presents! Oh, it is so exciting!”

(We don’t have a chimney)

It was still magical, even though he knew exactly what happened.

For his part, Oliver slept through it all. He will still discover the empty plate, empty cup, and slightly less empty area underneath the tree. And neither boy knows about the thank you note from Santa yet. I anticipate smiles in the morning!

Proof Humans Are Capable of Working Magic

What an astonishing thing a book is. It’s a flat object made from a tree with flexible parts on which are imprinted lots of funny dark squiggles. But one glance at it and you’re inside the mind of another person, maybe somebody dead for thousands of years. Across the millennia, an author is speaking clearly and silently inside your head, directly to you. Writing is perhaps the greatest of human inventions, binding together people who never knew each other, citizens of distant epochs. Books break the shackles of time.

A book is proof that humans are capable of working magic.

— Carl Sagan, The Persistence of Memory

Unreported Disk Data Corruption – Kernel Bug?

Well this is new, and I’m utterly baffled. Here’s a file that’s not in use by anything.

$ md5sum xppro.vdi
589cbb5501dcddda047344a3550aaa95 xppro.vdi
$ md5sum xppro.vdi
a69806ec60d39e06473edbb0abd71637 xppro.vdi

Every time I run md5sum on it, I get a different answer. Same story with sha256sum. If I grab just the first 100MB, it gives the same answer each time. dmesg doesn’t show any sort of errors whatsoever during the time I’m running the tools. The file is 13GB, and was copied from one laptop to another (the new one being a Thinkpad T420s). The old laptop gives the same answer every time. The new one doesn’t.

I’ve put the file on different ext4 filesystems on the same machine (one using LUKS encryption, the other not, both under LVM) – same result. This will have also guaranteed different placement on the underlying hard disk.

I verified that nothing is modifying the file by using lsof and inotify. The system is a freshly-installed Debian wheezy running kernel 3.2.0-1-amd64. Any ideas how I go about troubleshooting/fixing this? So far I don’t know if it’s hardware or software, though my gut says software; SMART isn’t showing issues here, and the kernel didn’t log hardware issues, either.

Timelessness of an Old Pickup

Our society is one that is pretty well defined by timeliness. TV programs start at a precise time, down to the second. Schools have elaborate timekeeping systems. Even church services are carefully timed. We know how fast we’re going, and our GPS or phones tell us when we’ll get there. And we’re pretty confident that we will, in fact, get there.

Somehow this doesn’t apply to our pickup.

This pickup, in case you’re wondering, is a thing of… stories, shall we say. After a particularly frustrating experience with it one week (oh yes, the battle extended several days), I likened it to the Greek gods. And Terah had a good laughing fit when I began a sentence with “The reason there’s a towel connecting the brake pedal to the steering wheel…”

But I guess the thrifty side of me won out, and somewhere along the line, I relented. My brother fixed up the carburetor. I got it a new battery. The flat tire is repaired. The starter broke, and I got it replaced. And I even got an oil change. Fancy, I know.

So today, when I needed to take some backbreaking junk off the yard, I was hoping the pickup would work. I hadn’t driven it in months, and any manner of catastrophe could have struck it in that time. So I was mildly relieved when it started on the 6th try. That is, quite seriously, quite the improvement, and shows how skilled a mechanic my brother is.

The speedometer, of course, isn’t working. The odometer stupidly reads “21531” or something like that (it was only a 5-digit odometer, broke long ago, so who knows how many miles it really has.) And I like to keep things like grease and heavy ancient air conditioners (one of the things I was hauling) away from my watch, so I wasn’t wearing it.

The result: I have no idea what time it is, how fast I’m going, when I’ll get there, IF I’ll get there, or all those things.

I set out, and made it a good half mile before it died as I was rounding a corner at the bottom of the hill. Always a great place for a finicky old stick-shift vehicle to die, right? Anyhow, a few random adjustments to the choke later, and the thing sputtered then roared (and I do mean roared) back to life. A little lurching up the hill and I was back on my way. Now, I was stuck there in the middle of the road, but it was a country road, so I’d have probably had a good hour to get it fixed before worrying about blocking anybody’s way.

My first stop: my great uncle’s place. He has a “scrap metal for charity” project going on. He is looking for old motors, air conditioners, dehumidifiers, etc. He takes them apart, separates out the metals, sells them, and donates the result to MCC, a world relief agency. I knew I had an old dehumidifier in the basement, and thought I remembered seeing an old window air conditioner in the elevator. That thing is probably the single heaviest object I have ever moved without help. I have a bandaid to prove it. It was way too heavy to carry, so I kind of rolled it, side to side, from the side of the elevator on to the pickup. If you were watching, you’d have heard me making struggling noises, followed by “BANG rattle rattle rattle… pause… struggling noises…. BANG rattle rattle rattle” as I “rolled” it along the ground, and waited for the internal bits to settle after each quarter turn. So anyway, eventually I got it to the pickup, and then had the sickening realization: I have no way to get this thing up there. Oops.

I eventually placed it on top of an old tire rim, balanced it there as I knelt down, and somehow — still not quite sure how — managed to lift the entire thing a few feet until I could get some leverage to shove it onto the pickup. I later commented to my dad that it was a Chrysler brand air conditioner, somewhat to my surprise, and he said that it was probably my great-grandpa’s. That was a surprise.

Anyhow, back to the pickup. I drove down the few miles to my great grandpa’s place, not really knowing how fast I was going. I smelled the familiar smells of the old pickup: exhaust fumes, oil on hot surfaces it shouldn’t be on, a touch of hot antifreeze. You never have any doubt about whether the engine is running.

It was sort of nice to not know, or particularly care, how fast I was going, or what time it was. Sometimes I’d idly wonder, but you know, it didn’t really matter and there wasn’t a thing I could do about it anyhow.

I got to uncle’s place, unloaded the junk — sorta dropped the air conditioner off the back of the pickup with a terrific BANG, then rolled it all the way to his trailer — and got back in. On to town. I hadn’t put gas in the pickup in a few years, and I suspected it was getting low. (The gas gauge, you guessed it, doesn’t work right either.) Plus we had some large recyclables built up and it was time to get rid of them. And for that, I had to drive on the highway a ways. The speed limit there is 65MPH. I have no idea how fast I was going, but it wasn’t 65. Maybe it was 45. I got passed a lot, but nobody looked particularly surprised that a pickup that looks like mine wasn’t going 65.

Partway there, I smelled a different smoke smell. Not an oil smoke, but more of a grassy or wood smoke. Hmm, I thought. That’s odd. Hope it’s not coming from the pickup. I didn’t really see smoke anywhere else, so I just drove on until I couldn’t smell it anymore.

I unloaded the recyclables, then went to the gas station. As the pump readout neared $50, I decided: 1) the gas tank really was pretty empty, and 2) I just can’t put more gas in it anymore. That would be more than the truck’s worth. So I drove home.

The drive home was into the wind. My face got pretty cold – I always drive with the windows open to prevent carbon monoxide poisoning (remember the fumes?) I got home and prepared to pack up the pickup – close the windows, replace the bungee cord holding the brake pedal up, etc. I then thought I’d have a look under the hood to see if there was anything, well, on fire. Nope, but there was a packrat nest that fell down as soon as the wind hit it. Source of grassy-smelling smoke identified.

It’s amazing what difference simple lack of knowledge makes sometimes. Not knowing what time it is or how fast I’m going means I don’t have to worry about those things. I wonder how society has changed simply because accurate and cheap watches are available. I kind of like driving the old truck. It’s a bit of an adventure, a bit of a challenge, a bit of randomness, and a bit of an escape from the normal and predictable. Not a bad deal for a $75 vehicle.

Please. Stop. Removing. Features.

apt-get dist-upgrade is getting a little less fun these days.

It’s not because of a problem with Debian or with apt-get. It’s because of things upstream authors are doing.

It seems that upstreams, for some reason, like to remove features from new versions of software.

The two recent examples to bite me are the removal of the Gnome Terminal features to play the bell through sound card rather than the console speaker, and the recent upgrade to gtkpod — the best iPod music manager out there — which removed the ability to actually, well, play music. Wha…?

Earlier examples where when Gnome removed the ability to type a filename in the Open dialog box (remember that? thankfully reverted eventually.) KDE 4 was infamous for this too, with maybe thousands of instances (and they broke Amarok so badly that it didn’t actually play music from my devices either.)

I don’t understand this. The Gnome people somehow thought that they knew better than I what options I might want, I guess. But I am totally baffled about gtkpod. All it ever did was call xmms (or something like it such as qmmp) with appropriate arguments to play a file. Simple, configurable, and supremely useful. Probably just a few lines of code. And even that is gone.

There is a post by Ingo Molnar complaining that perhaps Gnome and KDE are trying to mimic the Apple and Google result without internalizing the process. Perhaps. It all seems so baffling to me though.

Updated: rewrote introduction.

Complete.Org Migrated To Different Continent, 15 minutes downtime

It’s time to change locations for my server. I’ve been with CoreNetworks for almost 5 years. They provide a good value, with fully dedicated servers a lot cheaper than most places, and good support to boot — targeting people that can handle root on their own box. I’m switching, though, to Hetzner Online (of Germany), primarily because I am needing more than 1GB RAM, and they can provide a 2GB box for less than I pay now for 1GB. I asked for feedback on Google+, and got positive feedback. Today, I migrated from one machine to another, copying a dozen or two GB of data, and only had about 15 minutes downtime.

I was able to do this without console access to the source machine, though console access wasn’t really required for either. This will work with any basic Linux install on the destination, or it could be prepared directly from a rescue environment.

Before I explain how I did it, I thought it was interesting to think of the different places that the machine that was known as has lived over the years. Here’s a map (click for detail):

Here’s the general process.

First, well in advance of the move, crank the TTL on the domains way down. This way, old IPs won’t be cached for very long once the system moves.

Next, start rsyncing data from the old machine to the new. Do not yet shut down daemons on the old. Shut down as much as you can on the new. You’ll want to focus on static data, such as /home. /usr is a good candidate as well. /var if you are selective — databases may be a good candidate, or may not. The idea is to seed the destination with data so that when we do the “real” rsync, most of the data will be there; it will have to tidy things up after daemons are stopped, and update some things, but the bulk of the work should be done.

Next, start preparing some exclude lists for the final rsync, which will copy an entire machine to the other. You will likely want to exclude files such as /etc/fstab, /etc/network/interfaces, /etc/resolv.conf, /etc/hosts, /etc/default/grub, /sys/*, /proc/*, /dev/*, and the like. I used rsync -v -P -a -H -A -X -S –numeric-ids –delete-after.

Now, start editing config files for the new IP, but do it on the old server (these will be synced over to the new one). Start with the bind config files, and touch anything else that needs it — maybe Apache configs, whatever.

Next, get ready to do the final sync. In an ideal environment, we’d just shut both machines down to single-user mode, but that’s not going to quite cut it here. Use ps and shut down all daemons except sshd and udev on the destination. Yes, including even syslog. This is to prevent anything actively accessing the disk during the rsync, and also to prevent any issues with clients accessing server daemons that aren’t ready yet.

Now, on the source machine, reload bind. This will start answering DNS queries with the new machine’s IP, and should also propagate the changes to your secondary DNS. Next, kill off all the daemons on the source machine, except for ssh and bind. You might want to set /etc/nologin to prevent regular users from logging in on ssh, if you have them. Now rsync things over to the new machine. Do any final tweaking over there (merging in /etc/hosts maybe, dealing with the udev rules.d persistent net thing, etc.). Reboot the new server and you should be up and running.