Friday, February 29, 2008

Vince Dean

Last night, Vince came to Hacking Society, to pick my brain about bug tracking, software configuration management, and how set up software processes in smaller groups without forcing structure down people's throats and spending all your time working on things that are basically overhead.

Me, I like Software-as-a-Service (SaaS) for that: Google Apps, CVSDude, and so on. They're cheap-to-free, and they offload the maintenance burden on pros with economy of scale.

Of course, as with all Hacking Society meetings, we also ate, drank coffee and beer and played with other toys. Here's Vince, playing with Kevin Fenzi's OLPC.

Using $PATH

Linux, like Unix, finds commands by searching $PATH.

A disadvantage of this is that I have to ask where a command is. The classic
$ /usr/bin/which rm_bad_symlinks
works, but requires forking a new process.

The builtin type is faster, but the syntax of the returned answer is awkward.
$ type rm_bad_symlinks
rm_bad_symlinks is /home/jsh/bin/rm_bad_symlinks
And type --path does what I want, but it's awkward to type. I step around the problem with an alias:
$ alias which='type --path'
$ which rm_bad_symlinks
The difference in real cost, on a single-user machine, is completely inconsequential, yet because I feel like it's near-free, I use it all the time.
$ cat $(which rm_bad_simlinks)
# $Id: rm_bad_symlinks 363 2007-06-01 14:30:50Z jsh $
file * | perl -F: -lane 'unlink $F[0] if /broken symbolic link/'
$ vi $(which rm_bad_symlinks)
and so on.

This is me fooling myself. I'm calling which in a subshell, so it's actually invoking /usr/bin/which (Aliases are strictly interactive, and confined to the current shell.)

Yet, it changes how I behave. Go figure.

On the opposite side of the coin, $PATH lets me write cleaner scripts, because I can say exactly where I'm taking commands from without jumping through hoops.

I read through a longish script yesterday, in which the first half of the script parameterized command names, and the second half used those parameters.
${MOVE} foo.conf /etc
and so on.

(This kind of thing was arguably useful in the old days, when different vendors would install standard programs in idiosyncratic places, but the LSB has done away with most of that.)

Here's how I'd write it:
export PATH=/bin:/usr/bin
mv foo.conf /etc
It's easier to read and much shorter, but still just as safe and just as correct.

Thursday, February 28, 2008

Dave Brown

Speaking of smiles, here's my favorite dance fiddler, Dave Brown.

Dave was an English major in college. He became a union carpenter but then he got a wood allergy, so he turned himself into a computer wizard. Now, Dave works at NCAR.

I was weeding my bookshelves, last week, and found a bound set of notes for a Unix course Dave and I taught at the University of Colorado. Inside it were course evaluations. Someone thought Dave needs to be more organized.

Dave says he agrees.

Come to my house Wednesday nights if you want to play tunes with him. I always do.

Smile-Detection Software

Tom Christiansen brings to my attention a new step in camera technology: smile-detection software.

This brings a topic almost full circle:

The Expression of Emotion in Man and Animals, by Charles Darwin, talks about the biology of things like facial expressions.

You can look at Darwin's books as his exploration of different ways to reason about deep time -- timespans longer than you can observe in the laboratory. How do you figure out how soil is formed, a process that takes place over decades? See his book on earthworms. Coral reefs? See his book on, well, coral reefs.

How can you separate out learned from innate in facial expressions? Darwin notices that blind people smile and frown. Clever dude. There's much more, but, again, see the book.

Not only does the book include written reports of interesting data, insightful reasoning, and biological illustrations, but he brings in new technology in the service of science: 19th-century photographs of people smiling.

Wednesday, February 27, 2008

Pete Ruether

Here's my boss, Pete Ruether, explaining. How can you not like a guy who explains with his thumbs?

Ignorance is Bliss: Setting Up My Home Network

An advantage of being perpetually ignorant is that I always have something cool to learn.

Networking has always been a mystery to me, but I'm now making inroads. With a little help from my friends, I can now ssh into my home network.

I reasoned that since I work on embedded systems, I ought to be able to install open-source firmware in my home devices, so I bought a Linksys WRT54GL wireless router, on special, did a massive upgrade by installing DD-WRT, and now have a very fancy router/firewall.

Scott Mann gave me some CAT-5 ethernet cable, which Kristina and I ran around the house with Christmas-light holders, so two of our boxes are now connected wired, and one, wireless.

Setting up ssh was trivial. I'd done that before. Doing so lets me get into one box from another within the home network.

CUPS let me hook the printer to one of them and use it from any of the others, so I have a network printer.

Vergil Mueller had figured out how to use Dyndns, and showed me, so I got a domain name.

Dean Johnson came over after work and helped me configure the router so I can ssh in, through the firewall, to each box individually: different ports on the outside go to different boxes on the inside.

Besides the fun of doing it, all this brought an unexpected psychological side-effect. While I was at Stellar Days and Nights, last week, Dean massively reconfigured our network, at work. Stuff's still not all working again. But now, instead of just feeling frustrated, I'm interested.

Tuesday, February 26, 2008

Belt and Suspenders Software

CVSDude hosts my Subversion tree. They do off-site backups every 10'. They probably use svnsync, and they're distributed over three continents, so that counts as off-site.

Me, I wanted to learn how to set up and use svnsync, too, so I synchronize with CVSDude every 15'.

I also pull a snapshot of all our modules, as a tarball, once a week, and put it on a DVD. When I pull the tarball of the module, I verify it against the MD5 sum that CVSDude has made. (I talked CVSDude into publishing an MD5 sum of each of their dumps.) Before I put it on disk I verify that I can use that dump, by turning the tarball back into a repository and checking out a tree. Finally, I check the MD5 sums on the DVD that I write.

I have found problems (though only occasionally) with each step, and been able to detect and fix them.

I don't do all this because I have great forethought -- I've just watched things go wrong, and I know what works. Wisdom from experience.

For releases, I also archive a copy of the built tree on a corporate server, and save the packaged release on a different server. These releases are tagged in the SVN tree, so I could reproduce them from source, but it's nice to have the two intermediate steps -- built but not packaged, and packaged for release -- to debug process errors when they occur, and to let me, or my developers, look at releases quickly, when there's an emergency.

I've found problems and debugged problems there, too.

When I first came to Aztek, we weren't even backing up our source tree.

Yesterday, when our IT folks discovered that the packaged releases weren't being backed up, and they may have lost them, I thought, "Heck. Well, though, it's not like I don't have a safety net."

Monday, February 25, 2008

Shannon & Charles

Shannon helps giant government bureaucracies figure out how to administer the retirement plans for armies of retired bureaucrats. Charles is a Linux geek, like me. Even a poor tailor deserves some happiness.

I took this picture sideways, to find out if I could rotate pictures. Looks like I can.

I'm not, however, crazy about the way the text wraps around this rotated picture.

Thursday, February 21, 2008

How to Write Shell Scripts

A friend posted a note on the BLUG mailing list about a shell script he was having trouble with:


declare -xi total=0
declare -xi count

cat /tmp/orders | while read file;do
wc -l /dgorder/$file;
done | while read count file;do
total=$((total + count))

echo "Number of Orders: $(wc -l /tmp/orders | tr -s ' '|cut -d' ' -f2)"
echo "Total Documents: $total"

/tmp/orders is a file that has a filename, one per line

Each /dgorder/$file has a number of records in it and I'm trying to
count the total number of records in all the files.
It wasn't working. Here's my solution, with commentary

You're just trying to be too clever. Here's an easier way, done by, "recall the line and add something." Programming by accretion. :-)

$ cat /tmp/foo
$ for i in $(< /tmp/foo); do echo /etc/$i; done # Want to ensure they exist? s/echo/ls/
$ wc -l $(for i in $(< /tmp/foo); do echo /etc/$i; done)
39 /etc/fstab
81 /etc/group
54 /etc/passwd
174 total
$ wc -l $(for i in $(< /tmp/foo); do echo /etc/$i; done) | perl -lane 'print if s/ total//'
$ total=$(wc -l $(for i in $(< /tmp/foo); do echo /etc/$i; done) | perl -lane 'print if s/ total//')
$ echo $total
It shows how I start out writing all of my shell scripts: on the command line.

At this point, I can use the bash built-in, fc, to put the code into a file, and save it as the core of a working script.

As an added bonus, he told me he debugged his, after he'd sent the note, but it was a factor of ten slower than mine.

Still, in most of my code, what's important is speed of development. I could probably, make it even faster, but only with more work. This really did only take the half a dozen steps shown above to develop.

Marcia and Tom

I like this picture of Tom and Marcia. Some of that's because I like them, of course.

The picture of the shadow's not great, but it's got potential.

Wednesday, February 20, 2008


I find myself looking at pages that I want to email to myself or someone else. Here's a trick I just tried that works.
  1. Drag the icon from the URL bar to the bookmark toolbar.
  2. Go to my gmail tab.
  3. Drag the bookmark to the email message.
Sure there are other ways. But with this one there's no "Which button do I click? Which menu item do I choose?" So simple and intuitive, I can tell my sisters over the phone.

Here, for example, I've used the same trick to drag a site to this blog post: Simply Unstoppable: INTELLECT: Speed reading

Tuesday, February 19, 2008

The Daemon, the GNU, & the Penguin

Peter Salus has given me books over the years (his shelf overfloweth), so when I was thinning my bookshelves, I sent him a note asking whether he'd like some of the stuff I was tossing. Instead, he sent me a MS he's working on, The Daemon, the GNU, & the Penguin. If I were Tux, I'd rather be the lion than the wardrobe, but your mileage may vary.

Most of the chapters are dry, but that's okay. There are no flashing ideas in a table of integrals, either, and a table of integrals is quite useful. The book is a brief but solid history of the early developments that led to Linux. Someone needs to get that stuff down accurately, and Peter's the someone to do it.

Friday, February 15, 2008

Command Not Found -- Okay, Where Do I Find It?

Okay, Debian (and, therefore, Ubuntu) has more packages than anybody, so if I need a Linux command, it's out there somewhere. But where?

Someone's created a lovely hack that solves this problem. It comes on Ubuntu by default.
$ foo
bash: foo: command not found
$ kedit
The program 'kedit' is currently not installed. You can install it by typing:
sudo apt-get install kedit
bash: kedit: command not found
The details of how this works are in the bash man page -- look for command_not_found -- and there's a discussion here.

This won't solve all my problems, since commands are sometimes not called what I think.
$ flash
The program 'flash' is currently not installed. You can install it by typing:
sudo apt-get install kmd
bash: flash: command not found
$ apt-cache search kmd
kmd - Komodo Manchester Debugger
The package for Adobe's Flash player is called flashplugin-nonfree
But I guess I should be installing gnash anyway.

Thursday, February 14, 2008

Learning the GUI

The shell is my IDE.

I'm a command-line guy; I've been typing ls and make for 25 years. I type in for loops at the prompt. I develop my shell-scripts by writing one-liners, editing them until they're right, and then popping them into a file.

I am fresh from the backwoods, half-horse, half-alligator, a little touched with the snapping turtle; can wade the Mississippi, leap the Ohio, ride upon a streak of lightning, and slip without a scratch down a honey locust; can whip my weight in wild cats, --and if any gentleman pleases, for a ten dollar bill, he may throw in a panther,--hug a bear too close for comfort, and eat any man opposed to Jackson.

Oh, sorry. I got carried away.

Migrating to a graphical user interface is harder for me than for most, because I don't need it.

So, I've decided to learn how to use the Gnome GUI because, even though I don't need it, it sounds like it'd be fun.

Now, every morning, I go to the desktop (ctl-alt-D), open my bookmarks (ctl-B), select my Docs folder, double-click on an OpenOffice spreadsheet to "open it," and enter my weight and pedometer reading.

I know how to create new Places/Bookmarks. I can drag-and-drop files and folders into other folders. I can use ~/.hidden to hide files.

It's different. It's fun. I can now better help friends and relatives, who see the command-line as "bringing up a DOS window."

Wednesday, February 13, 2008

Sam Broyles and Dan Levinson

Saturday, I hosted a banjo workshop, by Dan Levenson. I just supplied the house and the food. Sam Broyles made it all happen, and brought the cooler of beer.

One student drove up from the far south-end of the state; one drove down from Wyoming.

Dan brought the banjo.

Sam's a telecom architect and bouzouki player, and he puts together concerts for the Black Rose Acoustic Society. Dan's a banjo player and a banjo player, and a banjo player.

I've known Dan for longer than he's known his wife, Jennifer. I've known Sam's wife, Pat, for longer than she's known him.

All day long, the house was filled with music and the smells of cooking. What could be finer?

Dan's beginners' workshops are sometimes called "Meet the Banjo." Meet Dan's banjo.

The tune is John Brown's Dream.

John Brown dreamed.
John Brown dreamed the devil was dead.
Who's gonna marry?
Who's gonna marry Lulu gal?

Browsing man Pages in the Editor

I don't like using more or less to look through man pages. Like info, it just gives me one more, not-quite-familiar set of keystrokes to learn for looking through text.

For years, I'd just save the formatted page, strip backspaces and fake bolding with col -b, and then pull it into the editor.

Today, I use an environment variable to tell man that I want it to do all that for me. Here's how to do it for vi, which is now in my firmware. If you use emacs or kate or gedit or something else, and know an incantation, post it in a comment.
$ export PAGER="/bin/sh -c \"col -b | view -c 'set ft=man nomod nolist' -\""

Tuesday, February 12, 2008

Bryan Buus

I had dinner with Bryan Buus on Sunday. Bryan and I were both actors in the Cecil B. DeMille epic, Barbie's Guide to Linux. He's also V.P. of Engineering at Adeptive Software.

I'm trying to twist Bryan's arm to start showing up at Boulder Linux Users Group Meetings.

His company's home page says they're hiring -- maybe he could come announce that.

cdjob: Another Multitasking Tool

Have you ever started a long, background make, switched to a different directory to do some work, moved around a bit, and then thought, "I need to look at a file in the make directory"?
$ make &> make.OUT &
[1] 25009
$ cd /tmp
$ cd /etc
$ cat make.OUT
cat: make.OUT: No such file or directory
At this point, I used to do something like this:

$ jobs
[5]+ Running make >&make.OUT & (wd: /home/jsh/tmp/bar/mumble/frabitz)
$ cd /home/jsh/tmp/bar/mumble/frabitz
To save myself some typing, though, I use

$ cdjob %5
Here's cdjob(), which I define in ~/.bashrc
cdjob ()
local d;
: ${1:?"usage $FUNCNAME %N"};
d=$(jobs $1 | perl -lane 'print "cd $1" if m/.*\(wd: (.*)\).*/');
test "$d" && eval $d

Monday, February 11, 2008

Parallel Trees

I work in forests. I'll often have two or more, parallel, build trees that I'm doing different things in, which I need to switch among.

The Korn shell has a two-argument cd command for this kind of work.

If my two trees are ~/work/Hello/ and ~/work/Goodbye/, and I'm buried deep in
~/work/Hello/foo/bar/mumble/frabitz/ , the command
$ cd Hello Goodbye
will teleport me to ~/work/Goodbye/foo/bar/mumble/frabitz/ .

After I switched to bash, I wished, for years, that I still had this. I even wrote functions that would let cd handle two arguments, though they sometimes had subtle bugs.

Then, one day, I realized shell string substitution gives me the same thing, right out of the box.
$ pwd
$ cd ${PWD/Hello/Goodbye}
$ pwd
There's a "not seeing the forest for the trees" joke in here somewhere.


Here's the paella Tom Chrisitansen served at his birthday party.

Saturday, February 9, 2008

Trajan (Sucks)

After posting a link to a video, yesterday, I thought, "Everyone else just embeds YouTube videos on their sites. How do you do that?"

Answer: Snarf-and-barf. There's code on every YouTube page that says "Embed."

Here, for Jeff Copeland, my favorite type-and-typesetting guru, is a video about a font. That sucks. (The font, not the video.)

Friday, February 8, 2008

Ken Farmer

Here's Ken Farmer, IBM-er and fellow Jarhead.

The last time I saw Ken was in Manitou Springs, at a fondue restaurant.

"What are you doing here?"


I was playing for a dance, that night, in Colorado Springs. Turns out Ken lives down there, and mostly works from home.

I'm playing another dance in the Springs, Saturday after next, so we're going to meet for supper and have some more fondue.

Count the Ones

"Got a minute?"

A co-worker stuck his head in, yesterday to ask if I could tell him how to count the numer of 1's in a binary string, like "00101101," in a shell script.

"Isn't there a way you can split the string up in Perl?"

"Yeah, but hang on, let me play for a second .... Okay, try this."

$ x=00101101
$ echo ${x//0}
This strips all the 0's.

Now, we just need the string length

$ y=$x{//0}; echo ${#y}
We can wrap this all in a function
$ ones() {
> local y=${//1}
> echo ${#y}
> }

$ ones 00101101
All this is with shell built-ins, so it's fast, too.

In a little more detail, here's the part about stripping the 0's.

This is basic string substitution

$ echo ${x/0/P}
and here's how you replace all the 0's, instead of just one

$ echo ${x//0/P}
so you can replace them with nothing

$ echo $x{//0/}
but the final slash can be omitted if there's no replacement
$ echo $x{//0}

Thursday, February 7, 2008

A Home Network!

Yesterday, after work, Dean Johnson, our system administrator, dropped by, and we spent an hour or so playing with the settings on my QWEST DSL modem, an Actiontec GT701, and my WRT-54GL router, which is running DD-WRT.

Success. I can now get to my home boxes from the outside. Aaaah.

I have 3 laptops connected to the network, and can log into each, separately, from the outside. They have static DHCP reservations, which means that when I reboot them, they'll get the same IP address every time.

When Vergil Mueller and I were playing with this, over the weekend, Vergil showed me how to sign up with DynDNS, so I even have a DNS name to ssh to.

This Linux box, and Kristina's mac are wired right into the router; my other mac, I run wireless.

I can ssh to all three from my work machine. I no longer have to think, "Shoot, I left that on my laptop. I'll have to drive home."

Plus, I now understand my home network better.

Some of our success was luck; there's one piece of the setup that we got right, but don't really understand. Still, it's working perfectly. This morning, we'll ask Scott Mann to explain what we did to us.

Even without complete understanding, though, my home is now part of the internet.

My Work Slippers

Browsing the scratch-and-dent section of Lands' End, I found this pair of slippers. Originally $50, they'd cut the price to $10. I had a $10 gift certificate, from a recent purchase, so I bought them. They made some kind of mistake in the process, so they offered me free shipping.

I still had to pay the tax, but the total charge on my credit card was under a buck.

They're all-weather slippers, so I can pop outside in them to go get something I left in the car. They fit snugly, have rubber soles with a tread, and they're lined with faux-shearling fleece. Very comfy.

I brought them in to work.

Now, when I get into work in the morning, I unlace my boots, take them off, and pop on my slippers.

They're comfy, I've made the transition to work, and work feels just a little nicer.

Yesterday, I had an annoying commute to work. Once I got in, I put on my slippers, poured myself a cup of coffee, and noticed myself starting to smile.

Little things can count.

Wednesday, February 6, 2008


I spent Mardi Gras playing with PXEboot ("pixieboot").

The goal was to be able to turn on a box from the factory, plugged into the LAN, and have it automatically install a pre-set, Linux configuration onto itself. The stuff needed to do this is wired into the BIOS of modern computers: just like the ability to boot off of a CDROM or, when I'm lucky, a USB key.

The steps, approximately are this:
  1. adjust the bios setting to permit a pxeboot, plug it into the network and turn it on.
  2. as the box comes up, it asks an appropriately-configured dhcp server for the location of a bootable image.
  3. the dhcp server points the box at a tftp server that has all the necessary stuff.
  4. the box pulls a kernel from the tftp server, and then boots, with the specified boot parameters. Linux is now running in memory.
  5. the boot parameters tell the now-running box where to find a kickstart file with instructions for a full installation.
  6. the kickstart file tells the box where the kernel and all the RPMs are for packages, what packages to install, what users to add, and so on.
  7. after all these steps are executed, the box is running, its hard disk is populated, and it's ready for a reboot.
So, once the servers are configured creating a new box with a standard configuration looks like this:

Unbox the machine, set the bios, plug in the ethernet cable, cycle the power, and come back in ten minutes or so.

Ethan McCallum's O'Reilly "book," Managing RPM-Based Systems with Kickstart and Yum, saved me a lot of time, even though the details have changed since it was written. It comes as a 47-page pdf (only!) and costs $10: plenty of book, and not much money.

Pretty nifty: push-button Linux installation from a network server.

Once this was up and limping, I gave blood at Belle Bonfils, went to my caucus, threw a Mardi Gras party, ate too much king cake, drank too much champagne, and stayed up late. Now I'm bloated, hung over, and haven't had any sleep.

If I were Catholic, it'd motivate me to give up stuff for Lent. I know: I won't go to any more political caucusses until Easter.

Except I think my precinct made me some kind of delegate to something. Oooh, my head.

Tuesday, February 5, 2008

Scott Mann

Scott knows a lot, and speaks very softly. He will go far.

He's also terminally nice. Who wouldn't look up to Scott? So here's a picture of him, taken from below.

Where Is That Command?

A lot of my life is looking through scripts: reading them, writing them, editing them. At work, most of the commands I use are scripts I've written or am working on. It's my job.

Systems administrators, testers, and configuration managers will know what I'm talking about.

I know the name of the script that isn't working, now I want to work with it. Where is it?

The old-fashioned way to find a command is this:
$ which ooffice
The shell built-in, type is much faster than which, so I tried converting to this:

$ type -path ooffice
but old habits die hard, so I put alias which='type -path' into my ~/.bashrc, and went back to using which.
$ alias which='type -path'
$ which ooffice
To look at the contents, I do this:
$ cat $(which ooffice)
export OOO_EXTRA_ARG=''
/usr/lib/openoffice/program/ooqstart "$@"
For editing it, I invoke an editor instead of cat. Take your pick: vi, emacs, gedit, ...

Monday, February 4, 2008

Vergil Mueller

Vergil is setting up his home network to let him get in from outside, through DDNS. He brought some homebrew over last night, and we spent a little time trying to ssh to his box, but failed. Then, we tried to set up my boxes to do the same thing, and also failed.

We gave up, had pizza, and played tunes. If you have a gig for us, it's still probably a music gig.

"Enterprise" Computing

My cell is my tricorder.

It's replaced my landline, my watch, my alarm clock, and my phone book. It's my camera. It's the length of my index finger.

It has a radio and an MP3 player, too, but I prefer my iPod shuffle, which is tinier, still.

It has voice dialing. If I want to call my sister, Nan, I say "Nan." It looks through the names in my phonebook, finds the one that matches, and dials her.

I have Google calendar set up to send it SMS messages to remind me of calendar events, and my to-do list, RememberTheMilk, sends me my day's to-do list every morning. Now, I always take the garbage out on time.

I also use Jott, so I can send myself reminders when I'm out and about, or send email to my boss when I'm at DIA, which still doesn't have free wireless. (Aargh.) Jott's pretty cool: it does voice-to-text, and lets me import my Gmail contacts list.
"Who do you want to Jott?"

"Pete Ruether."

"Pete Ruether. Is that correct?"



"Hi Pete. I'm on my way to Kansas, but if there's an emergency, you have my cell."

"Got it."
Pete gets email with that message as text. Email. From my cell. No typing.

SMS messages? I don't have to hunt-and-peck on my phone's dial pad. I just Jott to someone's cell number.

Now, though, Jott is starting to connect with other web services ... like RememberTheMilk.

I was just about to give a talk at the med school when my dentist called to remind me I had an appointment at 8AM, the morning after next.

"I'll never remember that," I thought, "I'd better find a piece of paper to write that down, and then stick it somewhere that I'll see it."

Then I realized I'd just set up Jott to talk to RTM.
"Who do you want to Jott?"

"Remember the Milk."
The very next week, Jott added connectivity to Google calendar.

This is the next evolutionary stage for software.

We went from desktop apps to integrated desktop apps that all worked together because they were all made by Microsoft. Then, one-by-one, webtop apps by a variety of vendors began eating the desktop's lunch. A key, early step was some interoperability with the old stuff: when you switched to Firefox, it imported your IE bookmarks. Gmail could pull your Outlook contacts lists. By-and-bye, Gmail even did POP3 and IMAP, so you could use a desktop email reader, like Thunderbird, with their service.

But having these web software-as-a-services talk to one another -- that's new. They can do it without all being owned by the same folks because they have public APIs.

The big lightbulb finally went on. I made a new entry in my phonebook.

Now, when I want to make a calendar entry or send myself a reminder, I take out my cell, hold it in front of me, flip it open, and say, "Enterprise!"

"Who do you want to Jott? ..."

Sunday, February 3, 2008

Tom Cargill

I ran into Tom Cargill at Radio Shack.

Tom thinks most of his cell phone calls are to people in the same room he's in -- he uses them when he's at Wal-Mart and Costco to find out which aisles the rest of his family have gotten themselves to. "I think the most useful button on my cell phone is 'off.' "

Tom, who's also the discoverer of the ninety-ninety rule, has a habit of being right on such things.

Me, I like mine because it replaces my watch, my phone, my alarm clock, and my phonebook. Plus, I take a lot more pix with it than I ever did with my camera. (Do you like the way the ceiling lights in this picture blend in with the post background to make it look like the top border's irregular?)

"So, how's the world of C++ and objects?"

"Boring. No one's figured out how to program multiple machines yet."

He went on to say that lots of folks have tried, and Intel's bet the farm on dual-core boxes but no one's figured out how to make programming languages deal with them in ways most of us can use: not C++, not Java, not anything else, either.

"How about Ruby? Lots of my former-Java pals are hot for Ruby."

"No, Ruby's thread model is limited to a single CPU. It literally cannot take advantage of multi-CPU machines."

Chris Riddoch was telling me, at Hacking Society last Thursday, that there's a new replacement for Ruby threads. I'll have to ask him if it addresses this.

Unfortunately, Radio Shack didn't have either the power cord or the telephone connector I was looking for. Tom looks happy because they had batteries.

Well, and, of course, he's happy to see me.

Saturday, February 2, 2008

One Keyboard, Video, Mouse, Many Boxes

I have two desktop computers at work, but only one desk.

The desktops can sit over on the side, next to the desk, but the real-estate that two monitors would take up is too much to bother with. Also, when I have more than one, I'm always reaching for the wrong mouse, or the wrong keyboard.

Real estate is limited. Location, location, location.

My salvation was a KVM (Keyboard, Video, Mouse) switch. It connects one display, etc., to both my boxes. Installation is instan. It just works.

At work, we use this one. I press scroll-lock (ScrLk) twice, and -- blink! -- I'm using the other machine.

There's a little light on the switch to tell me which machine I'm connected to, but I just use different themes for the different boxes, which makes it immediately obvious. They look different.

I've been very happy with Linksys switches and routers. Their KVM switch works fine for me, but the Amazon reviews say they've died on some folks. Caveat kvm-tor.

I can't cut-and-paste between computers. The sense it gives you is that the boxes are one, so it feels odd that I can't just clip a piece of text, switch to the other box, and paste it.

A web service is an obvious solution: cut text on one machine, paste into another, so long as both are on the web. I thought Control-C would solve my problem, but they don't support Linux yet.

I see references to Synergy, but I haven't tried it. Yet.

Friday, February 1, 2008

Alex Schaefer: "Pretty good, for a guy with an English degree."

Alex Schaefer gave a great Boulder Linux Users' Group (BLUG) presentation, a few months ago, on Xbox Linux. He and his pal, Seren Thompson, came in, did an installation, with running commentary, onto a box they'd bought on eBay. Then they gave it away as a door prize.

Some astonished guy, there for his first meeting, left with it under his arm. "But, I walked here," he said.

Last night, Alex was at Hacking Society, at Caffe Sole, with news.

A few months ago, he wrote a chat application for the iPhone, almost as soon as it came out, and put it out there for the world.

An iPhone-apps startup called him, from Los Angeles, to ask him to be a lead developer. They're moving him out. Now he's busily interviewing guys much older than he is, with masters' degrees in Computer Science, to come work for him.

"Pretty good," says Alex, "for a guy with an English degree!"

Pretty good, indeed. Get some, Alex.