<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6254179</id><updated>2011-12-14T22:06:34.647-05:00</updated><title type='text'>Undefined Value: Kris Johnson's Blog</title><subtitle type='html'>The unfocused rantings of a programmer who wishes he knew a better way to make a living.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default?start-index=101&amp;max-results=100'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>683</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6254179.post-1371882574270547524</id><published>2009-04-15T07:38:00.002-04:00</published><updated>2009-04-15T07:40:51.881-04:00</updated><title type='text'>Undefined Value Has Moved</title><content type='html'>&lt;p&gt;
The &lt;em&gt;Undefined Value&lt;/em&gt; blog has moved to &lt;a href="http://undefinedvalue.com/"&gt;http://undefinedvalue.com/&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Many thanks to everyone who has read my blog here on Blogspot.  I hope you'll follow me to the new site.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-1371882574270547524?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/1371882574270547524/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=1371882574270547524' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/1371882574270547524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/1371882574270547524'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2009/04/undefined-value-has-moved.html' title='Undefined Value Has Moved'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-5039262153379840082</id><published>2009-04-06T17:52:00.006-04:00</published><updated>2009-04-06T18:17:26.857-04:00</updated><title type='text'>Menubar Countdown 1.0 for Mac OS X Released</title><content type='html'>&lt;p&gt;Lately, I've been experimenting with the &lt;a href="http://www.pomodorotechnique.com/"&gt;Pomodoro Technique&lt;/a&gt; for time management.  The basic idea is that you work in focused 25-minute bursts, with short breaks between bursts.  You are supposed to use a kitchen timer to avoid getting distracted by looking at the clock.
&lt;/p&gt;
&lt;p&gt;
Of course, as a computer guy I'd like my timer to be on my computer.  I looked around for an application that would provide an unobtrusive 25-minute countdown timer, but I didn't find any that I liked.  So I decided to write my own.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://capablehands.net/menubarcountdown"&gt;Menubar Countdown&lt;/a&gt; is the result of that effort.  It displays a countdown timer on the right side of the menu bar.  It has menu items that allow you the user to start, stop, or resume the timer.
&lt;/p&gt;
&lt;p&gt;
There are three options for what you want to happen when the timer reaches 00:00:00:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Play the system alert sound (which I never notice).&lt;/li&gt;
&lt;li&gt;Display an alert window (which is effective, but you may not like the abrupt interruption.&lt;/li&gt;
&lt;li&gt;Speak.  This is my favorite option.  You can specify what you want the application to say.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
It's free software, distributed under the terms of the GNU General Public License.
&lt;/p&gt;
&lt;p&gt;
Source code is included.  Other neophyte Cocoa programmers might find it useful as an example of using such classes as NSStatusBar, NSStatusItem and NSUserDefaultsController, or for measuring absolute time in a Mac application.
&lt;/p&gt;
&lt;p&gt;
You can download the application from my snazzy new corporate web site: &lt;a href="http://capablehands.net/menubarcountdown"&gt;Menubar Countdown product page&lt;/a&gt;.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-5039262153379840082?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/5039262153379840082/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=5039262153379840082' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/5039262153379840082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/5039262153379840082'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2009/04/menubar-countdown-10-for-mac-os-x.html' title='Menubar Countdown 1.0 for Mac OS X Released'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-8328983966679583846</id><published>2009-04-02T20:23:00.005-04:00</published><updated>2009-04-03T07:16:44.654-04:00</updated><title type='text'>Giving Drupal a Try</title><content type='html'>&lt;p&gt;
I've been playing around with &lt;a href="http://www.drupal.org"&gt;Drupal&lt;/a&gt; as a possible treatment for my I-don't-have-time-to-make-a-real-website-itis.  If that works out, then my blog will probably move, and I'll finally put some content on my corporate website.
&lt;/p&gt;
&lt;p&gt;
I'm impressed with how easy it is to throw up a functional website with a content management system like Drupal.  Sure beats creating a website with Emacs, which has been my solution up to now.  (Yeah, as far as the WWW thing goes, I'm living in the Dark Ages.)
&lt;/p&gt;
&lt;p&gt;
Here's my playground, if anyone is interested in seeing what a Drupal-based site looks like with very little customization or administration expertise: &lt;a href="http://kristopherjohnson.net/content/"&gt;http://kristopherjohnson.net/content/&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
And in related news, my corporation now has a real website: &lt;a href="http://capablehands.net"&gt;Capable Hands Technologies, Inc.&lt;/a&gt;.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-8328983966679583846?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/8328983966679583846/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=8328983966679583846' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/8328983966679583846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/8328983966679583846'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2009/04/giving-drupal-try.html' title='Giving Drupal a Try'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-6146156258914935007</id><published>2009-03-16T23:51:00.015-04:00</published><updated>2009-04-16T12:59:23.988-04:00</updated><title type='text'>All Work and No Play...</title><content type='html'>&lt;p&gt;&lt;em&gt;Note: this article has been re-published on the &lt;a href="http://undefinedvalue.com/2009/03/17/all-work-and-no-play"&gt;new Undefined Value blog&lt;/a&gt;.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
I've been really hating my job for the last twelve months or so.  I've wondered why.  After all, I'm getting paid well to work on software.  This is my dream job, isn't it?  Why can't I enjoy it?  And if I can't enjoy it, why can't I just be happy that I'm not unemployed or flipping burgers?
&lt;/p&gt;
&lt;p&gt;
While sitting in the car dealership service lounge today, I watched a &lt;a href="http://blog.ted.com/2009/03/stuart_brown_play.php"&gt;TEDTalk about the importance of play&lt;/a&gt;.  During that video, it hit me:  I hate my job because I never get to play anymore.
&lt;/p&gt;
&lt;p&gt;
When I say &lt;em&gt;play&lt;/em&gt;, I don't mean playing ping-pong in the storeroom or having Nerf gunfights with my co-workers.  &lt;em&gt;Play&lt;/em&gt; is about curiosity, exploration, and imagination.  That's what I've always liked about software development: the opportunity to explore different solutions, to try out new ideas, and to learn interesting things from other people.
&lt;/p&gt;
&lt;p&gt;
For the past year, there has been none of that.  My job has mostly been about fixing bugs.  There have been a few new features to add, but they have all been uninteresting and uninspiring.
&lt;/p&gt;
&lt;p&gt;
This may sound like whining, but lack of play really does take a toll on productivity.  We have several smart people on the team, and yet we are way beyond schedule and over budget.  I'm sure that a major reason for that is the fact that nobody is having any fun.  Just putting your head down and charging forward may sound like an admirable way to handle an unpleasant situation, but it stifles creativity and makes it difficult to imagine better solutions.  When there is no opportunity to be smart, everyone just gets more stupid.
&lt;/p&gt;
&lt;p&gt;
Play should not be considered a luxury reserved for children.  The mind &lt;em&gt;needs&lt;/em&gt; play, just like it needs sleep.  Without it, performance suffers.
&lt;/p&gt;
&lt;p&gt;
I honestly can't remember the last time we did any brainstorming or drew things on whiteboards or talked about abstractions or joked about how to re-implement the whole system some obscure programming language.  All we do is write code, and contrary to what some people believe, writing code is the least valuable thing a developer does.  It's the thinking behind the writing that makes us more than mere typists, and we aren't doing enough of that.
&lt;/p&gt;
&lt;p&gt;
I don't know the solution to this problem.  I just hope that after the current projects are finished, I'll remember how my job is supposed to feel.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-6146156258914935007?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/6146156258914935007/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=6146156258914935007' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/6146156258914935007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/6146156258914935007'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2009/03/all-work-and-no-play.html' title='All Work and No Play...'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-7676354288116762203</id><published>2009-03-04T23:02:00.006-05:00</published><updated>2009-03-19T00:05:10.468-04:00</updated><title type='text'>Implementing Stupid Stuff</title><content type='html'>&lt;p&gt;
Every software developer, at one time or another, will be asked to implement a feature that doesn't make any sense.  It will be a request from a client, or from a senior manager, or someone else who can't be ignored.  The feature &lt;em&gt;must&lt;/em&gt; be added, even though everyone other than the requester knows the feature is ridiculous.
&lt;/p&gt;
&lt;p&gt;
I am in such a situation myself.  The first assignment I received when I took my current gig was to implement a feature that all the smart developers had refused to be involved with.  As the new guy, I didn't know any better.  I did what I was told.
&lt;/p&gt;
&lt;p&gt;
Now, about 25% of my time is spent reacting to "bugs" and questions about the feature.  I put "bugs" in "quotes" because most of the time, the feature is working exactly as designed.  Unfortunately, the design made no sense, so the behavior of the software doesn't make sense to anybody.
&lt;/p&gt;
&lt;p&gt;
So, I spend a lot of my time trying to explain to everyone why the software works the way it does.  This makes me look stupid, because the way it works is stupid.  I am held responsible for the "feature."  People ask me why it does what it does.  Most of the questions are of the form "How can I disable this feature?"  I want to preface every answer I give with 'This was not my idea, but ..."
&lt;/p&gt;
&lt;p&gt;
It's depressing.  My advice: don't implement anything that seems stupid.  Ask a lot of questions.  Make sure that either (a) you understand the need for the feature, or (b) make sure that everyone sees how useless the feature is, so that you won't have to do it.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-7676354288116762203?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/7676354288116762203/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=7676354288116762203' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/7676354288116762203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/7676354288116762203'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2009/03/implementing-stupid-shit.html' title='Implementing Stupid Stuff'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-6333067657945334570</id><published>2009-02-23T21:54:00.004-05:00</published><updated>2009-02-23T22:06:17.015-05:00</updated><title type='text'>Computer Security</title><content type='html'>&lt;p&gt;
For most of my computer-using life, I haven't had to worry too much about the security of my computers and networks.  I always had physical control of the machines.  I had passwords on the accounts.  I use WEP and WPA on my wi-fi.  Best of all, I never had anything very valuable on the machines.
&lt;/p&gt;
&lt;p&gt;
However, for the past year or so, I have a had a potential intruder to worry about: a ten-year old boy named &lt;i&gt;Bailey&lt;/i&gt;.
&lt;/p&gt;
&lt;p&gt;
So far, we are not too worried about Bailey's computer use.  We monitor his use, both openly and covertly, and he hasn't done anything dangerous or malicious.  When he does do things that he's not supposed to do, he doesn't try to cover his tracks.  However, he definitely values expediency over rule-following, so if logging into his mom's account is the easiest way to get cheat codes for Pokemon, or if he thinks plugging his iPod into my computer will let him download the movie he wants, then that's what happens.  Threats of punishment don't deter him.
&lt;/p&gt;
&lt;p&gt;
So, I've had to start acting a bit like one of those network-admin people who have always annoyed me.  I force everyone in the house to log in to computers with their own accounts.  I set up computers to automatically go into screen-saver mode after a period of inactivity, and require a password to get out.  I've created some scripts that can quickly shut down Bailey's computer, or forcefully log him out.
&lt;/p&gt;
&lt;p&gt;
So far, Bailey hasn't shown much interest in learning how to bypass any of these measures.  I don't know how long that will last.  Part of me hopes that he will outsmart me.  But another part of me hopes that won't happen for a little while longer.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-6333067657945334570?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/6333067657945334570/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=6333067657945334570' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/6333067657945334570'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/6333067657945334570'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2009/02/computer-security.html' title='Computer Security'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-5703915912085348359</id><published>2009-02-18T01:17:00.006-05:00</published><updated>2009-02-26T12:58:10.437-05:00</updated><title type='text'>Humor on Twitter</title><content type='html'>&lt;p&gt;
It is worth using Twitter just to get some laughs from these people:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The Onion: &lt;a href="http://twitter.com/theonion"&gt;@theonion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Tina Fey: &lt;a href="http://twitter.com/TinaFey"&gt;@TinaFey&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;John Hodgman: &lt;a href="http://twitter.com/hodgman"&gt;@hodgman&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Paula Poundstone: &lt;a href="http://twitter.com/paulapoundstone"&gt;@paulapoundstone&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;John Cleese: &lt;a href="http://twitter.com/JohnCleese"&gt;@JohnCleese&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
And it would be nice if these people still posted things once in a while:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Stephen Colbert: &lt;a href="http://twitter.com/StephenColbert"&gt;@StephenColbert&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Merlin Mann: &lt;a href="http://twitter.com/hotdogsladies"&gt;@hotdogsladies&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Please let me know if I've missed anyone.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-5703915912085348359?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/5703915912085348359/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=5703915912085348359' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/5703915912085348359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/5703915912085348359'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2009/02/humor-on-twitter.html' title='Humor on Twitter'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-1993285826950214107</id><published>2009-02-13T21:36:00.002-05:00</published><updated>2009-02-13T21:45:43.300-05:00</updated><title type='text'>MacBook Pro Status Report</title><content type='html'>&lt;p&gt;
I've been using my new &lt;a href="http://kristopherjohnson.blogspot.com/2009/01/new-15-inch-macbook-pro.html"&gt;MacBook Pro&lt;/a&gt; at work for over a month, in a strongly Windows-centric workplace, and so far things have gone very well.
&lt;/p&gt;
&lt;p&gt;
Most of my work involves Linux programming, so I just run Linux in a VMWare image like I did when I had a Windows laptop.  This works even better on my new Mac than it did on my old laptop, because I have a better X11 server for Mac OS X and because I can use all the standard UNIXish utilities to transfer and process files on the two platforms.
&lt;/p&gt;
&lt;p&gt;
On a few occasions, I have had to launch my Windows XP VMWare image to get some things done:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;One of our team members compresses things using WinZip 12.  Only WinZip 12 can de-compress compressed files in this new format, and there is no Mac version of WinZip.&lt;/li&gt;
&lt;li&gt;I used Word for Mac to update a document, and it was displaying weird in Print Layout view.  I opened the document in WordPad (and OpenOffice) in Windows to verify that it looked fine in other editors.  (It did.)&lt;/li&gt;
&lt;li&gt;I use Remote Desktop Connection on Windows to access some servers.&lt;/li&gt;
&lt;li&gt;I occasionally access Windows network shares from Windows.  I can access them directly from the Mac through the Finder too, most of the time, but sometimes there are authentication issues that I can't solve.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
So far, thumbs up on using a Mac in a Windows world.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-1993285826950214107?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/1993285826950214107/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=1993285826950214107' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/1993285826950214107'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/1993285826950214107'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2009/02/macbook-pro-status-report.html' title='MacBook Pro Status Report'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-7954757782717301103</id><published>2009-02-06T13:26:00.004-05:00</published><updated>2009-02-06T13:28:49.371-05:00</updated><title type='text'>SAT Scores</title><content type='html'>&lt;p&gt;
On the Stack Overflow podcast, Joel Spolsky has noted a couple of times that he's never met a programmer who didn't get an 800 on the math portion of the SAT.
&lt;/p&gt;
&lt;p&gt;
I used to be pretty proud of my 790 SAT math score.  But now it's proof that I'm not as smart as any of the programmers Joel has ever met.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-7954757782717301103?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/7954757782717301103/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=7954757782717301103' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/7954757782717301103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/7954757782717301103'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2009/02/on-stack-overflow-podcast-joel-spolsky.html' title='SAT Scores'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-8120580871540120249</id><published>2009-02-03T01:03:00.004-05:00</published><updated>2009-02-05T16:54:23.055-05:00</updated><title type='text'>Twitter</title><content type='html'>&lt;p&gt;
I've decided to give &lt;a href="http://twitter.com"&gt;Twitter&lt;/a&gt; a try.  So far, I'm not too impressed.  It's essentially just a bunch of tiny RSS feeds that update very frequently.  In other words, it makes the Internet an even bigger waste of time.  But, as with everything Internet-related, the joy is finding the occasional gem within all the muck.
&lt;/p&gt;
&lt;p&gt;
If you're on Twitter too, you can find me as &lt;a href="http://twitter.com/OldManKris"&gt;@OldManKris&lt;/a&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-8120580871540120249?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/8120580871540120249/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=8120580871540120249' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/8120580871540120249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/8120580871540120249'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2009/02/twitter.html' title='Twitter'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-6809743060791410813</id><published>2009-02-01T02:32:00.008-05:00</published><updated>2009-02-03T01:21:48.046-05:00</updated><title type='text'>Macintosh SE/30: Best Mac Ever</title><content type='html'>&lt;p&gt;
As all right-thinking people know, the &lt;a href="http://en.wikipedia.org/wiki/Macintosh_SE/30"&gt;Macintosh SE/30&lt;/a&gt; is the best Mac ever made.  Here are a couple of articles detailing why:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.macworld.com/article/138328/2009/01/macat25_bestmac.html?lsrc=rss_weblogs_editors"&gt;The best Mac ever&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.43folders.com/2009/01/21/se-30"&gt;Best Mac Ever? Duh. SE/30&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
The SE/30 was the first Mac I ever owned, graciously provided by my parents during my sophomore year of college.  It was a nice upgrade from the &lt;a href="http://en.wikipedia.org/wiki/Atari_8-bit_family"&gt;Atari 800&lt;/a&gt; that I had through high school.
&lt;/p&gt;
&lt;p&gt;
Back then, Macs weren't just highly polished alternatives to PCs.  Back then, Macs were Different.  The SE/30 was the pinnacle of the original all-in-one "cute" Macintosh design.
&lt;/p&gt;
&lt;p&gt;
I loved that SE/30.  I learned 68030 assembly so that I could write a Missile Command clone for it.  I learned about user interface design.  I learned C.  I learned how to use a low-level debugger (MACSBUG).  I pored through all the volumes of &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Inside_Macintosh"&gt;Inside&amp;nbsp;Macintosh&lt;/a&gt;&lt;/em&gt;.  I played with HyperCard.  Being a &lt;em&gt;Macintosh programmer&lt;/em&gt; played a large role in forming my professional skills and interests.
&lt;/p&gt;
&lt;p&gt;
Alas, I eventually decided that I needed a Power Mac 6100, and the SE/30 went into the closet.  Then I started literally using it as a doorstop.  A few years later, I traded it for a new hard drive.
&lt;/p&gt;
&lt;p&gt;
That was a bad trade.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-6809743060791410813?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/6809743060791410813/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=6809743060791410813' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/6809743060791410813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/6809743060791410813'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2009/02/macintosh-se30-best-mac-ever.html' title='Macintosh SE/30: Best Mac Ever'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-6503759708637749227</id><published>2009-01-19T08:18:00.006-05:00</published><updated>2009-01-30T15:10:16.100-05:00</updated><title type='text'>Miracles Not Required</title><content type='html'>&lt;p&gt;
Aviatrix has a good post about the so-called "miracle" in New York: &lt;a href="http://airplanepilot.blogspot.com/2009/01/safety-is-not-miracle.html"&gt;Safety Is Not a Miracle&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
While nobody can prove that divine intervention was not involved, the good outcome in the Hudson River can be attributed to professionalism.
&lt;/p&gt;
&lt;p&gt;
Here's a nice article about the pilot's commitment to his job: &lt;a href="http://www.globalnerdy.com/2009/01/28/the-interview-question-you-should-always-ask/"&gt;The Interview Question You Should Always Ask&lt;/a&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-6503759708637749227?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/6503759708637749227/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=6503759708637749227' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/6503759708637749227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/6503759708637749227'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2009/01/miracles-not-required.html' title='Miracles Not Required'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-5552667293403412085</id><published>2009-01-18T14:27:00.003-05:00</published><updated>2009-01-26T08:39:29.853-05:00</updated><title type='text'>Dumpster!</title><content type='html'>&lt;p&gt;
Every time I've moved, I've wished that I could get a dumpster, park it beneath my apartment balcony, and just throw stuff into it as I pack.  However, apartment managers frown on residents parking dumpsters in their lots, so I've never been able to do it.
&lt;/p&gt;
&lt;p&gt;
Now, I've finally done it!  We got a 20-cubic-yard dumpster delivered on Friday.  When it arrived, it looked huge, and I figured we'd only fill it halfway.  But after a few hours of tossing stuff into it, it's almost full.
&lt;/p&gt;
&lt;p&gt;
Contents include the following:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Old furniture&lt;/li&gt;
&lt;li&gt;Old dishwasher&lt;/li&gt;
&lt;li&gt;Some aluminum siding left by the previous owner&lt;/li&gt;
&lt;li&gt;An old swingset left by the previous owner&lt;/li&gt;
&lt;li&gt;Chunks of concrete left by the previous owner&lt;/li&gt;
&lt;li&gt;A couple sections of wooden fence that blew down a couple months ago&lt;/li&gt;
&lt;li&gt;Many yards of wire fencing, and several fenceposts&lt;/li&gt;
&lt;li&gt;Lots of old boxes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Renting the dumpster cost a few hundred bucks.  I wondered if it might be more cost-effective to just buy an old pickup and drag things to the dump myself, but the dumpster is definitely a time-saver.
&lt;/p&gt;
&lt;p&gt;
The dumpster company is called "Hudson River."  I guess when people think about dumping waste, they think of the Hudson River.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-5552667293403412085?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/5552667293403412085/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=5552667293403412085' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/5552667293403412085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/5552667293403412085'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2009/01/dumpster.html' title='Dumpster!'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-4305086197532943083</id><published>2009-01-18T01:40:00.017-05:00</published><updated>2009-01-26T08:40:48.786-05:00</updated><title type='text'>42</title><content type='html'>&lt;div style="float: right; margin-left: 10px; margin-bottom: 10px;"&gt;&lt;a href="http://flickr.com/photos/kristopherjohnson/3207835759/" title="photo sharing"&gt;&lt;img src="http://farm4.static.flickr.com/3339/3207835759_fcd5ba59ec_m.jpg" alt="" style="border: solid 2px #000000;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size: 0.9em; margin-top: 0px;"&gt;&lt;a href="http://flickr.com/photos/kristopherjohnson/3207835759/"&gt;Christmas Card Picture&lt;/a&gt;&lt;br /&gt;Originally uploaded by &lt;a href="http://www.flickr.com/people/kristopherjohnson/"&gt;kristopherjohnson&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;
Another birthday has passed.  It has been an eventful year: I got &lt;a href="http://flickr.com/photos/kristopherjohnson/2791535441/"&gt;married&lt;/a&gt;, and I've become part of a new family.
&lt;/p&gt;
&lt;p&gt;
My wife &lt;a href="http://flickr.com/photos/kristopherjohnson/3149067712/"&gt;Pebble&lt;/a&gt; is the most amazing person I've ever met.  She's smart.  She's kind.  She's giving.  She's forgiving.  Most of all, she's open in a way I thought nobody could be.  Marriage and life aren't always wonderful, but she's a wonderful wife, and I know I've chosen the right partner.  We grow closer every day, and I honestly can't remember what my life was like before I met her.  (I'm pretty sure it sucked.)
&lt;/p&gt;
&lt;p&gt;
For my birthday, she bought me the complete collection of &lt;em&gt;Planet of the Apes&lt;/em&gt; movies on Blu-ray.  I didn't even ask for it.  How cool is that?
&lt;/p&gt;
&lt;p&gt;
My stepson &lt;a href="http://flickr.com/photos/kristopherjohnson/2915112920/"&gt;Bailey&lt;/a&gt; is about to become ten years old.  Like his mother, his emotions and thoughts are always right at the surface, so I always know where I stand with him.  He is sometimes incredibly cute, and other times he's apparently possessed by Satan, but I know we'll always love one another.  He loves his new grandma and grandpa (my parents), and enjoys spending time with his new cousins (my nieces).
&lt;/p&gt;
&lt;p&gt;
We also got a puppy.  He's a Yorkshire Terrier named &lt;em&gt;&lt;a href="http://flickr.com/photos/kristopherjohnson/2619799174/"&gt;Mouse&lt;/a&gt;&lt;/em&gt;, and he thinks he owns the house.  I believe there is nothing cuter than a Yorkie puppy.
&lt;/p&gt;
&lt;p&gt;
Our little cabin in the woods is nice, but we all agree that we'd like more space, and we're all getting tired of driving two hours a day to get to and from our occupations, so we're probably going to be moving closer to Atlanta some time this year.  But we're not in a hurry: we do like our little cabin in the woods.
&lt;/p&gt;
&lt;p&gt;
My forties are shaping up to be a lot better than my twenties and thirties were.  Life is good.  (But I occasionally complain about it anyway.)
&lt;/p&gt;
&lt;p&gt;
I've done more traveling in the past year than any other.  My wife and I went to Waikiki for our honeymoon, and also visited Pensacola and the Grand Canyon.  I went alone to Australia for three weeks on business, finally putting my passport to use.
&lt;/p&gt;
&lt;p&gt;
Career-wise, I'm in a bit of a rut.  I had hoped to do some job searching this year, but with the economy the way it is, I consider myself fortunate to have the contracting gig that I have.  I'll try to acquire some new skills this year.  Maybe next year...
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-4305086197532943083?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/4305086197532943083/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=4305086197532943083' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/4305086197532943083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/4305086197532943083'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2009/01/42.html' title='42'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3339/3207835759_fcd5ba59ec_t.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-5907219068162394270</id><published>2009-01-17T12:47:00.003-05:00</published><updated>2009-02-18T01:44:36.586-05:00</updated><title type='text'>Who Uses ActiveX Controls These Days?</title><content type='html'>&lt;p&gt;
For my birthday, my parents sent me one of those e-cards on the web.  When I went to retrieve it, the site told me "We're sorry - this feature is not compatible with Macs."
&lt;/p&gt;
&lt;p&gt;
Of course, this is because this site ("My Fun Cards") uses ActiveX controls for its animated cards.
&lt;/p&gt;
&lt;p&gt;
Why?
&lt;/p&gt;
&lt;p&gt;
Ten years ago, ActiveX controls sometimes made sense.  But these days, with widespread support for Java, Flash, Silverlight and other web technologies, why the hell would anybody be deploying ActiveX controls?  They're not cross-platform, they are insecure, they require users to manipulate their browser settings and click "OK" when asked whether to install a control, etc.  They are just bad, bad, bad.
&lt;/p&gt;
&lt;p&gt;
This is not, of course, my parents' fault.  The people at My Fun Cards are just a few years behind everybody else.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-5907219068162394270?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/5907219068162394270/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=5907219068162394270' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/5907219068162394270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/5907219068162394270'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2009/01/who-uses-activex-controls-these-days.html' title='Who Uses ActiveX Controls These Days?'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-5043665387723094499</id><published>2009-01-16T01:52:00.007-05:00</published><updated>2009-01-18T01:55:37.572-05:00</updated><title type='text'>Saving a View as a Photo in an iPhone App</title><content type='html'>&lt;p&gt;
For an iPhone app that I'm working on, I want to be able to save the screen image to the Photos album.  My first attempt at this was complicated: I created a color space, a bitmap context, a &lt;tt&gt;CGImage&lt;/tt&gt;, and finally a &lt;tt&gt;UIImage&lt;/tt&gt;, copying and pasting most of the code from the &lt;em&gt;Quartz 2D Programming Guide&lt;/em&gt;.  Unfortunately, it didn't work; I kept getting BAD_ACCESS signals when I called &lt;tt&gt;UIImageWriteToSavedPhotosAlbum()&lt;/tt&gt;, even though it looked to me like everything was correct.
&lt;/p&gt;
&lt;p&gt;
After Googling for a bit for known issues with UIImageWriteToSavedPhotosAlbum, I ran across a far easier solution to the problem.  Here are the methods I ended up with:
&lt;/p&gt;
&lt;pre&gt;
// Create an image for the view and save it to the Photos library
- (void)savePhotoOfView:(UIView *)view
{
    UIGraphicsBeginImageContext(view.bounds.size);
    [view drawRect:view.bounds];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    UIImageWriteToSavedPhotosAlbum(image,
                                   self,
                                   @selector(savedPhotoImage:didFinishSavingWithError:contextInfo:),
                                   NULL);
}

// Called by UIImageWriteToSavedPhotosAlbum() when it completes
- (void)   savedPhotoImage:(UIImage *)image
  didFinishSavingWithError:(NSError *)error
               contextInfo:(void *)contextInfo
{    
    NSString *message = @"This image has been saved to your Photos album";
    if (error) {
        message = [error localizedDescription];
    }
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil
                                                    message:message
                                                   delegate:nil
                                          cancelButtonTitle:@"OK"
                                          otherButtonTitles:nil];
    [alert show];
    [alert release];
}
&lt;/pre&gt;
&lt;p&gt;
These just call the view's &lt;tt&gt;drawRect&lt;/tt&gt; method to create an image, save the image to the Photos library, and then pop up an alert box to let the user know what happened.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-5043665387723094499?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/5043665387723094499/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=5043665387723094499' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/5043665387723094499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/5043665387723094499'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2009/01/saving-view-as-photo-in-iphone-app.html' title='Saving a View as a Photo in an iPhone App'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-662600580337978125</id><published>2009-01-15T12:38:00.008-05:00</published><updated>2009-01-15T13:03:57.915-05:00</updated><title type='text'>Free Promotion for JacksOrBetter for iPhone and iPod Touch Owners</title><content type='html'>&lt;p&gt;
The first twenty people who respond can get a free copy of &lt;a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=290542821&amp;mt=8"&gt;JacksOrBetter&lt;/a&gt;, a video-poker simulation for iPhone and iPod Touch.  Just send an e-mail to &lt;tt&gt;undefinedvalue&lt;/tt&gt; at &lt;tt&gt;gmail.com&lt;/tt&gt;, and I'll send you a promotional code.
&lt;/p&gt;
&lt;p&gt;
To redeem your code, do the following:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Start iTunes.&lt;/li&gt;
&lt;li&gt;Click the &lt;em&gt;iTunes Store&lt;/em&gt; link on the left side of the window.&lt;/li&gt;
&lt;li&gt;On the store home page, click the &lt;em&gt;Redeem&lt;/em&gt; link in the Quick Links section.&lt;/li&gt;
&lt;li&gt;Enter the promotional code.&lt;/li&gt;
&lt;li&gt;Wait for the application to download.&lt;/li&gt;
&lt;li&gt;Sync your iPhone/iPod&lt;/li&gt;
&lt;li&gt;Enjoy!&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Please only request a promotional code if you actually have an iPhone or Touch.  Also, I'd prefer to limit this offer only to people who read this blog, or people who know people who read this blog, so please don't tell everyone in the world about this offer.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-662600580337978125?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/662600580337978125/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=662600580337978125' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/662600580337978125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/662600580337978125'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2009/01/free-promotion-for-jacksorbetter.html' title='Free Promotion for JacksOrBetter for iPhone and iPod Touch Owners'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-9149912046163889725</id><published>2009-01-12T23:09:00.008-05:00</published><updated>2009-01-14T10:14:01.407-05:00</updated><title type='text'>iPhone Development Fun</title><content type='html'>&lt;p&gt;
I am so thankful for the existence of the iPhone.  Twenty years ago, if you'd told me I'd be holding a pocket-sized computer that had a high-resolution touchscreen, a wireless always-on connection to the Internet, and a library of Hollywood movies, I wouldn't have believed it.  The fact that it can make phone calls is nice too, but I frankly don't care too much about that feature.  All those idiots who keep asking "Why would anyone spend $500 on a &lt;em&gt;phone&lt;/em&gt;?!?" are really missing the point.
&lt;/p&gt;
&lt;p&gt;
(See &lt;a href="http://www.thebestpageintheuniverse.net/c.cgi?u=iphone"&gt;The iPhone is a piece of shit, and so is your face&lt;/a&gt; for an alternative opinion.)
&lt;/p&gt;
&lt;p&gt;
Writing little apps for the iPhone is the only thing keeping me from giving up on software completely. (Well, OK, I guess the mortgage has something to do with that also.)  At work, I'm starting my third year of maintaining a horrible soul-crushing legacy application, and it's hard for me to maintain the appropriate level of Give-a-Shit.  Playing with the iPhone SDK helps.
&lt;/p&gt;
&lt;p&gt;
I'm working on an application now that I hope to put in the App Store in a few weeks.  No, it's not &lt;a href="http://kristopherjohnson.blogspot.com/2008/12/to-do-list-application-update-1.html"&gt;my to-do list app&lt;/a&gt;.  I'd rather not write about it yet, because it is the kind of thing someone else could create during an uninterrupted weekend, but once it's done, I'll start the marketing.
&lt;/p&gt;
&lt;p&gt;
My first app, &lt;a href="http://kristopherjohnson.blogspot.com/2008/11/jacksorbetter-for-iphone-and-ipod-touch.html"&gt;JacksOrBetter&lt;/a&gt;, has not been wildly successful.  I've sold about 200 copies worldwide.  That's not surprising, as it's a simple game, and there are a few dozen other casino-style card games available in the App Store, many of which are free.  I didn't expect to make money with that game; I just wanted to go through the process of developing something and putting it up for sale.
&lt;/p&gt;
&lt;p&gt;
I doubt my next app will bring in a windfall either, but that's fine with me.  I'm having fun, and people are using software I've written.  That's why I got into this business in the first place.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-9149912046163889725?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/9149912046163889725/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=9149912046163889725' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/9149912046163889725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/9149912046163889725'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2009/01/iphone-development-fun.html' title='iPhone Development Fun'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-7243895662425151238</id><published>2009-01-08T23:48:00.006-05:00</published><updated>2009-01-09T03:15:30.974-05:00</updated><title type='text'>New 15-inch MacBook Pro</title><content type='html'>&lt;p&gt;
A few days ago, I bought a 15-inch MacBook Pro.  For those of you keeping score, that brings the number of Macintoshes in our household to five.  We also have two iPhones and several iPods.  I wish the local Apple Store had some sort of customer loyalty program.
&lt;/p&gt;
&lt;p&gt;
I bought this machine for work.  (My wife will snicker at this statement, but it's true.)  I've been toting a &lt;a href="http://kristopherjohnson.blogspot.com/2006/11/toshiba-tecra-m7-tablet-pc.html"&gt;Toshiba tablet&lt;/a&gt; with Windows XP to the office for the past couple of years, but with each passing month, I've hated it more.  Most of my development work has been for Linux, and I haven't needed Windows much.  So, I've decided I'll finally ditch PC's for good.
&lt;/p&gt;
&lt;p&gt;
I will have VMWare Fusion running Windows, Linux, and FreeDOS.  For a contract programming gig a couple years ago, I &lt;a href="http://kristopherjohnson.blogspot.com/2006/10/my-next-windows-laptop.html"&gt;ran Windows on my 13-inch MacBook with Parallels&lt;/a&gt;, and that worked pretty well, so I'm confident that a beefier Mac with VMWare can handle all my Windows needs from now on.
&lt;/p&gt;
&lt;p&gt;
The new Pro is pretty.  For the past few days, I've been preparing it for service by installing all the necessary software.  On Monday, I'll take it to work, but I'll also take my old Toshiba for a few days until I'm sure the new machine can take its place.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-7243895662425151238?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/7243895662425151238/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=7243895662425151238' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/7243895662425151238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/7243895662425151238'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2009/01/new-15-inch-macbook-pro.html' title='New 15-inch MacBook Pro'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-7560253655420818000</id><published>2008-12-31T16:50:00.002-05:00</published><updated>2008-12-31T17:01:45.162-05:00</updated><title type='text'>To-Do List Application Update #1</title><content type='html'>&lt;p&gt;
At the beginning of the month, I described my plan for &lt;a href="http://kristopherjohnson.blogspot.com/2008/12/ultimate-to-do-list-application-for.html"&gt;The Ultimate To-Do List Application for iPhone&lt;/a&gt;.  That wasn't just hot air; I actually have created an app.
&lt;/p&gt;
&lt;p&gt;
It doesn't have all the planned features yet, and it's not ready for distribution to others, but it is complete enough for me to use.  It's so useful, in fact, that I don't have a strong need to add the remaining features.  But I want to do so anyway.
&lt;/p&gt;
&lt;p&gt;
Here's what it can do so far:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Maintain a list of lists.  Each list has a name.  Each list contains a list of items, each of which has a name.&lt;/li&gt;
&lt;li&gt;New lists can be created, and new items can be added to lists.  Each such operation is performed by the user by tapping a '+' icon, which brings up a text entry field to enter the name.&lt;/li&gt;
&lt;li&gt;Lists and items can be deleted or reordered by clicking an "Edit" button.  Things can also be deleted via the swipe gesture.&lt;/li&gt;
&lt;li&gt;All data is stored in a SQLite database.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
The most obvious "missing feature" is the lack of checkboxes.  I'm not really missing that feature, because I just delete items as I complete them.  So maybe I don't need it, but I'll add it anyway just because the app will look better with them.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-7560253655420818000?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/7560253655420818000/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=7560253655420818000' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/7560253655420818000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/7560253655420818000'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/12/to-do-list-application-update-1.html' title='To-Do List Application Update #1'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-1248193096411719868</id><published>2008-12-31T11:40:00.010-05:00</published><updated>2009-01-02T08:45:45.130-05:00</updated><title type='text'>Kris and Pebble at the Grand Canyon</title><content type='html'>&lt;div style="float: right; margin-left: 10px; margin-bottom: 10px;"&gt;&lt;a href="http://www.flickr.com/photos/kristopherjohnson/3149070506/" title="photo sharing"&gt;&lt;img src="http://farm4.static.flickr.com/3244/3149070506_33237065d3_m.jpg" alt="" style="border: solid 2px #000000;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size: 0.9em; margin-top: 0px;"&gt;&lt;a href="http://www.flickr.com/photos/kristopherjohnson/3149070506/"&gt;Kris and Pebble at the Grand Canyon&lt;/a&gt;&lt;br /&gt;Originally uploaded by &lt;a href="http://www.flickr.com/people/kristopherjohnson/"&gt;kristopherjohnson&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;
My stepson was going to spend the week of Christmas with his father in Tucson, so my wife and I decided we would spend the week at the Grand Canyon.  It was a wonderful week, basically a second honeymoon.
&lt;/p&gt;
&lt;p&gt;
We didn't do a very good job of planning the trip.  We didn't reserve rooms at the hotel until early December.  We didn't reserve a room in Flagstaff, where we had planned to spend a night on the way to the GC from Tucson.  We didn't check the weather reports.  We didn't have a map.  We were very lucky that things turned out as well as they did.
&lt;/p&gt;
&lt;p&gt;
We reserved a room at the &lt;a href="http://www.grandcanyonlodges.com/el-tovar-409.html"&gt;El Tovar hotel&lt;/a&gt;, which is right on the south rim.  We had hoped to get a suite, but had to settle for a deluxe room.
&lt;/p&gt;
&lt;p&gt;
We got to Flagstaff early in the afternoon, so decided we'd just go the rest of the way to the park instead of stopping for the evening.  Pebble called and eventually got a reservation for a room a day early.
&lt;/p&gt;
&lt;p&gt;
Unfortunately, we had not checked the weather.  About twenty miles from the park, we were hit by heavy snowfall and icy roads.  We were in a Mazda Miata, which is not exactly an all-terrain vehicle.  Faced with the decision to either go back to Flagstaff (an hour behind us) or get to our hotel, we decided to trudge on.
&lt;/p&gt;
&lt;p&gt;
Twenty white-knuckled miles later, just after sunset, we arrived at the hotel.  We both needed stiff drinks before going to bed.
&lt;/p&gt;
&lt;p&gt;
The following day (December 24), we ventured outdoors.  Pictures of the Grand Canyon really don't do it justice.  It's huge.  It's beautiful.  It makes you feel infinite and infinitesimal at the same time.
&lt;/p&gt;
&lt;div style="float: right; margin-left: 10px; margin-bottom: 10px;"&gt;&lt;a href="http://www.flickr.com/photos/kristopherjohnson/3149067712/" title="photo sharing"&gt;&lt;img src="http://farm4.static.flickr.com/3104/3149067712_322ae30bf2_m.jpg" alt="" style="border: solid 2px #000000;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size: 0.9em; margin-top: 0px;"&gt;&lt;a href="http://www.flickr.com/photos/kristopherjohnson/3149067712/"&gt;Pebble the Nature Photographer&lt;/a&gt;&lt;br /&gt;Originally uploaded by &lt;a href="http://www.flickr.com/people/kristopherjohnson/"&gt;kristopherjohnson&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;
Pebble and I each brought a camera, so we had a little photography competition.  I'm pretty sure I won, but she disagrees.  (Check out my &lt;a href="http://www.flickr.com/photos/kristopherjohnson/sets/72157611905457277/"&gt;photos&lt;/a&gt; on Flickr.)
&lt;/p&gt;
&lt;p&gt;
On Christmas Day, another snowstorm hit.  At lunch, we were given seats with "a great view of the canyon", but all we saw was white.  We didn't leave the hotel that day, and we wondered whether we'd be able to drive that Miata out of the park when the time came to leave.
&lt;/p&gt;
&lt;p&gt;
Subsequent days had better weather, so we had ample opportunity to visit various points on the South Rim.  We decided to extend our stay an extra day, and got to stay in a suite the last night.
&lt;/p&gt;
&lt;p&gt;
We were sorry to leave.  This was the first time since our honeymoon that the two of us have been able to just have fun, without worrying about work, the kid, the dog, the house, and all that other stuff.  But we do love our kid, dog, and house, so we were happy to be reunited with them for a belated Christmas celebration.
&lt;/p&gt;
&lt;p&gt;
We hope to visit the canyon again during the spring or summer.  And we'll definitely stay at the El Tovar again.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-1248193096411719868?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/1248193096411719868/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=1248193096411719868' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/1248193096411719868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/1248193096411719868'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/12/kris-and-pebble-at-grand-canyon.html' title='Kris and Pebble at the Grand Canyon'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3244/3149070506_33237065d3_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-5265045325500958673</id><published>2008-12-19T00:12:00.003-05:00</published><updated>2009-01-12T23:07:00.847-05:00</updated><title type='text'>Interacting with Customers</title><content type='html'>&lt;p&gt;
Today I was delighted to discover that Jeff Atwood and Joel Spolsky discussed my recorded question on &lt;a href="http://blog.stackoverflow.com/2008/12/podcast-34/"&gt;Episode 34 of the Stack Overflow podcast&lt;/a&gt;.  I now think there should be a Stack Overflow badge for people who have appeared on the podcast, either as questioners or as guests.
&lt;/p&gt;
&lt;p&gt;
Here is my question (without the &lt;i&gt;ums&lt;/i&gt; and pauses):
&lt;/p&gt;
&lt;blockquote&gt;
It is often said that the primary role of a software development manager is to insulate developers from the customers, users, executives, and other people involved with the project.  However, I have often found that talking to customers and users gives me a lot of useful information that isn't in the specs about what the true requirements and goals of the project are.  To what extent should developers interact with customers, users, and other stakeholders?
&lt;/blockquote&gt;
&lt;p&gt;
Jeff and Joel had some good comments.  What follows are my own thoughts about the topic.
&lt;/p&gt;
&lt;p&gt;
When I started out as a developer, I was very introverted, content to just sit in my cubicle and interact with the world via e-mail.  However, as I acquired more responsibility, I had to start talking to executives.  Eventually, I became a development lead, and had to meet with actual customers.
&lt;/p&gt;
&lt;p&gt;
I was terrified, but it was my job, so I did it.  It turned out to be a lot easier than I expected.  It was even pleasant.  It turned out that customers weren't morons who wanted to torture software developers; they just wanted us to deliver software that suited their needs, which is exactly what I wanted too.  I looked forward to the customer meetings, which always invigorated me and got me more excited about working on the software.
&lt;/p&gt;
&lt;p&gt;
Based upon that experience, I've encouraged other developers to get involved with people outside the team, and I've often wished my employers would do more to get us out of our offices and into the users' facilities.
&lt;/p&gt;
&lt;p&gt;
Of course, there are costs and risks associated with customer/user interaction.  The time you spend with customers and users is time you aren't writing code, so if you do too much you lose productivity.  Developers by nature are usually willing to do whatever it takes to solve problems, so there is the risk that a developer will commit to do something that shouldn't be done.  If customers get too chummy with developers, they may try to go around management, which is bad for everyone.  And finally, some developers have personality disorders that make them unsuitable for outside contact.
&lt;/p&gt;
&lt;p&gt;
But still, I encourage all developers to try to get into positions where they can talk to customers and users.  It makes software development a lot more fun.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-5265045325500958673?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/5265045325500958673/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=5265045325500958673' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/5265045325500958673'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/5265045325500958673'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/12/interacting-with-customers.html' title='Interacting with Customers'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-3971119405888571205</id><published>2008-12-08T19:00:00.018-05:00</published><updated>2008-12-31T11:44:21.414-05:00</updated><title type='text'>An Open Letter to Global Imports BMW</title><content type='html'>&lt;p&gt;
&lt;em&gt;This is the text of a letter my wife and I have sent to the sales manager, service manager, and general manager of &lt;a href="http://www.atlantabmw.com/index.htm"&gt;Global Imports BMW in Atlanta&lt;/a&gt;.  (The only response we've received is from a salesman who called to ask what kind of BMW we were interested in purchasing.)&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
My wife and I recently bought a MINI Cooper convertible from your dealership.  While we are very happy with the car, we have been very disappointed with the service we've received from your dealership.  We are sharing our experience with you so that you may improve your customer service.
&lt;/p&gt;
&lt;p&gt;
In September, we bought a MINI Cooper S convertible which had been an executive demo, and therefore had a few thousand miles on it.  We were assured that we would receive excellent service, and that the dealership would take care of details such as our new license tag and insurance.
&lt;/p&gt;
&lt;p&gt;
Our insurance company never heard from your dealership.  After thirty days had passed, we still had not received our new license tag.  I repeatedly called the sales associate who had sold us the car.  The first four times, I was told that he had "just stepped out" and I left voicemail, which was never answered.  Finally, I got hold of him, and he told me that sometimes the tag just takes longer than usual.  A week later, we received the tag.  It may have just been slow processing by the state, as he claimed, but we suspect that nothing happened with our tag until we prompted him.
&lt;/p&gt;
&lt;p&gt;
In December, the time came for our first scheduled maintenance visit.  I called the dealership and made an appointment for Saturday morning at 10:20 AM.  When I made the appointment, I told the clerk that in addition to the scheduled maintenance, there was some other work to be done on the car, and we were interested in installing a handsfree Bluetooth telephone module.  She said that would be fine, and that we'd simply need to tell the service coordinator when we arrived for our appointment.
&lt;/p&gt;
&lt;p&gt;
She transferred me to the parts department to check on availability of the Bluetooth module.  I got a recording.  I left voicemail, but my call was never returned.  I called a few more times during the week, but each time, I was transferred to a different voicemail account, and although I left messages each time, none were returned.
&lt;/p&gt;
&lt;p&gt;
On Saturday, we arrived at around 10 AM.  When we checked in at the service department, we mentioned to the clerk that we had been unable to reach the parts department.  He shook his head and said, "Yeah, those guys are never at their desks."
&lt;/p&gt;
&lt;p&gt;
After a few minutes, we met with the service coordinator.  This is what she told us:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;On Saturday, only maintenance is done.  Any other repairs or work must be done on a weekday, so they wouldn't be able to look at our non-functional CD player or non-functional back-up proximity sensors, even though they'd be covered by the warranty.&lt;/li&gt;
&lt;li&gt;As she was on vacation earlier that week, she was not responsible for anything that had been said to me on the phone.&lt;/li&gt;
&lt;li&gt;It was not possible that anyone would have set up a Saturday appointment without telling us that only maintenance would be done.&lt;/li&gt;
&lt;li&gt;The service department was overbooked for the day, so our car would not be ready before 1:00 PM, which was over two and a half hours from our appointment time.  (Why bother making an appointment?)&lt;/li&gt;
&lt;li&gt;Adding a handsfree Bluetooth module to our car (which already has the premium sound system and phone controls on the steering wheel) would cost $1,700.&lt;/li&gt;
&lt;li&gt;We could have a loaner car.  However, if we accept the loaner car, then the priority of our service gets decreased, and the car would not be ready until 4:00 PM.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
We had already spent an hour and a half driving from our home Dahlonega, so we decided to let the service department do whatever it could.  Not wanting to sit in the waiting room for two and a half hours, we accepted the loaner car, puttered around aimlessly for a few hours, and picked up our MINI at around 3:30.
&lt;/p&gt;
&lt;p&gt;
We wasted an entire Saturday just to get an oil change.  Next time, we'll go to Jiffy Lube.
&lt;/p&gt;
&lt;p&gt;
After the service, we notice that one of the headlights is misaligned.  We are sure it was not like this before the service.
&lt;/p&gt;
&lt;p&gt;
We are very happy with the car, but obviously we are unhappy with your dealership's service.  We were waited on hand-and-foot before the sale, but afterward we have been ignored.  We will not return to your dealership.  I'd suggest these improvements:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Don't overbook the service department.&lt;/li&gt;
&lt;li&gt;When a customer makes an appointment for Saturday, make it clear that services are limited to oil changes only.&lt;/li&gt;
&lt;li&gt;When customers call, ensure that someone who can help them talks to them immediately or returns the calls.&lt;/li&gt;
&lt;li&gt;Don't penalize customers who accept the offer of a loaner vehicle.&lt;/li&gt;
&lt;li&gt;Don't brag about your service.&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-3971119405888571205?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/3971119405888571205/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=3971119405888571205' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/3971119405888571205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/3971119405888571205'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/12/letter-to-global-imports-bmw.html' title='An Open Letter to Global Imports BMW'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-1814876052574152178</id><published>2008-12-03T19:56:00.006-05:00</published><updated>2008-12-05T08:46:38.219-05:00</updated><title type='text'>The Ultimate To-Do List Application for iPhone</title><content type='html'>&lt;p&gt;
I've decided to write a to-do list app for iPhone.
&lt;/p&gt;
&lt;p&gt;
"But Kris," you say, "there are already 837 to-do list apps in the App Store.  How can you compete with those?  How will yours be different?"
&lt;/p&gt;
&lt;p&gt;
Well, I haven't tried all 837 to-do lists in the App Store, but I've tried several, and I haven't liked any of them.  So I'm going to put my programming superpowers to good use, and create the Perfect To-Do List application for &lt;i&gt;me&lt;/i&gt;.
&lt;/p&gt;
&lt;p&gt;
So, how will &lt;i&gt;my&lt;/i&gt; app be different from the other 837?  Here's my manifesto:
&lt;/p&gt;
&lt;h3&gt;Simplicity and Efficiency&lt;/h3&gt;
&lt;p&gt;
The problem I have with all the to-do apps I've seen is that they are too complicated, and require too many steps to do the things I want to do.  All I want is to keep lists of items and check them off.  Adding a new item will require me to simply tap an Add button, type a couple of words, and tap a Done button.  I don't want to prioritize items, categorize them, specify due dates, set their fonts and colors, or align them with my personal vision statement.  I don't want to sync with Outlook or iCal or OmniFocus.  I don't need to do everything the &lt;i&gt;Getting Things Done&lt;/i&gt; way.
&lt;/p&gt;
&lt;p&gt;
With the tap of a button, I will be able to re-sort the list so that unchecked items are at the top.
&lt;/p&gt;
&lt;p&gt;
With the tap of a button, I will be able to delete all checked-off items.
&lt;/p&gt;
&lt;h3&gt;A List of Lists&lt;/h3&gt;
&lt;p&gt;
The app won't just be a single to-do list.  I will have a list of checklists, so in addition to a to-do list, I'll be able to keep meeting agendas, my grocery list, my Christmas shopping list, my Christmas card list, travel preparation steps, and every other list in this one application.
&lt;/p&gt;
&lt;p&gt;
But I'm not going to have sublists.  Two levels is it.  I'm not creating an outliner.
&lt;/p&gt;
&lt;h3&gt;Templates&lt;/h3&gt;
&lt;p&gt;
I'll be able to save any list as a template.  Later, I can create new lists by copying the templates.  This is useful for recurring tasks, like grocery lists.
&lt;/p&gt;
&lt;h3&gt;Sharing&lt;/h3&gt;
&lt;p&gt;
I will be able to send or receive lists from other users of my app.  The particular use case I want to support is allowing my wife to make a grocery list and send it to me so I can pick things up on the way home.
&lt;/p&gt;
&lt;h3&gt;Scratching My Own Itch&lt;/h3&gt;
&lt;p&gt;
This will be &lt;i&gt;my app&lt;/i&gt;, suited to my needs and usage patterns.  I'll make it available through the App Store, but I will be my own most important customer.  People who don't like my app can try out the other 837.
&lt;/p&gt;
&lt;p&gt;
(By the way, the number 837 above is made-up.  I have no idea how many to-do list apps there really are in the App Store.  But I know the number is pretty big.)
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-1814876052574152178?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/1814876052574152178/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=1814876052574152178' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/1814876052574152178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/1814876052574152178'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/12/ultimate-to-do-list-application-for.html' title='The Ultimate To-Do List Application for iPhone'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-5432005343597067339</id><published>2008-11-15T04:01:00.003-05:00</published><updated>2008-11-15T04:12:02.384-05:00</updated><title type='text'>Australian Toilets</title><content type='html'>&lt;p&gt;
A surprising large number of people have asked me whether the toilets really do flush in the opposite direction in the Southern Hemisphere, due to the Coriolis Effect.  Well, the toilets I've seen in Australia don't swirl at all; there is a short but powerful swoosh of water that lasts only a second or two, with no rotation.
&lt;/p&gt;
&lt;p&gt;
According to &lt;a href="http://www.straightdope.com/columns/read/149/do-bathtubs-drain-counterclockwise-in-the-northern-hemisphere"&gt;The Straight Dope&lt;/a&gt;, &lt;a href="http://www.snopes.com/science/coriolis.asp"&gt;Snopes.com&lt;/a&gt;, and other authorities, the whole swirling-the-opposite-way thing is a myth.  Any rotation of water in a toilet, bathtub, sink, etc. is due to previous motion of the water, or direction of a water jet, or shape of the bowl, or other mundane reasons.
&lt;/p&gt;
&lt;p&gt;
But it is true that if you let go of something, it falls up into the air, because we're upside down.  I never would have guessed that was true.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-5432005343597067339?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/5432005343597067339/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=5432005343597067339' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/5432005343597067339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/5432005343597067339'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/11/australian-toilets.html' title='Australian Toilets'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-6170979559613874787</id><published>2008-11-13T06:15:00.001-05:00</published><updated>2008-11-13T06:16:47.900-05:00</updated><title type='text'>JacksOrBetter for iPhone and iPod Touch Now 99 Cents!</title><content type='html'>&lt;div style="float: right; margin-left: 10px; margin-bottom: 10px;"&gt;&lt;a href="http://www.flickr.com/photos/kristopherjohnson/2835235817/" title="photo sharing"&gt;&lt;img src="http://farm4.static.flickr.com/3035/2835235817_c78cea5dc5_m.jpg" alt="" style="border: solid 2px #000000;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size: 0.9em; margin-top: 0px;"&gt;&lt;a href="http://www.flickr.com/photos/kristopherjohnson/2835235817/"&gt;JacksOrBetter for iPhone&lt;/a&gt;&lt;br /&gt;Originally uploaded by &lt;a href="http://www.flickr.com/people/kristopherjohnson/"&gt;kristopherjohnson&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;
JacksOrBetter, my video poker game for iPhone and iPod Touch, is now just 99 cents.  All the fun; half the price!
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=290542821&amp;mt=8"&gt;Click here to buy from the App Store&lt;/a&gt;.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-6170979559613874787?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/6170979559613874787/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=6170979559613874787' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/6170979559613874787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/6170979559613874787'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/11/jacksorbetter-for-iphone-and-ipod-touch.html' title='JacksOrBetter for iPhone and iPod Touch Now 99 Cents!'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3035/2835235817_c78cea5dc5_t.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-8303852368805984036</id><published>2008-11-09T02:40:00.007-05:00</published><updated>2008-11-09T03:19:46.188-05:00</updated><title type='text'>Expatriate</title><content type='html'>&lt;p&gt;
I've never been much of a traveler or a tourist.  I don't get the thrill that others do from sightseeing or being away from home.  But having said that, I've gotta say I'm a little disappointed with how not-foreign Adelaide, Australia is.  I was hoping for a little adventure here on the opposite side of the world, but it's a lot like home.  It's as adventurous as visiting Vancouver.
&lt;/p&gt;
&lt;p&gt;
Of course, I'm not on vacation, and all I've seen of Australia so far is the office where I'm working, and some stuff within walking distance of the hotel.  I'm hoping that next weekend I'll have a chance to see something outside the city.
&lt;/p&gt;
&lt;p&gt;
I was flying over the Pacific on US Election Day, so I didn't get to vote or to watch what was going on.  I caught a little coverage on CNN during my layover in Auckland.  After arriving in Adelaide, it was straight to the office, but a couple of hours later, US networks started projecting the winner, and the Australians were all talking about it.  All the Australians I've talked to are elated about the US election result.  They don't understand the policy differences between the candidates or between the Democrat and Republican parties, but they are happy to see that America elected a black man to its highest office, and they are relieved that Bush's party will no longer be in power.  I don't know what the media coverage is like back home, but over here it is overwhelmingly positive toward Obama, and there is hope that America will start being benevolent again.
&lt;/p&gt;
&lt;p&gt;
My wife's been a trouper, complaining less than I expected about her new husband leaving her for three weeks on short notice.  We're keeping in touch via Skype, instant messenger, text messages, and the occasional insanely-expensive phone call.  Unfortunately, the timezone difference makes it difficult to keep in touch, as I'm sleeping during her day and vice versa.  The only good time for a conversation during the week is when she's getting up at 5:30 AM her time and I've gotten back to the hotel at 9:00 PM my time.  
&lt;/p&gt;
&lt;p&gt;
Australia is a nice place, and the Australians are great people.  But there's no place like home, and I look forward to getting back there.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-8303852368805984036?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/8303852368805984036/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=8303852368805984036' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/8303852368805984036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/8303852368805984036'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/11/expatriate.html' title='Expatriate'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-5739700473418490830</id><published>2008-11-06T07:03:00.001-05:00</published><updated>2008-11-06T07:03:57.227-05:00</updated><title type='text'>Flying to Australia</title><content type='html'>&lt;p&gt;
Flying to Australia from the US is not a pleasant experience.  It takes a long time.  For me, it was a five-hour flight from Atlanta to San Francisco, then a fourteen-hour flight from San Francisco to Auckland, New Zealand, then another five-hour flight from Auckland to Adelaide, South Australia.  Including the layovers, the trip took over thirty hours.  It will be the same on the way back, but of course, I'll be a lot happier when I reach my destination then.
&lt;/p&gt;
&lt;p&gt;
It's expensive, too.  My business-class round-trip ticket was $15,000.
&lt;/p&gt;
&lt;p&gt;
Lucky for me, I flew Air New Zealand.  This is very nice, because their Business Premier-class travel is about as good as you can get without buying your own personal aircraft.  I was expecting a typical business-class seat, which gives you a few extra inches of legroom, but Air New Zealand gives each business-class passenger a very comfortable recliner, an ottoman, and in-flight entertainment system.  With the push of a button, the seat folds down forward and joins the ottoman to form a bed, so it's actually possible to get some restful sleep.
&lt;/p&gt;
&lt;p&gt;
My colleagues who flew United were very jealous.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-5739700473418490830?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/5739700473418490830/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=5739700473418490830' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/5739700473418490830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/5739700473418490830'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/11/flying-to-australia.html' title='Flying to Australia'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-1316101015545006041</id><published>2008-10-30T14:12:00.012-04:00</published><updated>2008-10-30T14:24:11.295-04:00</updated><title type='text'>Australia Bound</title><content type='html'>&lt;p&gt;
I just found out I'll be going to &lt;a href="http://en.wikipedia.org/wiki/Adelaide"&gt;Adelaide, South Australia&lt;/a&gt; for two or three weeks.
&lt;/p&gt;
&lt;p&gt;
I'd appreciate any advice anyone can give regarding what a dumb American might be surprised to find (or more importantly, not find) in Australia.  I know I need to bring the right kind of power cables for my laptops.  What else might I need?  Will my iPhone work there?  Will my credit cards work there?
&lt;/p&gt;
&lt;p&gt;
If you happen to know of great things to go look at in the Adelaide area, I'd be glad to hear about those things too.  But I doubt I'll have much sightseeing time available.
&lt;/p&gt;
&lt;p&gt;
Warning: Any comments that include the terms &lt;em&gt;g'day&lt;/em&gt;, &lt;em&gt;barbie&lt;/em&gt;, or &lt;em&gt;vegemite&lt;/em&gt; may be summarily deleted.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-1316101015545006041?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/1316101015545006041/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=1316101015545006041' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/1316101015545006041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/1316101015545006041'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/10/australia-bound.html' title='Australia Bound'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-620782505476575836</id><published>2008-10-24T08:12:00.004-04:00</published><updated>2008-10-24T13:00:41.415-04:00</updated><title type='text'>Hussein Is My Middle Name</title><content type='html'>&lt;p&gt;On Facebook, there is a group called "Hussein Is My Middle Name."  Here is the description for the group:
&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;
I'm not trying to change anyones' mind about who they vote for this November but I am concerned about how many people have been trying to make an issue of, or just subtly referencing Barack Obama's middle name.
&lt;/p&gt;&lt;p&gt;
These references are clearly bigoted attacks trying to suggest that Mr. Obama is foreign, different, not like the rest of America. Political campaigns can be (and should be) rough, smash mouth affairs but there are limits and this crosses them.
&lt;/p&gt;&lt;p&gt;
I am asking you, whatever your politics, to make a small stand against this kind of politics and bigotry. Join this group and ask all of your friends to join it also. Go to the help section of Facebook and change you middle name to Hussein until the election is over.
&lt;/p&gt;&lt;p&gt;
I've noticed a lot of people that I respect on facebook have already done something similar but I could find no actual group or organization behind it so i am trying to provide it.
&lt;/p&gt;&lt;p&gt;
Thank you for considering this.&lt;br /&gt;
Jason Hussein Wichlacz
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
I like this.  So I'll be known as Kristopher Hussein Johnson online for the next couple of weeks.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Update:&lt;/strong&gt; Paul Hussein Tomblin pointed out that there is another similar group.  Here is the description for that group:
&lt;/p&gt;
&lt;blockquote&gt; 
Recently, what with the rise of Barack Obama, American Conservatives have been using the Illinois Senator's name as if it were a slur. Folks from Michael Savage (real name Michael Weiner) to Rush Limbaugh to rest of the bobble head Right have been over emphasizing his middle name as if to remind you that he could be Muslim. This bigoted move shows how wrong they are. In a symbolic show of support, I say we all say our middle name is Hussein, regardless if you're an Obama supporter or a Clinton one. Hatemongering should be challenged on all fronts!
&lt;/blockquote&gt;
&lt;p&gt;
This one is a little more left-oriented than the other, neutral group, but I still agree with the main sentiment.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-620782505476575836?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/620782505476575836/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=620782505476575836' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/620782505476575836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/620782505476575836'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/10/hussein-is-my-middle-name.html' title='Hussein Is My Middle Name'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-4400271401000213958</id><published>2008-10-17T11:56:00.003-04:00</published><updated>2008-10-17T12:01:14.071-04:00</updated><title type='text'>goto</title><content type='html'>&lt;p&gt;
Yeah, I had to put a &lt;tt&gt;goto&lt;/tt&gt; into the code today.  I suck.
&lt;/p&gt;
&lt;p&gt;
I promise I'll take it out when I have time to do some refactoring.  But you see, when some moron writes an 872-line function with eleven levels of &lt;tt&gt;if&lt;/tt&gt; and &lt;tt&gt;while&lt;/tt&gt; statements, it's difficult to find ways to clean things up.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-4400271401000213958?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/4400271401000213958/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=4400271401000213958' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/4400271401000213958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/4400271401000213958'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/10/goto.html' title='goto'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-4059986565704286278</id><published>2008-10-10T09:06:00.005-04:00</published><updated>2008-10-10T11:49:12.609-04:00</updated><title type='text'>What's the Deal with the Financial Crisis?</title><content type='html'>&lt;p&gt;
If, like me, you have been a little mystified by exactly what's going on with the sub-prime mortgage crisis and the recent financial meltdown, and why any of us should care, here are two episodes of the &lt;i&gt;This American Life&lt;/i&gt; podcast that clearly explain what has happened and what is at stake:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.thislife.org/Radio_Episode.aspx?episode=355"&gt;The Giant Pool of Money&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.thisamericanlife.org/Radio_Episode.aspx?episode=365"&gt;Another Frightening Show About the Economy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
These podcasts are worth a couple of hours of your time, even if you think you already understand it all.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-4059986565704286278?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/4059986565704286278/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=4059986565704286278' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/4059986565704286278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/4059986565704286278'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/10/whats-deal-with-financial-crisis.html' title='What&apos;s the Deal with the Financial Crisis?'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-3675499751325990432</id><published>2008-10-05T11:48:00.010-04:00</published><updated>2008-10-05T12:31:36.768-04:00</updated><title type='text'>Soccer Team Photos</title><content type='html'>&lt;div style="float: right; margin-left: 10px; margin-bottom: 10px;"&gt;

&lt;a href="http://www.flickr.com/photos/kristopherjohnson/1933929240/" title="photo sharing"&gt;&lt;img src="http://farm3.static.flickr.com/2317/1933929240_0f0f2b889f_m.jpg" alt="" style="border: solid 2px #000000;" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;span style="font-size: 0.9em; margin-top: 0px;"&gt;&lt;a href="http://www.flickr.com/photos/kristopherjohnson/1933929240/"&gt;Blue Thunder 2007&lt;/a&gt;
&lt;br /&gt;
&lt;/span&gt;

&lt;br /&gt;

&lt;a href="http://www.flickr.com/photos/kristopherjohnson/2914268525/" title="photo sharing"&gt;&lt;img src="http://farm4.static.flickr.com/3022/2914268525_a76cab82ea_m.jpg" alt="" style="border: solid 2px #000000;" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;span style="font-size: 0.9em; margin-top: 0px;"&gt;&lt;a href="http://www.flickr.com/photos/kristopherjohnson/2914268525/"&gt;Orange Crush 2008&lt;/a&gt;
&lt;br /&gt;
&lt;/span&gt;

&lt;br /&gt;

&lt;a href="http://www.flickr.com/photos/kristopherjohnson/2915112920/" title="photo sharing"&gt;&lt;img src="http://farm4.static.flickr.com/3134/2915112920_45ca2e7c63_m.jpg" alt="" style="border: solid 2px #000000;" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;span style="font-size: 0.9em; margin-top: 0px;"&gt;&lt;a href="http://www.flickr.com/photos/kristopherjohnson/2915112920/"&gt;Bailey in Orange&lt;/a&gt;
&lt;br /&gt;
&lt;/span&gt;

&lt;/div&gt;
&lt;p&gt;
For the past couple of soccer seasons, I've had the honor of taking my stepson's soccer team photos.  We take group pictures of the whole team and individual pictures of each player in uniform, and give a CD-ROM containing all the pictures to each kid's parents.
&lt;/p&gt;
&lt;p&gt;
It's a lot of work, but it is fun.  It's not often that a photographer gets the opportunity to have so many models to work with.  The models are often uncooperative, but it's still a great opportunity to practice portrait-taking techniques.  And taking pictures of kids is really easy: you don't have to worry about wrinkles, blemishes, yellow teeth, bald spots, or any of the other things that grown-ups hate in their pictures.
&lt;/p&gt;
&lt;p&gt;
Here are some things I've learned through making mistakes:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Try to get the pictures early in the morning, or late in the afternoon, so that the light is somewhat controllable.  A cloudy day is best, but it is not feasible to try to schedule all the players to get together in accordance with a weather forecast.&lt;/li&gt;
&lt;li&gt;Take shots in the shade.  All the parents will want a picture of the kids standing on the field in front of a soccer goal, but unless it's a cloudy day, sunlight is too harsh.&lt;/li&gt;
&lt;li&gt;Have a soccer ball for the players to hold.  (For other sports, have appropriate props.)&lt;/li&gt;
&lt;li&gt;Have an assistant who can direct the kids, pose them, smooth their hair, etc.  (My wife does this very well.)&lt;/li&gt;
&lt;li&gt;Frame the pictures such that you can crop to 8x10 and 5x7.&lt;/li&gt;
&lt;li&gt;When photographing kids, it is a good idea to let them shoot a few giving them permission to make funny faces and gestures.  This makes it a lot easier to get them to behave when you want to take the "real pictures."&lt;li&gt;
&lt;li&gt;Let the kids be themselves.  The pictures are better if they show a little of each kids personality.&lt;/li&gt;
&lt;li&gt;Parents are usually pretty cooperative, but make sure the kids look at you, not at their parents, while you are shooting.&lt;/li&gt;
&lt;li&gt;Take a lot of pictures.  This gives the parents a lot to choose from, so each one can choose the picture where their kid looks the best.&lt;/li&gt;
&lt;li&gt;Don't charge for taking pictures.  Then you don't have to worry too much about complaints.  We just ask the parents to each chip in a dollar to pay for the CD's.&lt;/li&gt;
&lt;li&gt;Remember that the goal is to have fun.&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-3675499751325990432?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/3675499751325990432/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=3675499751325990432' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/3675499751325990432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/3675499751325990432'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/10/soccer-team-photos.html' title='Soccer Team Photos'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2317/1933929240_0f0f2b889f_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-2239963730353804329</id><published>2008-10-02T14:31:00.003-04:00</published><updated>2008-10-02T14:33:25.286-04:00</updated><title type='text'>Programmer Cartoons</title><content type='html'>&lt;p&gt;
&lt;a href="http://stackoverflow.com"&gt;Stack Overflow&lt;/a&gt; is a website designed for programmers to get answers to questions.  They frown on frivolity there, but once in a while something fun rises to the top.
&lt;/p&gt;
&lt;p&gt;
For example, there is a great set of &lt;a href="http://stackoverflow.com/questions/84556/whats-your-favorite-programmer-cartoon"&gt;Favorite Programmer Cartoons&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
(Warning: If you aren't a software developer, you may not find these very funny.)
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-2239963730353804329?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/2239963730353804329/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=2239963730353804329' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/2239963730353804329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/2239963730353804329'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/10/programmer-cartoons.html' title='Programmer Cartoons'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-6299418129435128336</id><published>2008-10-02T07:35:00.002-04:00</published><updated>2008-10-02T07:52:30.351-04:00</updated><title type='text'>Another Gasoline Shortage</title><content type='html'>&lt;p&gt;
The recent gasoline shortage in the Southeast appears to be easing.  Many of the gas stations I pass on the way to work have long lines of cars waiting to fill up, but that is an improvement over the past few weeks, when there were no lines because there was no gas for sale.
&lt;/p&gt;
&lt;p&gt;
I drive about 90 miles per day to/from work, so I need to fill up a couple of times per week.  Searching for gas and waiting in lines had become a significant part of my life.  Once, I got lucky and just happened to see a tanker truck pulling into a station while I was driving to work, so I got to rush in and be at the head of the line, but that kind of luck is rare.
&lt;/p&gt;
&lt;p&gt;
Three years ago, after Katrina, we had a &lt;a href="http://kristopherjohnson.blogspot.com/2005/08/gas-prices.html"&gt;similar gas shortage&lt;/a&gt;, but that one did not last nearly as long.  Most people are blaming our governor for waiting too long to request exemptions that would allow less-environmentally-friendly gasoline to come into Georgia.  Of course, the truth is much more complicated than that.  Two hurricanes hit the gulf in rapid succession.  The zealous quest for efficiency by oil companies means that they don't maintain surplus inventory, and so any hiccup screws everything up.  Threats to prosecute suppliers for "gouging" means that those suppliers have no incentive to take extraordinary measures to increase the supply.
&lt;/p&gt;
&lt;p&gt;
Having a transportation system reliant upon supply and transport of fuel increasingly seems like a dumb idea.  Where are our electric cars, already?
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-6299418129435128336?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/6299418129435128336/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=6299418129435128336' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/6299418129435128336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/6299418129435128336'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/10/another-gasoline-shortage.html' title='Another Gasoline Shortage'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-5041454352268472397</id><published>2008-10-02T05:38:00.002-04:00</published><updated>2008-10-02T05:46:27.697-04:00</updated><title type='text'>iPhone Development NDA Lifted</title><content type='html'>&lt;p&gt;
Announcement: &lt;a href="http://developer.apple.com/iphone/program/"&gt;http://developer.apple.com/iphone/program/&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
(Actually, it will be in effect for a few more days.  But the madness is ending soon.)
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-5041454352268472397?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/5041454352268472397/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=5041454352268472397' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/5041454352268472397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/5041454352268472397'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/10/iphone-development-nda-lifted.html' title='iPhone Development NDA Lifted'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-2384441510977425673</id><published>2008-09-25T08:40:00.005-04:00</published><updated>2008-09-25T08:46:18.343-04:00</updated><title type='text'>Thanks, Apple Developer Technical Support</title><content type='html'>&lt;p&gt;
I had a problem with the iPhone application I was developing, so I submitted a request to Apple Developer Technical Support, which is currently the only "legal" way to get any help with iPhone development.  (Asking anyone outside of Apple is verboten, due to the non-disclosure agreement.)
&lt;/p&gt;
&lt;p&gt;
Eighteen days later, I have finally received a response.  Gee, thanks.
&lt;/p&gt;
&lt;p&gt;
I may start looking at &lt;a href="http://code.google.com/android/"&gt;Android&lt;/a&gt;.  The Android phones may not be as nice as the iPhone, but at least Google treats its customers and developers better than Apple does.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-2384441510977425673?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/2384441510977425673/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=2384441510977425673' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/2384441510977425673'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/2384441510977425673'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/09/thanks-apple-developer-technical.html' title='Thanks, Apple Developer Technical Support'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-6336817798591412241</id><published>2008-09-18T06:44:00.008-04:00</published><updated>2008-09-29T11:19:08.168-04:00</updated><title type='text'>JacksOrBetter for iPhone and iPod Touch Now Available!</title><content type='html'>&lt;p&gt;
&lt;a href="http://kristopherjohnson.blogspot.com/2008/09/jacksorbetter-for-iphone.html"&gt;JacksOrBetter&lt;/a&gt; for iPhone and iPod Touch is now available from the App Store.
&lt;/p&gt;
&lt;p&gt;
If you have iTunes, &lt;a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=290542821&amp;mt=8"&gt;click here to see it in the App Store&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Time to quit my job, and just watch the money roll in...
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Update:&lt;/em&gt; During the first two weeks my app was available, it sold 65 copies, netting me about $90.  Maybe it's not quite time to quit my job.
&lt;/p&gt;
&lt;p&gt;
I found another iPhone developer who tells his story of getting his app developed, submitted, and accepted.  It's remarkably similar to the story I would tell: &lt;a href="http://www.mikeash.com/?page=pyblog/the-iphone-development-story.html"&gt;The iPhone Development Story&lt;/a&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-6336817798591412241?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/6336817798591412241/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=6336817798591412241' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/6336817798591412241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/6336817798591412241'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/09/jacksorbetter-for-iphone-and-ipod-touch.html' title='JacksOrBetter for iPhone and iPod Touch Now Available!'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-6513630195919907781</id><published>2008-09-15T08:20:00.004-04:00</published><updated>2008-09-15T08:33:47.223-04:00</updated><title type='text'>Alas, the App Store</title><content type='html'>&lt;p&gt;
I'm still waiting for my &lt;a href="http://kristopherjohnson.blogspot.com/2008/09/jacksorbetter-for-iphone.html"&gt;JacksOrBetter&lt;/a&gt; application to be available in the iPhone App Store.  I have received notification that the application has been approved for sale, but my contract with Apple is still "pending" (whatever that means).
&lt;/p&gt;
&lt;p&gt;
The App Store is great in many ways.  It makes it very easy for users to buy apps at reasonable prices, and very easy for developers to sell them.  However, Apple may be discouraging the development of truly great applications with its policies.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://almerica.blogspot.com/2008/09/podcaster-rejeceted-because-it.html"&gt;Applications are being rejected&lt;/a&gt; by Apple for various, seemingly arbitrary reasons.  This is very bad for the viability of the platform.  It means a company that invests in iPhone development is taking a very big risk.  No matter how great the app is, Apple could refuse to sell it in the App Store.  And if you can't sell it in the App Store, you can't sell it at all.
&lt;/p&gt;
&lt;p&gt;
There are other problems.  The non-disclosure agreement discourages developers from sharing information about iPhone development.  Restrictive APIs and licensing agreements prevent developers from creating many kinds of apps they want to create.  Long delays for application approval leave developers frustrated.
&lt;/p&gt;
&lt;p&gt;
The App Store could be a great market for great applications for a great platform.  Maybe Apple knows what it's doing, but I hope they will loosen their grip before they squeeze out the folks who can really do amazing stuff for the iPhone.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-6513630195919907781?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/6513630195919907781/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=6513630195919907781' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/6513630195919907781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/6513630195919907781'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/09/alas-app-store.html' title='Alas, the App Store'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-4412794820442760466</id><published>2008-09-15T07:21:00.010-04:00</published><updated>2008-09-16T17:40:57.094-04:00</updated><title type='text'>Stack Overflow</title><content type='html'>&lt;p&gt;
There is a new web site for software developers to ask questions and get answers: &lt;a href="http://stackoverflow.com"&gt;Stack Overflow&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
I've been one of the site's beta testers for the past month, and I've been impressed with the quality of the information available on the site.  Of course, there are plenty of a-holes there, but I think it will become one of the top go-to sites for developers.
&lt;/p&gt;
&lt;p&gt;
What's cool about Stack Overflow:
&lt;ul&gt;
&lt;li&gt;It's free (unlike some other programmer-question-and-answer sites).&lt;/li&gt;
&lt;li&gt;Simple question-and-answer format keeps things focused.&lt;/li&gt;
&lt;li&gt;Voting lets the good information rise to the top, and the spam disappear.&lt;/li&gt;
&lt;li&gt;Editing allows outdated information to be corrected.&lt;/li&gt;
&lt;li&gt;Reputation system prevents newbies from screwing things up too much.&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;
It is now open to the public.  Please read &lt;a href="http://stackoverflow.com/faq"&gt;the FAQ&lt;/a&gt; before participating, and please don't screw it up.
&lt;/p&gt;
&lt;p&gt;
Also take a look at &lt;a href="http://www.joelonsoftware.com/items/2008/09/15.html"&gt;Joel Spolsky's explanation of how it should work&lt;/a&gt;, and &lt;a href="http://www.codinghorror.com/blog/archives/001169.html"&gt;Jeff Atwood's blog entry&lt;/a&gt;.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-4412794820442760466?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/4412794820442760466/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=4412794820442760466' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/4412794820442760466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/4412794820442760466'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/09/stack-overflow.html' title='Stack Overflow'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-211871468594350475</id><published>2008-09-11T13:15:00.007-04:00</published><updated>2008-09-11T20:00:02.873-04:00</updated><title type='text'>Troubleshooting the MacBook Air SuperDrive</title><content type='html'>&lt;p&gt;
My wife has a &lt;a href="http://www.apple.com/macbookair/"&gt;MacBook Air&lt;/a&gt;.  One of the things that makes it so light is that it doesn't have an internal SuperDrive (writable DVD/CD).  Apple sells a special external SuperDrive designed to specifically work with the MacBook Air.
&lt;/p&gt;
&lt;p&gt;
Unfortunately, we couldn't get the SuperDrive to work.  Any disc we inserted would be ejected, without being recognized by the computer.  After a few days of struggling with this, we decided we'd take it back to the local Apple Store.
&lt;/p&gt;
&lt;p&gt;
We live in the boonies, so a trip to the Apple Store requires D-Day-like preparation.  So, the SuperDrive sat on the desk for a while.  But then, my wife figured out the problem.
&lt;/p&gt;
&lt;p&gt;
It was upside-down.
&lt;/p&gt;
&lt;p&gt;
Yep, it was &lt;em&gt;upside-down&lt;/em&gt;.
&lt;/p&gt;
&lt;p&gt;
You see, Apple products aren't designed like other computer manufacturer's products.  Most products have a shiny logo on the top of the product, and the bottom looks like a piece of military hardware.  The MacBook Air SuperDrive has a shiny silver side, and a shiny side with an Apple logo.
&lt;/p&gt;
&lt;p&gt;
It never occurred to us that the logo-side would be the bottom.  She turned it logo-side-down, and now it works fine.
&lt;/p&gt;
&lt;p&gt;
We feel really smart for figuring that one out.  At least we didn't have to be told by a Genius at the Apple Store.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-211871468594350475?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/211871468594350475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=211871468594350475' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/211871468594350475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/211871468594350475'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/09/troubleshooting-macbook-air-superdrive.html' title='Troubleshooting the MacBook Air SuperDrive'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-3242360537180358195</id><published>2008-09-09T11:34:00.013-04:00</published><updated>2008-09-09T12:14:34.312-04:00</updated><title type='text'>Favorite Podcasts</title><content type='html'>&lt;p&gt;
If you're like me, you might like the same podcasts I do.  Here are my current favorites.
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://youlooknicetoday.com/"&gt;You Look Nice Today: A Journal of Emotional Hygiene&lt;/a&gt;: I find this hilarious, although I suspect most people won't get it at all.  It's basically just three guys talking, alternating between being absurd and being abusive toward one another.  The cultural references are primarily geared toward white American males in their 30's and 40's who have never played team sports.  This podcast is not safe for work.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.stackoverflow.com/"&gt;Stack Overflow&lt;/a&gt;: This is a series of conversations between Joel&amp;nbsp;Spolsky (the &lt;a href="http://joelonsoftware.com"&gt;Joel on&amp;nbsp;Software&lt;/a&gt; guy) and Jeff&amp;nbsp;Atwood (the &lt;a href="http://codinghorror.com"&gt;Coding&amp;nbsp;Horror&lt;/a&gt; guy).  The conversations are centered around development of the new &lt;a href="http://stackoverflow.com"&gt;stackoverflow.com&lt;/a&gt; programmers' web site, but they follow a lot of diversions into general software development topics.  If you're a software developer, you'll find this podcast very interesting.  If you're not, you won't know what they're talking about.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thisamericanlife.org/"&gt;This American Life&lt;/a&gt;: I've &lt;a href="http://kristopherjohnson.blogspot.com/2008/06/this-american-life.html"&gt;written about this before&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.themoth.org/podcast"&gt;The Moth Podcast&lt;/a&gt;: This podcast consists of people telling stories on stage.  Most are pretty good.  Some aren't.&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-3242360537180358195?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/3242360537180358195/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=3242360537180358195' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/3242360537180358195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/3242360537180358195'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/09/favorite-podcasts.html' title='Favorite Podcasts'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-1545823901183109816</id><published>2008-09-08T14:55:00.003-04:00</published><updated>2008-09-08T14:59:00.543-04:00</updated><title type='text'>Secrets of Recruiters</title><content type='html'>&lt;p&gt;
When you are contacted by a recruiter, they will give you a description of the job they want you to take, but they won't tell you the name of the employer.  This ensures that they will get their cut for their "assistance" if you eventually get the job.
&lt;/p&gt;
&lt;p&gt;
Luckily, recruiters are as lazy as the rest of us.  If you Google the description, you can usually find the job listing or company profile.
&lt;/p&gt;
&lt;p&gt;
I don't do this to screw recruiters out of their take.  If I am interested in the job, I'll go through the recruiter.  I just do it to save time; 90% of the jobs offered via recruiters are not worth pursuing.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-1545823901183109816?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/1545823901183109816/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=1545823901183109816' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/1545823901183109816'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/1545823901183109816'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/09/secrets-of-recruiters.html' title='Secrets of Recruiters'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-6707140306794043713</id><published>2008-09-08T12:37:00.008-04:00</published><updated>2008-10-02T07:23:50.237-04:00</updated><title type='text'>Night Shift</title><content type='html'>&lt;p&gt;
The team I'm working with is involved in installing a new system in &lt;a href="http://en.wikipedia.org/wiki/South_australia"&gt;South Australia&lt;/a&gt;.  A few people are on site in &lt;a href="http://en.wikipedia.org/wiki/Adelaide"&gt;Adelaide&lt;/a&gt;, but most of us are still back here in Georgia, USA.
&lt;/p&gt;
&lt;p&gt;
South Australia is thirteen-and-a-half hours ahead of US Eastern time.  This has made it difficult to provide support from home, as they work while we sleep and vice versa.
&lt;/p&gt;
&lt;p&gt;
We came up with a solution:  the people in the States will be working from 3:00 PM to 11:00 PM, which is 4:30 AM to 12:30 AM in Adelaide.  The people in Australia will show up at 7:00 AM their time (which is the earliest they are allowed into the building), giving us a few hours of overlapping duty.
&lt;/p&gt;
&lt;p&gt;
So, this week I get to see my wife and stepson for just a few minutes each morning (as they prepare for school/work) and each evening (when I get home around midnight).  That stinks, but I guess it's better than traveling to Australia myself.
&lt;/p&gt;
&lt;p&gt;
(I know some people will chime in and say "Oh, you've got to go to Australia!  It's wonderful!"  You people obviously aren't IT workers.  If I go to Australia for this project, all I will get to see is the airport, the hotel, and the basement where they keep the computers.  Sightseeing is for people in Business Development.)
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-6707140306794043713?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/6707140306794043713/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=6707140306794043713' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/6707140306794043713'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/6707140306794043713'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/09/night-shift.html' title='Night Shift'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-381991208817176824</id><published>2008-09-07T07:49:00.010-04:00</published><updated>2008-11-13T06:15:09.921-05:00</updated><title type='text'>JacksOrBetter for iPhone and iPod Touch</title><content type='html'>&lt;div style="float: right; margin-left: 10px; margin-bottom: 10px;"&gt;&lt;a href="http://www.flickr.com/photos/kristopherjohnson/2835235817/" title="photo sharing"&gt;&lt;img src="http://farm4.static.flickr.com/3035/2835235817_c78cea5dc5_m.jpg" alt="" style="border: solid 2px #000000;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size: 0.9em; margin-top: 0px;"&gt;&lt;a href="http://www.flickr.com/photos/kristopherjohnson/2835235817/"&gt;JacksOrBetter for iPhone&lt;/a&gt;&lt;br /&gt;Originally uploaded by &lt;a href="http://www.flickr.com/people/kristopherjohnson/"&gt;kristopherjohnson&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;
Several years back, I created &lt;a href="http://kristopherjohnson.blogspot.com/2004/01/jacksorbetter.html"&gt;JacksOrBetter&lt;/a&gt; for Palm OS.  Now, I've created an updated version of that for iPhone and iPod Touch.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=290542821&amp;mt=8"&gt;Click here to buy from the App Store&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
It is priced at 99 cents.  I considered giving it away for free, but if I can derive a little income from it, my wife will let me keep "toodling with the computer" on weekends.
&lt;/p&gt;
&lt;p&gt;
I'd love to give free copies to my family and friends with iPhones using the "Ad Hoc distribution" mechanism, but frankly, it's easier to just pay the two bucks.  (I'll reimburse you if you are disappointed.)
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-381991208817176824?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/381991208817176824/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=381991208817176824' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/381991208817176824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/381991208817176824'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/09/jacksorbetter-for-iphone.html' title='JacksOrBetter for iPhone and iPod Touch'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3035/2835235817_c78cea5dc5_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-6466496354097347445</id><published>2008-08-20T20:10:00.006-04:00</published><updated>2009-04-26T08:50:30.142-04:00</updated><title type='text'>Know Your Programming Languages</title><content type='html'>This post has been moved to &lt;a href="http://undefinedvalue.com/2008/08/20/know-your-programming-languages"&gt;undefinedvalue.com&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-6466496354097347445?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/6466496354097347445/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=6466496354097347445' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/6466496354097347445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/6466496354097347445'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/08/know-your-programming-languages.html' title='Know Your Programming Languages'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-8449541003507855097</id><published>2008-08-20T20:01:00.002-04:00</published><updated>2008-08-20T20:04:23.479-04:00</updated><title type='text'>Clueless Blockbuster CEO</title><content type='html'>&lt;p&gt;
This is funny: &lt;a href="http://blog.wired.com/business/2008/08/blockbuster-ceo.html"&gt;Blockbuster CEO 'Confused by Fascination' With Netflix&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Why would anyone want to watch anything other than new releases, he wonders.&lt;/em&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-8449541003507855097?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/8449541003507855097/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=8449541003507855097' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/8449541003507855097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/8449541003507855097'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/08/clueless-blockbuster-ceo.html' title='Clueless Blockbuster CEO'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-8169834783763567100</id><published>2008-08-06T19:10:00.003-04:00</published><updated>2008-08-06T20:31:22.257-04:00</updated><title type='text'>MobileMe Suckage</title><content type='html'>&lt;p&gt;
Everybody knows that Apple's new MobileMe service sucks.  But for me, it sucks more than for most people.
&lt;/p&gt;
&lt;p&gt;
You see, I had the .Mac service before "the transition."  .Mac wasn't all that useful, but it worked, and I never had any complaints.  But, since .Mac changed into MobileMe, I've been unable to access any of its services.  I can't log in to the website, can't get e-mail, can't sync my Macs or iPhone.
&lt;/p&gt;
&lt;p&gt;
Whenever I try to log in, I get a message indicating I have an invalid username and/or password.  I used the same settings that worked for .Mac.  I can go to the "I forgot my password page", and it lets me change my password, but I still can't log in to MobileMe.
&lt;/p&gt;
&lt;p&gt;
I've sent e-mail to Apple Support, but it has been ignored.  Whenever I try to chat with a support agent, I'm told "We're sorry.  All support agents are currently busy.  Please try again later."
&lt;/p&gt;
&lt;p&gt;
Even though I can't log in, I've just received my "It's almost time to renew your MobileMe contract" mail from Apple.  Ha!
&lt;/p&gt;
&lt;p&gt;
UPDATE: About an hour after I posted the above tirade, I finally got to chat with an Apple support agent, who reset my password and now everything works fine.  I don't know why the reset he did was different from all the resets I've done myself.  Unfortunately, syncing with MobileMe now results in me losing all the contact and calendar information I've been entering into my iPhone for the past couple of weeks.  Oh, well...
&lt;p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-8169834783763567100?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/8169834783763567100/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=8169834783763567100' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/8169834783763567100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/8169834783763567100'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/08/mobileme-suckage.html' title='MobileMe Suckage'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-978404890701350357</id><published>2008-07-28T21:57:00.007-04:00</published><updated>2009-04-26T08:53:38.206-04:00</updated><title type='text'>First Contact</title><content type='html'>This post has been moved to &lt;a href="http://undefinedvalue.com/2008/07/28/first-contact"&gt;undefinedvalue.com&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-978404890701350357?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/978404890701350357/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=978404890701350357' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/978404890701350357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/978404890701350357'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/07/first-contact.html' title='First Contact'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-4063481868294093854</id><published>2008-07-10T10:16:00.005-04:00</published><updated>2009-04-26T08:55:54.956-04:00</updated><title type='text'>Fairness</title><content type='html'>This post has been moved to &lt;a href="http://undefinedvalue.com/2008/07/10/fairness"&gt;undefinedvalue.com&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-4063481868294093854?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/4063481868294093854/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=4063481868294093854' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/4063481868294093854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/4063481868294093854'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/07/fairness.html' title='Fairness'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-3981702249486120158</id><published>2008-07-02T20:59:00.002-04:00</published><updated>2008-07-02T21:19:25.452-04:00</updated><title type='text'>Professional Development</title><content type='html'>&lt;p&gt;
My career has hit a pothole again.  As an independent contractor, I took a gig that was supposed to be a long-term project involving design and implementation of the next generation of an important system.  Unfortunately, that project got canceled during a re-org, and so now my job involves patching holes in an old codebase.  The working conditions are good, and they pay me well, so I'm going to stick with it for the rest of the year, but it's time to find a new direction.
&lt;/p&gt;
&lt;p&gt;
What direction?  When I originally got interested in computers as a teenager, simulation was something that appealed to me, and lately my interest has been rekindled.  Constructing abstract models of the world has always been what I like about being a software developer.  Unfortunately, I haven't had a lot of experience with simulation, but I do want to head in that direction.
&lt;/p&gt;
&lt;p&gt;
I discovered that Georgia Tech offers a distance-learning graduate program for "Modeling and Simulation."  I'm not sure yet that I want to (or even can) commit to a couple of years of graduate work, but I have a few months to work that out if I want to start in Fall 2009.  So, I'm going to take the GRE and do other things in preparation for that.
&lt;/p&gt;
&lt;p&gt;
I've finally done something I've wanted to do for twenty years:  I've joined the &lt;a href="http://acm.org"&gt;ACM&lt;/a&gt; and &lt;a href="http://ieee.org"&gt;IEEE&lt;/a&gt;.  I'm going to try to thoroughly study a couple of journal articles each week.
&lt;/p&gt;
&lt;p&gt;
I've been learning &lt;a href="http://www.erlang.org"&gt;Erlang&lt;/a&gt;.  I gave it a try a few years ago, but at that time the functional-programming features confused me.  Now, after some experience with &lt;a href="http://caml.inria.fr/ocaml/index.en.html"&gt;OCaml&lt;/a&gt; and &lt;a href="http://www.haskell.org/"&gt;Haskell&lt;/a&gt;, that aspect is familiar and so I can concentrate on the concurrency and fault-tolerance features.  The language fits in well with my ideas of how simulations should be implemented, so I hope to have a chance to use this language someday.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-3981702249486120158?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/3981702249486120158/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=3981702249486120158' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/3981702249486120158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/3981702249486120158'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/07/professional-development.html' title='Professional Development'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-9176256130234438864</id><published>2008-06-29T12:10:00.005-04:00</published><updated>2009-04-26T08:57:53.312-04:00</updated><title type='text'>Mouse</title><content type='html'>This post has moved to &lt;a href="http://undefinedvalue.com/2008/06/29/mouse"&gt;undefinedvalue.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-9176256130234438864?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/9176256130234438864/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=9176256130234438864' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/9176256130234438864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/9176256130234438864'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/06/mouse.html' title='Mouse'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-4485648658156437415</id><published>2008-06-14T07:38:00.003-04:00</published><updated>2009-04-26T09:01:30.970-04:00</updated><title type='text'>The Grand Re-Passwording</title><content type='html'>This post has been moved to &lt;a href="http://undefinedvalue.com/2008/06/14/grand-re-passwording"&gt;undefinedvalue.com&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-4485648658156437415?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/4485648658156437415/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=4485648658156437415' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/4485648658156437415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/4485648658156437415'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/06/grand-re-passwording.html' title='The Grand Re-Passwording'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-4909817455312535653</id><published>2008-06-05T08:14:00.004-04:00</published><updated>2009-04-26T09:04:27.696-04:00</updated><title type='text'>This American Life</title><content type='html'>This post has been moved to &lt;a href="http://undefinedvalue.com/2008/06/05/american-life"&gt;undefinedvalue.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-4909817455312535653?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/4909817455312535653/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=4909817455312535653' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/4909817455312535653'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/4909817455312535653'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/06/this-american-life.html' title='This American Life'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-9014065617148394315</id><published>2008-05-25T21:57:00.002-04:00</published><updated>2008-05-25T22:05:19.723-04:00</updated><title type='text'>My Honey's Blog</title><content type='html'>&lt;p&gt;
My wife Pebble now has a blog.  Please visit and tell her that I am a much better person than the one she lives with. &lt;a href="feed://web.mac.com/drpebble/Site/Blog/rss.xml"&gt;feed://web.mac.com/drpebble/Site/Blog/rss.xml&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
She also has a .Mac web site, most of which is about how wonderful I am.  I recommend reading it. &lt;a href="http://web.mac.com/drpebble/Site/Welcome.html"&gt;http://web.mac.com/drpebble/Site/Welcome.html&lt;/a&gt;.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-9014065617148394315?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/9014065617148394315/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=9014065617148394315' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/9014065617148394315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/9014065617148394315'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/05/my-honeys-blog.html' title='My Honey&apos;s Blog'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-7314420903735693722</id><published>2008-04-28T08:35:00.004-04:00</published><updated>2008-04-28T08:38:52.342-04:00</updated><title type='text'>Old Man</title><content type='html'>&lt;p&gt;
We got an Xbox 360 this weekend.  I went to the store to buy Guitar Hero III for it.
&lt;/p&gt;
&lt;p&gt;
I came home with Guitar Hero III &lt;em&gt;for the Playstation 3!&lt;/em&gt;  We don't have a Playstation 3.
&lt;/p&gt;
&lt;p&gt;
It's true: eventually, we all turn into our parents.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-7314420903735693722?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/7314420903735693722/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=7314420903735693722' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/7314420903735693722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/7314420903735693722'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/04/we-got-xbox-360-this-weekend.html' title='Old Man'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-6736953527105915594</id><published>2008-04-22T12:17:00.002-04:00</published><updated>2008-04-22T12:17:39.528-04:00</updated><title type='text'>Killbots Want Peace Too</title><content type='html'>&lt;div style="float: left; margin-left: 10px; margin-bottom: 10px;"&gt; &lt;a href="http://www.flickr.com/photos/littleanimals/2429862923/" title="photo sharing"&gt;&lt;img src="http://farm4.static.flickr.com/3051/2429862923_01ba069d5f_m.jpg" alt="" style="border: solid 2px #000000;" /&gt;&lt;/a&gt; &lt;br /&gt; &lt;span style="font-size: 0.9em; margin-top: 0px;"&gt;  &lt;a href="http://www.flickr.com/photos/littleanimals/2429862923/"&gt;killbots_want_peace&lt;/a&gt;  &lt;br /&gt;  Originally uploaded by &lt;a href="http://www.flickr.com/people/littleanimals/"&gt;darkpony&lt;/a&gt; &lt;/span&gt;&lt;/div&gt;&lt;br clear="all" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-6736953527105915594?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/6736953527105915594/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=6736953527105915594' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/6736953527105915594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/6736953527105915594'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/04/killbots-want-peace-too.html' title='Killbots Want Peace Too'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3051/2429862923_01ba069d5f_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-2016063019412271614</id><published>2008-04-19T11:27:00.007-04:00</published><updated>2008-04-19T12:33:45.416-04:00</updated><title type='text'>The Wedding and Honeymoon</title><content type='html'>&lt;p&gt;
As indicated in previous posts, I got married on April 5.  Although it was obviously one of the most important events in my life, I haven't written much about it, due to lack of free time.  So, here's all the stuff I should have written during the past few weeks.
&lt;/p&gt;
&lt;h3&gt;The Wedding&lt;/h3&gt;
&lt;p&gt;
Pebble and I both wanted a simple wedding.  Our first idea was to only invite immediate family.  But then we figured we should also invite our neighbors.  And if we were inviting the neighbors, we should also invite close friends.  And if we were having that many guests, maybe we should have a band.  So, we ended up with about 50 people attending the wedding.
&lt;/p&gt;
&lt;p&gt;
The wedding and reception were at &lt;a href="http://theoarhouse.com/"&gt;The Oar House&lt;/a&gt;, a nice little restaurant that happens to be about a mile from our house.  The restaurant's property borders the Chestatee River, so we hoped to have the ceremony on the river bank, followed by dinner reception.
&lt;/p&gt;
&lt;p&gt;
Pebble is an ardent do-it-yourselfer, so we spent a lot of time at craft stores getting all the stuff needed for decorations, place settings, centerpieces, party favors, and so on.  We also spent a lot of time putting the stuff together, but we were able to draft family members to help with that.
&lt;/p&gt;
&lt;p&gt;
Then, it rained on the wedding day.
&lt;/p&gt;
&lt;p&gt;
We were, of course, disappointed.  Due to the rain, we had to abandon the idea of the riverside ceremony, and instead hold it inside the reception tent.  We also had trouble getting good pictures in our wedding garb.
&lt;/p&gt;
&lt;p&gt;
But, in hindsight, the rain wasn't all bad.  It kept everybody inside the tent, which gave intimacy to the event.  I enjoyed spending the time with good friends, some of whom I haven't seen in years.
&lt;/p&gt;
&lt;p&gt;
We hired the band &lt;a href="http://emeraldrose.com/"&gt;Emerald Rose&lt;/a&gt; to perform.  They hold a special place in our memories, as Pebble invited me to see them on our second date.  Also, one of the band members is our next-door neighbor, and another band member is the husband of the woman who officiated, so we have a lot of connections.
&lt;/p&gt;
&lt;p&gt;
As we left, Pebble and I both commented on how beautiful the whole thing was.  I give her full credit for how wonderful everything looked, but we were also happy that our friends and family seemed to enjoy it as much as we did.  The staff at the Oar House did a great job.
&lt;/p&gt;
&lt;h3&gt;The Honeymoon&lt;/h3&gt;
&lt;p&gt;
After the reception, we drove to a hotel near the airport.  The next morning, we flew to Honolulu.  It was a nine-hour flight.  We had both forgotten our Bose noise-cancelling headphones, so we picked up two pairs of Sony noise-cancelling headphones at the airport before the flight.  The headphones served us well, but we now have no idea where they are.
&lt;/p&gt;
&lt;p&gt;
I was surprised at how big Honolulu was; I had always thought of it as a small resort town, but driving through it felt like driving through Los Angeles.  We stayed at the &lt;a href="http://www.outriggerwaikikihotel.com/"&gt;Outrigger Waikiki&lt;/a&gt;, a hotel on Waikiki Beach.  We didn't get all checked-in and unpacked until around 5 PM Honolulu time, which is 11 PM Atlanta time, so all we did that first day was go out to dinner at Cheeseburger in Paradise (which had great coconut shrimp) and head back to the hotel.
&lt;/p&gt;
&lt;h4&gt;Kris Screws Up, Big-time&lt;/h4&gt;
&lt;p&gt;
The second day (Monday), we decided to spend the morning at the beach.  Pebble bought me a bodyboard and thought it would be fun to watch me drown myself while she sat on the beach.  As I walked down to the water, Pebble said "Don't lose your wedding ring," and I said "It won't come off; it's too tight."  I went out and played in the surf for a while, but didn't like the experience.  There were a lot of rocks on the bottom, and I smashed a couple of my toes pretty good (they were purple for the rest of the trip).  After getting a little sun, we headed back to the hotel.
&lt;/p&gt;
&lt;p&gt;
As I laid down to take a nap, I reached for my wedding ring, and discovered it wasn't there!  We looked around the hotel room, but I knew I hadn't intentionally taken it off.  It was out in the ocean.
&lt;/p&gt;
&lt;p&gt;
After apologizing to my wife profusely for several minutes, I got on the phone and called the jeweler to ask whether they could ship us a replacement ring.  Unfortunately, their computers were down, so they couldn't look up the records that day.
&lt;/p&gt;
&lt;p&gt;
Over the next few days, we did get an identical ring ordered and shipped to us in Hawaii.  I hope our sacrifice to the Polynesian gods will bring good fortune.
&lt;/p&gt;
&lt;h4&gt;Rain&lt;/h4&gt;
&lt;p&gt;
After Monday, it rained every day.  So we didn't spend much time at the beach or doing other touristy things.  But we enjoyed ourselves anyway.  We were newlyweds.
&lt;/p&gt;
&lt;p&gt;
We spent a couple of days driving along the north shore of Oahu.  It is a beautiful area, and not as densely populated as the Honolulu area.  We saw whales, sea turtles, and a sea lion.
&lt;/p&gt;
&lt;p&gt;
We spent some time with the Bedient family, friends of Pebble's who live in Honolulu.    The two girls, aged 19 and 21, decided they wanted tatoos, so Pebble and I accompanied them to the tattoo parlor.  They lobbied hard for me to get a tattoo as well - one suggestion was having "I lost my wedding ring" tattooed on my forehead - but I left still unmarked.
&lt;/p&gt;
&lt;h3&gt;The Return&lt;/h3&gt;
&lt;p&gt;
We really didn't want to come home.  Really, really, really did not want to come home.  It was a difficult adjustment to go from living like royalty to being normal people again.
&lt;/p&gt;
&lt;p&gt;
We've discovered that the Sears wedding gift registry website sucks.  First, some people had trouble placing orders through the site.  Now, we've discovered that there is no way to find out who bought the gifts we've received.  So, if you sent us a gift through Sears, but haven't received a thank-you note, we're sorry.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-2016063019412271614?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/2016063019412271614/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=2016063019412271614' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/2016063019412271614'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/2016063019412271614'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/04/wedding-and-honeymoon.html' title='The Wedding and Honeymoon'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-1841091497136144459</id><published>2008-04-18T14:17:00.009-04:00</published><updated>2008-04-18T14:43:10.331-04:00</updated><title type='text'>Booleans Shouldn't Be Complicated</title><content type='html'>&lt;p&gt;&lt;i&gt;Warning: Geeky programmer content below.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;
While learning a new codebase, I was a little disturbed when I saw this:
&lt;/p&gt;
&lt;pre&gt;
  enum IsVerifying {
    IsVerifyingFalse,
    IsVerifyingTrue
  };

  enum IsVerified {
    IsVerifiedFalse,
    IsVerifiedTrue
  };

  enum IsEnabled {
    IsEnabledFalse,
    IsEnabledTrue
  };

  enum IsActive {
    IsActiveFalse,
    IsActiveTrue
  };

  enum IsOnline {
    IsOnlineFalse,
    IsOnlineTrue
  };

  /* etc. (There are about a dozen more of these.) */
&lt;/pre&gt;
&lt;p&gt;
And there was a lot of verbose code for dealing with these types, such as
&lt;/p&gt;
&lt;pre&gt;
  if (Verified()) {
    verified = IsVerifiedTrue;
  }
  else {
    verified = IsVerifiedFalse;
  }

  if (Enabled()) {
    enabled = IsEnabledTrue;
  }
  else {
    enabled = IsEnabledFalse;
  }

  /* etc. */
&lt;/pre&gt;
&lt;p&gt;
What's wrong with using plain-old-Boolean values &lt;tt&gt;false&lt;/tt&gt; and &lt;tt&gt;true&lt;/tt&gt;, or 0 and 1?
&lt;/p&gt;
&lt;p&gt;
Well, after poking around the code more, I did find the reason that the original programmer did this.  He has a lot of functions that take several flags as parameters, and something like this:
&lt;/p&gt;
&lt;pre&gt;
  SetStates(IsVerifyingFalse,
            IsVerifiedTrue,
            IsEnabledTrue,
            IsActiveFalse,
            IsOnlineFalse);
&lt;/pre&gt;
&lt;p&gt;
is easier to understand than something like this:
&lt;/p&gt;
&lt;pre&gt;
  SetStates(false, true, true, false, false);
&lt;/pre&gt;
&lt;p&gt;
But still, &lt;i&gt;yyeeaagghh&lt;/i&gt; is the proper reaction to seeing something like this.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-1841091497136144459?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/1841091497136144459/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=1841091497136144459' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/1841091497136144459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/1841091497136144459'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/04/booleans-shouldnt-be-complicated.html' title='Booleans Shouldn&apos;t Be Complicated'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-2487095453910506931</id><published>2008-04-11T18:41:00.003-04:00</published><updated>2008-04-18T14:28:04.645-04:00</updated><title type='text'>Pebble and Kris Got Married</title><content type='html'>&lt;div style="float: right; margin-left: 10px; margin-bottom: 10px;"&gt; &lt;a href="http://www.flickr.com/photos/kristopherjohnson/2399623966/" title="photo sharing"&gt;&lt;img src="http://farm3.static.flickr.com/2180/2399623966_d8fb6bcca2_m.jpg" alt="" style="border: solid 2px #000000;" /&gt;&lt;/a&gt; &lt;br /&gt; &lt;span style="font-size: 0.9em; margin-top: 0px;"&gt;  &lt;a href="http://www.flickr.com/photos/kristopherjohnson/2399623966/"&gt;Pebble and Kris Got Married&lt;/a&gt;  &lt;br /&gt;  Originally uploaded by &lt;a href="http://www.flickr.com/people/kristopherjohnson/"&gt;kristopherjohnson&lt;/a&gt; &lt;/span&gt;&lt;/div&gt;
&lt;p&gt;
April 5, 2008
&lt;/p&gt;
&lt;p&gt;
It was beautiful, thanks to my lovely wife.  Thank you to everyone who helped make this a special day.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-2487095453910506931?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/2487095453910506931/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=2487095453910506931' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/2487095453910506931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/2487095453910506931'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/04/pebble-and-kris-got-married.html' title='Pebble and Kris Got Married'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2180/2399623966_d8fb6bcca2_t.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-1349584579586309965</id><published>2008-03-07T06:41:00.008-05:00</published><updated>2008-03-07T07:48:07.326-05:00</updated><title type='text'>She Switched!</title><content type='html'>&lt;p&gt;
When I first started dating my fiancee, she made fun of my Macs.  I told her I'd convince her to buy one herself someday.  Her response: &lt;i&gt;NEVER!!!&lt;/i&gt;
&lt;/p&gt;
&lt;p&gt;
She kept that stance until she bought an iPhone.  Then she started looking more closely at the Mac, saying stuff like "I really like that interface," and "I like how it turns on instantly when you open it."
&lt;/p&gt;
&lt;p&gt;
Then she saw that &lt;a href="http://www.apple.com/macbookair/"&gt;MacBook Air&lt;/a&gt; commercial - the one where the computer fits in a manila envelope.  For the first few weeks, she said it was cool, but she didn't really need one.  About a week ago, she started trying to convince me that it would be a practical purchase.  (I didn't need convincing; she was really trying to convince herself.)
&lt;/p&gt;
&lt;p&gt;
Yesterday, she bought a MacBook Air.
&lt;/p&gt;
&lt;p&gt;
However, I can't really savor my victory.  I'm too jealous of her new toy.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-1349584579586309965?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/1349584579586309965/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=1349584579586309965' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/1349584579586309965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/1349584579586309965'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/03/she-switched.html' title='She Switched!'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-3767423856890028465</id><published>2008-02-29T06:54:00.001-05:00</published><updated>2008-02-29T06:55:15.801-05:00</updated><title type='text'>Shrine of the Mall Ninja</title><content type='html'>&lt;p&gt;
I was crying with laughter while reading this: &lt;a href="http://lonelymachines.org/mall-ninjas/"&gt;http://lonelymachines.org/mall-ninjas/&lt;/a&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-3767423856890028465?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/3767423856890028465/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=3767423856890028465' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/3767423856890028465'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/3767423856890028465'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/02/shrine-of-mall-ninja.html' title='Shrine of the Mall Ninja'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-7225968105256604764</id><published>2008-02-26T09:48:00.004-05:00</published><updated>2008-02-26T09:50:56.967-05:00</updated><title type='text'>Proud Teacher</title><content type='html'>&lt;p&gt;
Today, a development team I've worked with solved an architectural problem by adding a &lt;a href="http://en.wikipedia.org/wiki/Factory_method_pattern"&gt;factory method&lt;/a&gt;.  And they did it without any prompting from me!
&lt;/p&gt;
&lt;p&gt;
They grow up so fast.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-7225968105256604764?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/7225968105256604764/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=7225968105256604764' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/7225968105256604764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/7225968105256604764'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/02/proud-teacher.html' title='Proud Teacher'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-6752816316353446697</id><published>2008-02-19T22:55:00.004-05:00</published><updated>2008-02-19T23:21:56.936-05:00</updated><title type='text'>Large Fonts</title><content type='html'>&lt;p&gt;
A few days ago, I finally had to change my Windows machine's settings from "Normal" font size to "Large" font size.  Normal-sized text was getting too hard to read.
&lt;/p&gt;
&lt;p&gt;
It's certainly not the first sign of aging I've noticed, but this is the first time I've had to make an adjustment in my work environment to compensate.  I wonder what will be next.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-6752816316353446697?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/6752816316353446697/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=6752816316353446697' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/6752816316353446697'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/6752816316353446697'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/02/large-fonts.html' title='Large Fonts'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-2633623209252936778</id><published>2008-02-19T22:34:00.012-05:00</published><updated>2008-08-05T10:55:23.314-04:00</updated><title type='text'>Good-bye SCons, Hello CMake</title><content type='html'>&lt;p&gt;
Last year, I wrote of my &lt;a href="http://kristopherjohnson.blogspot.com/2007/03/scons.html"&gt;initial impressions&lt;/a&gt; of &lt;a href="http://www.scons.org/"&gt;SCons&lt;/a&gt; for controlling software builds.  My initial impressions were positive, but even then I was wary of performance issues.
&lt;/p&gt;
&lt;p&gt;
A few months later, I wrote about &lt;a href="http://kristopherjohnson.blogspot.com/2007/07/improving-scons-performance-for-msvc8.html"&gt;a performance problem with SCons and MSVC&lt;/a&gt;.  I was able to hack SCons to make things a little better.
&lt;/p&gt;
&lt;p&gt;
Things weren't bad for me, because I've been doing all my development on Linux, where SCons is pretty well-behaved.  But the Windows developers hated it.  SCons will build MSVC project files so that developers can edit and browse code through the IDE, but the builds are still controlled by SCons, and SCons was painfully slow on Windows.  As the codebase grew, SCons got slower and slower.
&lt;/p&gt;
&lt;p&gt;
The boss put up with it for a while, but he finally decided that enough was enough.  I was ordered to find something better than SCons for our cross-platform builds.
&lt;/p&gt;
&lt;p&gt;
We weren't the only people dissatisfied with SCons.  The KDE team had tried SCons, found it lacking, then started their own Python-based build system based on SCons, which eventually became &lt;a href="http://code.google.com/p/waf/"&gt;Waf&lt;/a&gt;.  I looked at Waf briefly, but the immaturity of the project and lack of documentation turned me off.
&lt;/p&gt;
&lt;p&gt;
I read that the &lt;a href="http://en.wikipedia.org/wiki/GNU_build_system"&gt;autotools&lt;/a&gt; system was starting to provide better support for Windows, but I didn't think that solution would go over well with the team members and leaders who passionately hate things that are too UNIX-ish.
&lt;/p&gt;
&lt;p&gt;
So, after reading that the KDE team finally settled on &lt;a href="http://www.cmake.org"&gt;CMake&lt;/a&gt;, I decided to give that a try.
&lt;/p&gt;
&lt;p&gt;
I've spent the last couple of days translating build scripts from SCons into CMake.  So far, I'm pretty pleased with the results.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Pros of CMake over SCons:&lt;/b&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It generates real honest-to-goodness MSVC solution and project files that work as well as or better than those that Windows developers would create by hand.  The CMake developers don't treat Windows developers as second-class citizens.&lt;/li&gt;
&lt;li&gt;The default compiler settings in the generated MSVC files and Makefiles are remarkably sane.&lt;/li&gt;
&lt;li&gt;It has lots of functionality built in.  (In contrast, SCons often required lots of code to be written to do simple things.)&lt;/li&gt;
&lt;li&gt;It provides a simple mechanism for handling unit tests.&lt;/li&gt;
&lt;li&gt;Simpler support for hierarchical builds.&lt;/li&gt;
&lt;li&gt;It has the feel of something that has been used for real-world work. (In contrast,  SCons always felt like a grad student's summer project.)&lt;/li&gt;
&lt;li&gt;I don't have to go take a coffee break every time I need to do a build.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;b&gt;Cons:&lt;/b&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I don't like CMake's syntax.  It's like they took the syntaxes of Make, Perl, Bourne shell, and BASIC, and mixed them all together.  (Please, people, stop inventing your own application-specific scripting languages!  Especially if you are going to invent one that sucks.)&lt;/li&gt;
&lt;li&gt;Online documentation is poor.  You have to buy a $50 book if you want to figure things out in a reasonable amount of time.&lt;/li&gt;
&lt;li&gt;While it is cross-platform, you still have to write a lot of "IF( WINDOWS ) ... ELSE ..." code.&lt;/li&gt;
&lt;li&gt;It has no built-in support for precompiled headers.  (But then again, neither did SCons.  As with SCons, you can use precompiled headers by writing some code.).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
I'm happy with the switch to CMake, and I'm sure the boss will be too.  But who knows; maybe next year I'll be writing yet another blog entry about the need to adopt a new build system.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-2633623209252936778?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/2633623209252936778/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=2633623209252936778' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/2633623209252936778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/2633623209252936778'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/02/good-bye-scons-hello-cmake.html' title='Good-bye SCons, Hello CMake'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-629885552701041247</id><published>2008-01-31T08:14:00.000-05:00</published><updated>2008-01-31T08:15:06.782-05:00</updated><title type='text'></title><content type='html'>&lt;p&gt;
Go to this link, wait, and watch: &lt;a href="http://producten.hema.nl/?whatthefark"&gt;http://producten.hema.nl/?whatthefark&lt;/a&gt;.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-629885552701041247?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/629885552701041247/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=629885552701041247' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/629885552701041247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/629885552701041247'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/01/go-to-this-link-wait-and-watch.html' title=''/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-6031785741754231177</id><published>2008-01-30T04:47:00.001-05:00</published><updated>2008-02-19T23:01:14.325-05:00</updated><title type='text'>Buying an Engagement Ring</title><content type='html'>&lt;p&gt;
I'm getting married.  You may congratulate me.
&lt;/p&gt;
&lt;p&gt;
I asked The Question, and she said yes.  I know you're supposed to buy an engagement ring first, and present it as part of the proposal, but I wasn't really prepared when the conversation happened.  So, the following day, we went out to shop for rings.
&lt;/p&gt;
&lt;p&gt;
After hitting a half-dozen jewelry stores, we selected a beautiful ring.  Of course, I'm a guy, so all jewelry is just shiny metal and sparkly rocks to me, but I was surprised when the one she liked is the one that I probably would have bought if she wasn't along for the trip.
&lt;/p&gt;
&lt;p&gt;
This was on Sunday.  I put down a 20% deposit on the ring, planning to move more money into my checking account on Monday so I could pay the balance on Tuesday. 
&lt;/p&gt;
&lt;p&gt;
Paying the deposit took a while.  The nice salesperson at the store spent several minutes trying to figure out the menus and commands in the computer system.  Then, when she tried to validate my check by TeleCheck, she had to call them and stay on the line for about twenty minutes before they cleared it.  She said they said that the holdup was due to my address recently changing.  I received a receipt, and I told them I'd be back on Tuesday.
&lt;/p&gt;
&lt;p&gt;
I made my checking-account deposit on Monday morning, and went back to the store around noon on Tuesday.  The nice salesperson from Sunday wasn't working on Tuesday, so nice salesperson #2 took my receipt, and spent several minutes trying to figure out (a) what I was buying and (b) how much I owed.  She eventually figured it out, and I wrote another check.  She ran my check through TeleCheck, and the answer came back: &lt;i&gt;Declined&lt;/i&gt;.
&lt;/p&gt;
&lt;p&gt;
Nice salesperson #2 asked if I had recently made a deposit.  I told her I had, but that the bank told me the funds would be available immediately.  She suggested I visit the bank to clear things up.  I asked repeatedly whether I could bring back a cashier's check or money order, but she wouldn't answer that question, instead repeatedly insisting that, because she had worked at a bank in the past, she knew that there &lt;i&gt;must&lt;/i&gt; be some kind of hold on my account.
&lt;/p&gt;
&lt;p&gt;
So I went to the bank.  Nice bankerperson told me that all my funds are available, and there is no reason that my check should be declined.
&lt;/p&gt;
&lt;p&gt;
So I went back to the jewelry store.  Nice salesperson #2 is heading out to lunch, so I had to explain the history of this transaction to nice salesperson #3, who then spent several minutes studying my receipt and looking up computer records to figure out (a) what I was buying and (b) how much I owed.  She ran my check through TeleCheck, and the answer came back: &lt;i&gt;Declined&lt;/i&gt;.
&lt;/p&gt;
&lt;p&gt;
As she was walking out the door, nice salesperson #2 suggested that #3 call TeleCheck, which she does.  She's on the line for twenty minutes, but the only answer she gets is that I've been declined.
&lt;/p&gt;
&lt;p&gt;
I asked whether I could just go to the bank and bring back a cashier's check, money order, or a briefcase full of cash.  She asked whether I have a debit card with me.
&lt;/p&gt;
&lt;p&gt;
Yes, I did have a debit card with me, but I was under the impression that it had a limit of $400 or something like that.  She swiped it through her card reader, and boom, thousands of dollars were exchanged for a sparkly rock.  Wow, technology is cool.  So now I own the ring, but have to wait a few days for it to be resized.
&lt;/p&gt;
&lt;p&gt;
It was easier to buy my last car than to buy this ring.
&lt;/p&gt;
&lt;p&gt;
Lessons learned:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TeleCheck can bite me.  I haven't used checks for retail items in a long time, but I thought a check would make sense for this large purchase.  TeleCheck's validation system wasted a couple hours of my time.  From now on, I'll just use credit cards for everything.&lt;/li&gt;
&lt;li&gt;Jewelry store salespeople could use more training on their computer systems.  All three of the salespeople I observed seemed to randomly try every menu item until they got results that seemed reasonable.&lt;/li&gt;
&lt;li&gt;I'm never getting married ever again.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
[UPDATE: My fiancee read this entry, made a face, and remarked, "There's no love in there at all, is there?"]
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-6031785741754231177?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/6031785741754231177/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=6031785741754231177' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/6031785741754231177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/6031785741754231177'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/01/buying-engagement-ring.html' title='Buying an Engagement Ring'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-4916805498999163081</id><published>2008-01-17T05:10:00.001-05:00</published><updated>2008-02-26T09:51:40.980-05:00</updated><title type='text'>41</title><content type='html'>&lt;div style="float: right; margin-left: 10px; margin-bottom: 10px;"&gt; &lt;a href="http://www.flickr.com/photos/kristopherjohnson/2201706884/" title="41 by kristopherjohnson, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2274/2201706884_517daf7cd9_m.jpg" width="171" height="240" alt="41" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;
Another year has gone by.  I didn't really set many goals for myself last year, so I'm not disappointed by any failures (although I am disappointed that I didn't set any goals).  I lost 20 pounds and ran the Peachtree Road Race, but I've regained the 20 pounds.
&lt;/p&gt;
&lt;p&gt;
The biggest change in my life is that the Match.com thing worked out and I am now part of an "us."  This is making me very happy.  We live in a newly-purchased old cabin in the woods.  I'm now spending my weekends doing yardwork and other handiwork, which is a big change from my old lifestyle.  I now have access to a chainsaw and will soon have a tiller.  At some point, I'm going to have to learn about wells so I can get rid of the sulfur smell in our water.
&lt;/p&gt;
&lt;p&gt;
I never understood why all the guys with wives and girlfriends never have any free time to hang out with us unencumbered guys.  Now I understand.  There's not much "me time" anymore, but I don't miss it.  (Love you, sweetie.)
&lt;/p&gt;
&lt;p&gt;
I am practicing guitar whenever I have some free time.  I hope to be able to play some actual music by this time next year.  I also want to master the drums on Rock Band.
&lt;/p&gt;
&lt;p&gt;
I'm going to start taking a self-portrait on each birthday.  I hope my deterioration will be very slow.  I haven't decided yet whether the beard is going to be a permanent part of my appearance.
&lt;/p&gt;
&lt;p&gt;
[UPDATE: 2/4/2008: Beard is gone.]
&lt;/p&gt;
&lt;p&gt;
[UPDATE: 2/26/2008: I miss my beard.]
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-4916805498999163081?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/4916805498999163081/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=4916805498999163081' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/4916805498999163081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/4916805498999163081'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/01/41.html' title='41'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2274/2201706884_517daf7cd9_t.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-4878253301309835954</id><published>2008-01-16T07:31:00.000-05:00</published><updated>2008-01-16T16:01:51.699-05:00</updated><title type='text'>Death March</title><content type='html'>&lt;p&gt;
The term "death march" is commonly used for software projects that are behind schedule, over budget, have no end in sight, and yet must be completed.  There is a &lt;a href="http://www.amazon.com/Death-March-2nd-Yourdon-Press/dp/013143635X/ref=pd_bbs_sr_1?ie=UTF8&amp;s=books&amp;qid=1200486804&amp;sr=8-1"&gt;book&lt;/a&gt; with that title.
&lt;/p&gt;
&lt;p&gt;
I've recently become involved in one of these projects.  I should say "re-involved," because I was involved with the project a year and a half ago, and I quit.  As an independent contractor now, I feel less pain than the employees do: I get paid by the hour and can set my own schedule, whereas they have to work unpaid overtime, and they are shackled to their desks.
&lt;/p&gt;
&lt;p&gt;
Yesterday, one of the developers had to go to a doctor.  The stress and long hours had led to high pulse rate and other signs of anxiety.  The doctor told him to go home and get some rest, which he did.
&lt;/p&gt;
&lt;p&gt;
We're all glad that nothing more serious happened.  Managers express surprise that anyone would work himself so hard.  I've only been involved with this for a few days, but here's what I've observed:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Requirements and UI design are still changing.&lt;/li&gt;
&lt;li&gt;Work that was originally estimated to take three months has now been scheduled for completion in three weeks.&lt;/li&gt;
&lt;li&gt;A manager stops by every hour to get a status update.&lt;/li&gt;
&lt;li&gt;There are a couple of hour-long meetings every day.  Plans are changed during each meeting.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Yeah, I can't imagine why anyone would feel pressure, with management being so "helpful."
&lt;/p&gt;
&lt;p&gt;
He's young.  I remember when I was younger.  I tried to meet crazy deadlines.  I took it personally when managers demanded faster progress.  I blamed myself for everything that went wrong.  I worked myself sick.
&lt;/p&gt;
&lt;p&gt;
Now, with a couple of decades of seasoning, I know better.  If you're involved in a death march, it is due to your managers' incompetence, not yours.  Work at a sustainable pace, and remember that no matter how loudly the managers are screaming, there is no need to sacrifice yourself for the good of the company.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-4878253301309835954?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/4878253301309835954/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=4878253301309835954' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/4878253301309835954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/4878253301309835954'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/01/death-march.html' title='Death March'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-4431380786165625630</id><published>2008-01-05T09:39:00.000-05:00</published><updated>2008-01-11T07:46:33.164-05:00</updated><title type='text'>Science, Evolution, and Creationism</title><content type='html'>&lt;p&gt;
The National Academy of Sciences has issued a report that documents the methods of science and the overwhelming evidence in support of the theory of evolution.  It also presents the arguments against the teaching of creationism and Intelligent Design in public-school science classes.  However, it also clearly outlines the reasons that a belief in evolution is not incompatible with a belief in God or with other religious beliefs.
&lt;/p&gt;
&lt;p&gt;
It is available for download (PDF) from &lt;a href="http://www.nap.edu/catalog.php?record_id=11876"&gt;http://www.nap.edu/catalog.php?record_id=11876&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
I personally find it repugnant that some religious fundamentalists are trying to erode this country's science-education programs.  They have convinced a large number of people that there is a large body of scientific evidence against evolution and that there is a debate in the scientific community about its validity.  They use fallacious arguments to present Intelligent Design as a logical "scientifically based" alternative.  They say that "good Christians" need to support inclusion of these teachings in our kids' science classes.  They want us to embrace ignorance.
&lt;/p&gt;
&lt;p&gt;Those people are dishonest and evil.  The information in this book can help us fight them.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-4431380786165625630?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/4431380786165625630/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=4431380786165625630' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/4431380786165625630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/4431380786165625630'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/01/science-evolution-and-creationism.html' title='Science, Evolution, and Creationism'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-2745277381649140645</id><published>2008-01-01T19:05:00.000-05:00</published><updated>2008-01-11T07:47:45.941-05:00</updated><title type='text'>Slower Traffic Keep Right</title><content type='html'>&lt;p&gt;
&lt;i&gt;Having driven a few thousand miles over the holidays, I decided I'd like to present the following message to all the drivers of America:
&lt;/i&gt;
&lt;/p&gt;
&lt;p&gt;
If you are driving in the left lane on an interstate or other multi-lane highway, please check the following:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Are there cars right behind you, but no cars in front of you?&lt;/li&gt;
&lt;li&gt;Are you driving well below the posted speed limit?&lt;/li&gt;
&lt;li&gt;Are people passing you on your right side?&lt;/li&gt;
&lt;li&gt;Have you been driving dead even with the car to your right?&lt;/li&gt;
&lt;li&gt;Are you talking on the phone, eating, fixing your kids' hair, or engaging in any other activity that may distract you?&lt;/li&gt;
&lt;li&gt;Is there no possibility that you will pass anyone, ever?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
If you answer &lt;i&gt;Yes&lt;/i&gt; to any of the above questions, then please get out of the left lane.  You don't belong there.
&lt;/p&gt;
&lt;p&gt;
And please, don't speed up when someone tries to pass you.  Highway driving is not a NASCAR-sanctioned event, and you won't lose any Winston Cup points if you let somebody get in front of you.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-2745277381649140645?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/2745277381649140645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=2745277381649140645' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/2745277381649140645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/2745277381649140645'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2008/01/slower-traffic-keep-right.html' title='Slower Traffic Keep Right'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-5069405549638862970</id><published>2007-11-27T09:08:00.000-05:00</published><updated>2007-11-27T09:25:46.678-05:00</updated><title type='text'>Two Years Later</title><content type='html'>&lt;div style="float: right; margin-left: 10px; margin-bottom: 10px;"&gt; &lt;a href="http://www.flickr.com/photos/kristopherjohnson/504810290/" title="Airplane photo by kristopherjohnson, on Flickr"&gt;&lt;img src="http://farm1.static.flickr.com/190/504810290_ea942143a5_m.jpg" width="240" height="160" alt="Airplane" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;
The two-year anniversary of my &lt;a href="http://kristopherjohnson.blogspot.com/2005/11/private-pilot-checkride.html"&gt;private pilot checkride&lt;/a&gt; went by recently.  This has legal significance, as a pilot is not allowed to exercise the privileges of the certificate (license) unless one has had a checkride or a flight review in the past 24 months.  So, as of the end of this month, I can't fly again until I've had a flight review.
&lt;/p&gt;
&lt;p&gt;
A flight review really isn't a big deal.  You are required to spend one hour on the ground and one hour in the air with a flight instructor, who will determine whether you are still a safe pilot.  However, since I haven't flown since January, I'll need a couple of refresher lessons before my review.
&lt;/p&gt;
&lt;p&gt;
I also need to renew my aviation medical certification, due to the blood-pressure medication I've recently been prescribed.  So that's another hurdle to negotiate before I can fly again.
&lt;/p&gt;
&lt;p&gt;
Right now, I have no plans to go back up in the air.  I have better things to do with my time and money.  I hope that I will get back into the left seat someday, but for now, I'm content to gaze up at the sky and say "It sure would be a nice day to fly."
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-5069405549638862970?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/5069405549638862970/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=5069405549638862970' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/5069405549638862970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/5069405549638862970'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2007/11/two-years-later.html' title='Two Years Later'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm1.static.flickr.com/190/504810290_ea942143a5_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-5368888592246687005</id><published>2007-11-16T06:49:00.000-05:00</published><updated>2007-11-16T07:05:46.753-05:00</updated><title type='text'>Learning Jazz Guitar</title><content type='html'>&lt;div style="float: right; margin-left: 10px; margin-bottom: 10px;"&gt; &lt;a href="http://www.flickr.com/photos/kristopherjohnson/673071561/" title="Les Paul Bridge by kristopherjohnson, on Flickr"&gt;&lt;img src="http://farm2.static.flickr.com/1268/673071561_52b8447cc5_m.jpg" width="240" height="172" alt="Les Paul Bridge" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;
After spending way too much time playing &lt;i&gt;&lt;a href="http://en.wikipedia.org/wiki/Guitar_hero"&gt;Guitar Hero&lt;/a&gt;&lt;/i&gt;, it occurred to me that if I had spent the same amount of time practicing with my real guitars, I might be able to play by now.
&lt;/p&gt;
&lt;p&gt;
I have collected a lot of books about rock guitar over the past 20 years, but I am getting more interested in jazz.  Can anyone recommend some good basic/intermediate books or interactive courses for learning jazz guitar?
&lt;/p&gt;
&lt;p&gt;
(I'm interested in jazz keyboard as well, so related recommendations would also be welcome.)
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-5368888592246687005?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/5368888592246687005/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=5368888592246687005' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/5368888592246687005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/5368888592246687005'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2007/11/learning-jazz-guitar.html' title='Learning Jazz Guitar'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm2.static.flickr.com/1268/673071561_52b8447cc5_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-7185333427834592727</id><published>2007-11-01T07:25:00.000-04:00</published><updated>2007-11-16T07:08:38.171-05:00</updated><title type='text'>Leopard Impressions</title><content type='html'>&lt;p&gt;
Unlike the Windows world, where operating systems upgrades are sources of frustration and loathing, among Mac users upgrades are met with enthusiastic interest. I've been using &lt;a href="http://www.apple.com/macosx"&gt;Leopard&lt;/a&gt; (Mac OS X 10.5) for a few days now.
&lt;/p&gt;
&lt;p&gt;
The performance improvements promised by Apple are real.  Everything feels snappier.  Spotlight is actually usable now.
&lt;/p&gt;
&lt;p&gt;
My favorite new feature is Spaces.  Some say "Big deal.  It's just a virtual desktop manager.  UNIX workstations have had those for years."  True, but it is an improvement over the original Expos&amp;eacute; feature.  Unlike other virtual desktops, it is well-integrated into the rest of the UI.  Dragging live windows between virtual workspaces is really cool.
&lt;/p&gt;
&lt;p&gt;
Time Machine is pretty cool too.  Again, some would say "Big deal. It's just a backup/restore application. I can do the same thing with rsync." What makes Time Machine special is its simplicity.  You plug an external drive in, and the Mac asks "Do you want to back up your main drive to this drive?"  If you answer "yes," then that's it: you now have automatic hourly, daily, and weekly backups. Unlike other backup systems, Time Machine keeps all these backups available, but conserves drive space by not making copies of files that have not changed from one backup to another.
&lt;/p&gt;
&lt;p&gt;
Time Machine is one of those amazingly great things that seems obvious, now that somebody has done it. I expect Time Machine clones to appear for Windows and UNIX very soon.
&lt;/p&gt;
&lt;p&gt;
I do have some complaints about Time Machine: the UI is a little hard to figure out the first time you see it (and there is no menu bar or online help available in the app), and my MacBook CPU usage goes to eleven for a couple of minutes every hour while it makes the backups.  I may turn off the automatic backups and switch to manual backups (right-click the backup drive and choose "Backup Now").
&lt;/p&gt;
&lt;p&gt;
The new version of the Safari web browser is a lot more usable than the previous version, but I went back to Firefox after a few days.  Firefox has more "power-user" features than Safari does, and I can't live without them.
&lt;/p&gt;
&lt;p&gt;
I have mixed feelings about the "Leopard look." On one hand, brushed metal has pretty much disappeared, so we can rejoice. But there are other things that, while they look cool, actually make it more difficult to see important information: translucent menus, the 3D Dock, subtle folder icons, too-dark windows, etc.  But it's not as bad as Vista.
&lt;/p&gt;
&lt;p&gt;
On the whole, it's a solid upgrade. In a way, it is a bit of a letdown, because it is really just a polishing of an already-good system. Of its touted "300+ new features," few are going to change the way one uses their Mac.  I haven't found anything that makes me say "Wow!" but there are a lot of little new things that make me say "Hey, that's kinda neat."
&lt;/p&gt;
&lt;p&gt;
For a good in-depth technical review of Leopard, see &lt;a href="http://arstechnica.com/reviews/os/mac-os-x-10-5.ars/1"&gt;the Ars Technica review&lt;/a&gt;.  From that review, it looks like it is a great time to be a Mac developer&amp;mdash;lots of cool new APIs and debugging aids. (Unfortunately, I'm still a Windows whore.)
&lt;/p&gt;
&lt;p&gt;
To sum everything up: the upgrade was definitely worth $129 and a few hours of time.  My only regret is that I didn't buy the "family pack" so that I could also upgrade my old iMac G5.  Is it time to buy a new iMac?
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-7185333427834592727?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/7185333427834592727/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=7185333427834592727' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/7185333427834592727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/7185333427834592727'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2007/11/leopard-impressions.html' title='Leopard Impressions'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-800704697762596160</id><published>2007-10-28T02:55:00.000-04:00</published><updated>2007-10-28T03:11:41.005-04:00</updated><title type='text'>Leopard Upgrade</title><content type='html'>&lt;p&gt;
I've upgraded my MacBook from Tiger to Leopard.  I hit a couple of snags along the way; maybe this will help someone else avoid the same issues.
&lt;/p&gt;
&lt;p&gt;
1.  When I first attempted to upgrade, the Installer wouldn't allow me to select my hard drive for the upgrade.  I have been using a copy of my original hard drive, and the copy was apparently not partitioned with "GUID Partition Table."  It was booting fine under Tiger, but apparently there are new rules for Leopard.  The installer offered to erase my drive for me and partition it correctly, but I didn't want to lose all my applications and data.  The moral:  when partitioning a new drive for use as a boot disk, click the &lt;b&gt;Options...&lt;/b&gt; button in Disk Utility's &lt;b&gt;Partition&lt;/b&gt; page and select "GUID Partition Table" (the default selection is "Apple Partition Table"). 
&lt;/p&gt;
&lt;p&gt;
2.  After installation, the drive started booting, but then just sat on a blank blue screen for a long time.  This is apparently caused by an old version of Unsanity's Application Enhancer.  To remove this software and let Leopard boot, follow the "Solution 2" instructions given here: &lt;a href="http://docs.info.apple.com/article.html?artnum=306857"&gt;http://docs.info.apple.com/article.html?artnum=306857&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
3.  My wireless Mighty Mouse didn't work at first.  The Bluetooth icon didn't show up in the System Preferences, and the menu bar showed the icon but the menu said that Bluetooth was unavailable.  After rebooting a couple times, Bluetooth magically reappeared and the mouse worked as before.
&lt;p&gt;
After getting over those little bumps, Leopard appears to be working fine, and it is worth noting that the serious problems would not have occurred if I was using the original Apple-installed hard drive and I had not installed any hacky software.  So, can't blame Apple.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-800704697762596160?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/800704697762596160/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=800704697762596160' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/800704697762596160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/800704697762596160'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2007/10/leopard-upgrade.html' title='Leopard Upgrade'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-3848032695318353148</id><published>2007-10-26T07:32:00.000-04:00</published><updated>2007-10-26T07:57:36.118-04:00</updated><title type='text'>Backups</title><content type='html'>&lt;p&gt;
I've never been good at keeping backups.  Back in the good old days, when all my data fit on one floppy disk, I made copies of those, but the first time I had to back up a 20-MB (yes, &lt;i&gt;megabyte&lt;/i&gt;) hard drive onto a stack of floppies, I gave up on backups.  As my hard drives have grown, the thought of spending time making huge backups have become more daunting.
&lt;/p&gt;
&lt;p&gt;
I've been lucky.  I've never had a hard drive crash, or lost a laptop, or otherwise been unpleasantly surprised.  I've never been taught a harsh lesson about the importance of backups.  For important files, I've e-mailed copies to myself, taking advantage of the practically unlimited free storage space provided by Yahoo! Mail and GMail.  However, if one of my hard drives ever died, it would take a very long time to re-install an OS and all my applications and settings.
&lt;/p&gt;
&lt;p&gt;
I've always felt that I should be keeping backups, and with the upcoming &lt;a href="http://www.apple.com/macosx/"&gt;Mac OS X Leopard&lt;/a&gt; upgrade, I figured I should keep a backup of my Tiger installation in case Leopard turned out to be a lemon.  A &lt;a href="http://jwz.livejournal.com/801607.html"&gt;recent post by jwz&lt;/a&gt; about backups prompted me to get serious.  His suggestion is basically to buy some extra hard drives and an external enclosure, make copies of your hard drives, and use &lt;a href="http://samba.anu.edu.au/rsync/"&gt;rsync&lt;/a&gt; to periodically copy changes from your main drives to the backup copies.  This gives you a bootable backup drive, so if your real drive ever dies, you just pop the backup drive into your computer, and you're back in business.  jwz's advice is sound, and is easy to follow if you have a Mac or a Linux box.  It's a little expensive to buy so many spare drives, but the convenience of having bootable backups is worth it to me.
&lt;/p&gt;
&lt;p&gt;
Unfortunately, it is not as easy to back up a Windows machine.  You can use rsync if you have &lt;a href="http://www.cygwin.com"&gt;Cygwin&lt;/a&gt; installed, but I wasn't sure that I would trust that to give me a bootable backup.  So, my strategy for now is to use &lt;a href="http://www.acronis.com/homecomputing/products/trueimage/"&gt;Acronis True Image&lt;/a&gt; to make a backup copy of my drive, and then use &lt;a href="http://www.microsoft.com/windowsxp/using/digitalphotography/prophoto/synctoy.mspx"&gt;Microsoft's SyncToy&lt;/a&gt; to periodically copy new files from the laptop to the backup drive.
&lt;/p&gt;
&lt;p&gt;
One benefit of this strategy is that it has been easy to upgrade my hard drives.  My MacBook only had a 60-GB drive, which got full pretty quick; now it has a 160-GB drive with plenty of extra space.  I also grew my Windows laptop drive from 120 GB to 160 GB.
&lt;/p&gt;
&lt;p&gt;
I'll play around with the "Time Machine" feature of Leopard, but I'll probably keep relying on the simpler backup strategy instead of Apple's slick magic stuff.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-3848032695318353148?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/3848032695318353148/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=3848032695318353148' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/3848032695318353148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/3848032695318353148'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2007/10/backups.html' title='Backups'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-1013892091716046551</id><published>2007-09-25T00:10:00.000-04:00</published><updated>2007-10-26T07:56:04.607-04:00</updated><title type='text'>Photographic Assignment</title><content type='html'>&lt;p&gt;
I've been appointed to take group and individual pictures of a soccer team consisting of eight-year-olds.  I've never done anything like this.  Can anyone offer any advice or suggestions?
&lt;/p&gt;
&lt;p&gt;
[UPDATE: The county contracted a professional photographer to take team pictures, so I don't get to do it.]
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-1013892091716046551?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/1013892091716046551/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=1013892091716046551' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/1013892091716046551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/1013892091716046551'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2007/09/photographic-assignment.html' title='Photographic Assignment'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-3725323163534353496</id><published>2007-09-20T15:49:00.000-04:00</published><updated>2007-09-20T15:55:28.409-04:00</updated><title type='text'>.NET Event Logging</title><content type='html'>&lt;p&gt;
(Nobody else will care about this.  Move along.  Nothing to see here now.  Maybe I'll clean this up for public consumption later.)
&lt;/p&gt;
&lt;p&gt;
After spending way too much time figuring out how to change the name of a custom event log my .NET-based service was writing messages to, I decided I need to save the snippet of code that finally worked.
&lt;/p&gt;
&lt;p&gt;
For more info about the confusing world of .NET's EventLog class, see &lt;a href="http://www.informit.com/guides/printerfriendly.aspx?g=dotnet&amp;seqNum=238"&gt;http://www.informit.com/guides/printerfriendly.aspx?g=dotnet&amp;seqNum=238&lt;/a&gt;.
&lt;/p&gt;
&lt;pre&gt;
namespace BlahBlahBlah
{
    class Log
    {
        // Lots of stuff left out here.
        // ...

        private static EventLog eventLog = null;

        private static readonly string eventSource         = "My Service";
        private static readonly string eventLogName        = "My Log";
        private static readonly string eventLogMachineName = ".";  // local
        
        /// &lt;summary&gt;
        /// Initializer for Log class
        /// &lt;/summary&gt;
        static Log()
        {
            // Register this event source if necessary
            try
            {
                bool needCreate = false;
                if (EventLog.SourceExists(eventSource))
                {
                    string logName = EventLog.LogNameFromSourceName(eventSource,
                                                                    eventLogMachineName);
                    if (logName != eventLogName)
                    {
                        EventLog.DeleteEventSource(eventSource);
                        needCreate = true;
                    }
                }
                else
                {
                    needCreate = true;
                }

                if (needCreate)
                {
                    EventLog.CreateEventSource(eventSource, eventLogName);
                }
            }
            catch
            {
                // Ignore failure
            }

            // Initialize our EventLog instance
            try
            {
                eventLog = new EventLog(eventLogName, eventLogMachineName, eventSource);

                // Ensure our event log has the "overwrite as needed" setting
                eventLog.ModifyOverflowPolicy(OverflowAction.OverwriteAsNeeded,
                                              eventLog.MinimumRetentionDays);
            }
            catch
            {
                // Ignore failure
            }
        }

        // Lots more stuff left out
        // ...
    }
}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-3725323163534353496?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/3725323163534353496/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=3725323163534353496' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/3725323163534353496'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/3725323163534353496'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2007/09/net-event-logging.html' title='.NET Event Logging'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-307410315541282468</id><published>2007-09-19T21:11:00.001-04:00</published><updated>2007-09-25T00:08:39.414-04:00</updated><title type='text'>New Eyeglasses</title><content type='html'>&lt;div style="float: right; margin-left: 10px; margin-bottom: 10px;"&gt; &lt;a href="http://www.flickr.com/photos/kristopherjohnson/1410292554/" title="photo sharing"&gt;&lt;img src="http://farm2.static.flickr.com/1425/1410292554_70ab78a73a_m.jpg" alt="" style="border: solid 2px #000000;" /&gt;&lt;/a&gt; &lt;br /&gt; &lt;span style="font-size: 0.9em; margin-top: 0px;"&gt;  &lt;a href="http://www.flickr.com/photos/kristopherjohnson/1410292554/"&gt;New Eyeglasses&lt;/a&gt;  &lt;br /&gt;  Originally uploaded by &lt;a href="http://www.flickr.com/people/kristopherjohnson/"&gt;kristopherjohnson&lt;/a&gt; &lt;/span&gt;&lt;/div&gt;
&lt;p&gt;
I've worn contact lenses since I was a teenager.  I've never liked eyeglasses: they're too heavy, too fragile, too dusty, and just plain uncomfortable.  In contrast, contacts are lightweight, they rarely get dirty, they provide peripheral vision, and you don't have to wear ugly clip-on sunglasses over them.  I've never understood why anyone would prefer glasses, other than because their eyes simply can't handle them.
&lt;/p&gt;
&lt;p&gt;
But, a persuasive woman suggested she'd like to see me in glasses more often, so I decided to give glasses another try.  My fifteen-year-old pair had very large lenses, which are great for visibility but they are heavy and unfashionable.  I wore them only in those rare times when my eyes were irritated by allergies or other problems.  I decided to try some new frames, and after some searching, settled on this Ray-Ban #6127 Bronze frame.
&lt;/p&gt;
&lt;p&gt;
I figure I'll wear them for the rest of the week to see if I can get used to them.  I expect to be back in my contacts next week, except for time spent with the persuasive woman.
&lt;/p&gt;
&lt;p&gt;
UPDATE: I hate wearing them, but the persuasive woman likes them, so, well...
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-307410315541282468?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/307410315541282468/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=307410315541282468' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/307410315541282468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/307410315541282468'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2007/09/new-eyeglasses.html' title='New Eyeglasses'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm2.static.flickr.com/1425/1410292554_70ab78a73a_t.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-8591168243396618122</id><published>2007-09-18T02:18:00.000-04:00</published><updated>2007-09-20T07:40:00.627-04:00</updated><title type='text'>Medication</title><content type='html'>&lt;p&gt;
Last week, I had my first complete physical exam in twenty years.  I figured that, because I'm 40, I ought to get one.  I was wondering what problems they might find.
&lt;/p&gt;
&lt;p&gt;
EKG, heart sounds, lungs, reflexes, and everything were fine.  However, my blood pressure was high.  It was also high when I had my aviation exam, and both my parents have high blood pressure, so I finally had to accept the fact that I have a problem that probably can't be solved with rest, exercise, and a good diet.  The doctor prescribed a daily dosage of blood pressure control medication.
&lt;/p&gt;
&lt;p&gt;
&lt;i&gt;Medication&lt;/i&gt;.  In one sense, it's no big deal; lots of people are on medication.  But, for the first time, I've been prescribed a daily dosage that I'll probably have to take for the rest of my life.
&lt;/p&gt;
&lt;p&gt;
Does this make me officially middle-aged?
&lt;/p&gt;
&lt;p&gt;
UPDATE:  This means that if I want to fly again, I'll have to get cleared by the FAA medical staff again, which is a 4-to-6-week procedure.  My medication is one that is approved by the FAA, but they review such things on a case-by-case basis.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-8591168243396618122?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/8591168243396618122/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=8591168243396618122' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/8591168243396618122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/8591168243396618122'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2007/09/medication.html' title='Medication'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-1319662090106032780</id><published>2007-08-28T08:16:00.000-04:00</published><updated>2007-08-28T08:35:40.997-04:00</updated><title type='text'>Mom vs. MSN</title><content type='html'>&lt;p&gt;
My Mom likes MSN.com.  It's been her homepage for years, and I've accepted the fact that I won't be able to get her to switch to a better portal.  However, every time Mom gets a new computer, she somehow gets tricked into signing up for MSN dial-up service for $9.99/month, despite the fact that she already has a broadband Internet connection.
&lt;/p&gt;
&lt;p&gt;
Mom's a smart woman, so I'm not sure why this keeps happening.  I think the new computers' desktops are always cluttered with crapware icons, she clicks them all to see what they do, and one of them offers to help her "get connected to the Internet," even though she's already connected to the Internet.  And then an animated translucent butterfly pesters her until the clicks "OK."
&lt;/p&gt;
&lt;p&gt;
I'm sure there are people who actually would find it helpful for a new Windows machine to assist them in setting up a dial-up account.  But, it would be even more helpful if the MSN take-your-money wizard would detect whether a dial-up connection is really needed.
&lt;/p&gt;
&lt;p&gt;
Next time I help set up a new computer, I'll be sure to delete anything that says "MSN" before turning it over to the owner.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-1319662090106032780?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/1319662090106032780/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=1319662090106032780' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/1319662090106032780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/1319662090106032780'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2007/08/mom-vs-msn.html' title='Mom vs. MSN'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-3160522099435185632</id><published>2007-08-11T03:00:00.000-04:00</published><updated>2007-08-12T10:22:54.492-04:00</updated><title type='text'>Python Server Start, Take 2</title><content type='html'>&lt;p&gt;
A couple of months ago, I posted &lt;a href="http://kristopherjohnson.blogspot.com/2007/06/python-server-start.html"&gt;Python Server Start&lt;/a&gt;, a simple template for starting implementation of a network server in Python.  I got a comment from "dt" suggesting that what I really wanted to use was the standard Python &lt;tt&gt;SocketServer&lt;/tt&gt; module.
&lt;/p&gt;
&lt;p&gt;
Today, I had to write a "real server" in Python, so I finally got around to looking into &lt;tt&gt;SocketServer&lt;/tt&gt;.  The documentation wasn't helpful, but the source code for the module was straightforward, so I figured things out pretty quickly.
&lt;/p&gt;
&lt;p&gt;
After work, I decided to create a more generic version of what I'd done while I was on the clock.  What follows is my new "starting point" for implementing a server process in Python.  It's about 300 lines long, which is a bit large for a "Hello, world!" kind of program, but it has these nifty new features:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The server starts a daemon process, disconnected from the user's terminal, like it should.&lt;/li&gt;
&lt;li&gt;The server writes to a log file&lt;/li&gt;
&lt;li&gt;It implements a simple protocol between client and server.  Basically, the client just sends its command-line arguments to the server, and the server processes the command and sends output back, which the client writes to standard output.  (This protocol should, of course, be replaced with whatever protocol your real server has to handle; the template is just in place for testing and demonstration.)&lt;/li&gt;
&lt;li&gt;It can work with TCP/IP sockets, or can use UNIX domain sockets (on platforms that support them).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
I've only tried it on Mac OS X and Linux.  It will need some work for Windows, but thankfully, I haven't had to do much Windows programming lately, so I'm not going to worry about it.
&lt;/p&gt;
&lt;p&gt;
Making the necessary changes to use a base of &lt;tt&gt;ForkingTCPServer&lt;/tt&gt;, &lt;tt&gt;ThreadingTCPServer&lt;/tt&gt;, &lt;tt&gt;ThreadingUnixStreamServer&lt;/tt&gt;, or other variations is left as an exercise for the reader.
&lt;/p&gt;
&lt;p&gt;
I welcome any suggestions for improvement.
&lt;/p&gt;
&lt;pre&gt;
#!/usr/bin/env python

"""Server start

This is a template for a Python-based server daemon derived from
SocketServer.  Hack it up as needed.

This script implements both the server daemon and a command-line
client that can issue requests against it.  The template client-server
protocol is very simple: the client simply sends the command-line
arguments to the server, and the server returns output which the
client writes to its standard output.  Change the protocol as needed
for your purposes.

The template contains a few UNIXisms.  Modification may be needed for
a Windows-based server.

References:
- Source for ServerSocket.py (standard Python module)
- Source for BaseHTTPServer.py (standard Python module)
- http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/278731

"""

version = '1.0'

usage = """usage: %prog [options] command [arg...]

commands:
  start     start the server daemon
  stop      stop the server daemon
  status    return server daemon status
  echo      server echoes arguments
  add A B   return A+B

Example session:
  %prog start     # starts daemon
  %prog status    # print daemon's status
  %prog add 15 8  # prints "15 + 8 = 23"
  %prog stop      # stops daemon"""


import SocketServer
import optparse
import os
import os.path
import resource
import socket
import sys
import tempfile
import time

# We can use either a TCPServer or a UnixStreamServer (assuming the OS
# supports UNIX domain sockets).  We just need to define the
# appropriate ServerBase class and then customize a few things based
# upon which base we're using.

#ServerBase = SocketServer.TCPServer
ServerBase = SocketServer.UnixStreamServer
if ServerBase == SocketServer.TCPServer:
    # TODO: replace with appropriate port number
    server_address = ('', 54545)
elif ServerBase == SocketServer.UnixStreamServer:
    # TODO: replace with appropriate socket file path
    server_address = os.path.join(tempfile.gettempdir(), 'server_socket')

# Path to log file
# TODO: Change to appropriate path and name
server_log = os.path.join(tempfile.gettempdir(), 'server.log')


class RequestHandler(SocketServer.StreamRequestHandler):

    """Request handler

    An instance of this class is created for each connection made
    by a client.  The Server class invokes the instance's
    setup(), handle(), and finish() methods.

    The template implementation here simply reads a single line from
    the client, breaks that up into whitespace-delimited words, and
    then uses the first word as the name of a "command."  If there is
    a method called "do_COMMAND", where COMMAND matches the
    commmand name, then that method is invoked.  Otherwise, an error
    message is returned to the client.

    """

    def handle(self):
        """Service a newly connected client.

        The socket can be accessed as 'self.connection'.  'self.rfile'
        can be used to read from the socket using a file interface,
        and 'self.wfile' can be used to write to the socket using a
        file interface.

        When this method returns, the connection will be closed.
        """
        
        # Read a single request from the input stream and process it.
        # TODO: Change as needed for actual client-server protocol.
        request = self.rfile.readline()
        if request:
            self.server.log('request %s: %s',
                            self.connection.getpeername(), request.rstrip())
            try:
                self.process_request(request)
            except Exception, e:
                self.server.log('exception: %s' % str(e))
                self.wfile.write('Error: %s\n' % str(e))
        else:
            self.server.log('error: unable to read request')
            self.wfile.write('Error: unable to read request')


    def process_request(self, request):
        """Process a request.

        This method is called by self.handle() for each request it
        reads from the input stream.

        This implementation simply breaks the request string into
        words, and searches for a method named 'do_COMMAND',
        where COMMAND is the first word.  If found, that method is
        invoked and remaining words are passed as arguments.
        Otherwise, an error is returned to the client.
        """

        words = request.split()
        if len(words) == 0:
            self.server.log('error: empty request')
            self.wfile.write('Error: empty request\n')
            return

        command = words[0]
        args = words[1:]

        methodname = 'do_' + command
        if not hasattr(self, methodname):
            self.server.log('error: invalid command')
            self.wfile.write('Error: "%s" is not a valid command\n' % command)
            return
        method = getattr(self, methodname)
        method(*args)


    def do_stop(self, *args):
        """Process a 'stop' command"""
        self.wfile.write('Stopping server\n')
        self.server.stop()


    def do_echo(self, *args):
        """Process an 'echo' command"""
        self.wfile.write(' '.join(args) + '\n')


    def do_status(self, *args):
        """Process a 'status' command"""
        self.wfile.write('Server Version:    %s\n' % version)
        self.wfile.write('Process ID:        %d\n' % os.getpid())
        self.wfile.write('Parent Process ID: %d\n' % os.getppid())
        self.wfile.write('Server Socket:     %s\n' % str(server_address))
        self.wfile.write('Server Log:        %s\n' % server_log)


    def do_add(self, a, b):
        """Process an 'add' command"""
        answer = int(a) + int(b)
        self.wfile.write('%s + %s = %s\n' % (a, b, answer))


class Server(ServerBase):

    """Server implementation

    """

    def __init__(self, server_address):
        """Constructor"""
        self.__daemonize()

        if ServerBase == SocketServer.UnixStreamServer:
            # Delete the socket file if it already exists
            if os.access(server_address, 0):
                os.remove(server_address)

        ServerBase.__init__(self, server_address, RequestHandler)


    def log(self, format, *args):
        """Write a message to the server log file"""
        try:
            message = format % args
            timestamp = time.strftime('%Y-%m-%d %H:%M:%S')
            f = open(server_log, 'a+')
            f.write('%s %s\n' % (timestamp, message))
            f.close()
        except Exception, e:
            print str(e)


    def serve_until_stopped(self):
        """Serve requests until self.stop() is called.

        This is an alternative to BaseServer.serve_forever()
        """

        self.log('started')
        self.__stopped = False
        while not self.__stopped:
            self.handle_request()
        self.log('stopped')


    def stop(self):
        """Stop handling requests.

        Calling this causes the server to drop out of
        serve_until_stopped().
        """

        self.__stopped = True


    def __daemonize(self):
        """Create daemon process.

        Based upon recipe provided at
        http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/278731
        """

        UMASK = 0
        WORKDIR = '/'
        MAXFD = 1024
        if hasattr(os, 'devnull'):
            REDIRECT_TO = os.devnull
        else:
            REDIRECT_TO = '/dev/null'

        try :
            if os.fork() != 0:
                os._exit(0)

            os.setsid()

            if os.fork() != 0:
                os._exit(0)

            os.chdir(WORKDIR)
            os.umask(UMASK)
        except OSError, e:
            self.log('exception: %s %s', e.strerror, e.errno)
            raise Exception, "%s [%d]" % (e.strerror, e.errno)
        except Exception, e:
            self.log('exception: %s', str(e))
        
        maxfd = resource.getrlimit(resource.RLIMIT_NOFILE)[1]
        if maxfd == resource.RLIM_INFINITY:
            maxfd = MAXFD
        for fd in range(0, maxfd):
            try:
                os.close(fd)
            except OSError:
                pass

        os.open(REDIRECT_TO, os.O_RDWR)
        os.dup2(0, 1)
        os.dup2(0, 2)


def run_server(options, args):
    """Run a server daemon in the current process."""
    svr = Server(server_address)
    svr.serve_until_stopped()
    svr.server_close()


def do_request(options, args):
    """Send request to the server and process response."""
    if ServerBase == SocketServer.UnixStreamServer:
        s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
    elif ServerBase == SocketServer.TCPServer:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # Send request
    # TODO: Change as needed for actual client-server protocol
    s.connect(server_address)
    s.sendall(' '.join(args) + '\n')

    # Print response
    # TODO: Change as needed for actual client-server protocol
    sfile = s.makefile('rb')
    line = sfile.readline()
    while line:
        print line,
        line = sfile.readline()


#
# MAIN
#
if __name__ == '__main__':
    optparser = optparse.OptionParser(usage=usage,
                                      version=version)
    (options, args) = optparser.parse_args()

    if len(args) == 0:
        optparser.print_help()
        sys.exit(-1)

    if args[0] == 'start':
        run_server(options, args[1:])
    else:
        do_request(options, args)
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-3160522099435185632?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/3160522099435185632/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=3160522099435185632' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/3160522099435185632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/3160522099435185632'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2007/08/python-server-start-take-2.html' title='Python Server Start, Take 2'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-6526117793835727061</id><published>2007-08-03T19:18:00.000-04:00</published><updated>2007-08-03T19:50:21.703-04:00</updated><title type='text'>Screwed E-Mail</title><content type='html'>&lt;p&gt;
I have my own domain that I've been using for e-mail for the past few years.  Most of my e-mail goes there, and then gets forwarded to a Yahoo! mail account, which in turn gets downloaded to my Macbook.  This gives me a couple of nice features:  I can read everything in the nice Mac Mail app when I'm at home, but I can also access everything via the web when I'm elsewhere.
&lt;/p&gt;
&lt;p&gt;
Another nice feature was that I had the mail server configured such that &lt;i&gt;anything&lt;/i&gt;@mydomain.com would get to me.  This made it easy to essentially create new e-mail accounts whenever I needed a new one.  For example, if Microsoft wants me to register for something, I'd give them "microsoft@mydomain.com" as my e-mail address.  Since every website in the world wants my e-mail address, I figured that doing this would give me a way to create a different e-mail address for everybody who needs to contact me, making it easy to filter out stuff that I didn't want.
&lt;/p&gt;
&lt;p&gt;
This worked great, until today.  Today, my hosting provider, A2 Hosting, decided to disable the feature that automatically forwards everything to one place.  Now, I need to create accounts or forwarders for every single address that I'd like to handle.
&lt;/p&gt;
&lt;p&gt;
The problem is that I've been doing this for a long time, and I don't have a list of all the addresses I've used.  Every business and every website I've interacted with in the past couple of years will no longer be able to contact me, unless I can remember them.  So, now I'm not going to be getting a lot of e-mails that are important to me.  I'm screwed.
&lt;/p&gt;
&lt;p&gt;
The provider disabled this feature due to spam.  It is too easy for spammers to just randomly generate e-mail addresses for every domain, and there is a cost to the provider for every e-mail they forward.  I do sympathize, but it doesn't change the fact that I am now screwed by their policy change.
&lt;/p&gt;
&lt;p&gt;
So, I think I need to find another hosting provider, so I can start getting e-mail again.  Anybody out there happy with theirs?
&lt;/p&gt;
&lt;p&gt;
Alternatively, I suppose I could write a script to find all the e-mail addresses for which I've received mail for the past couple of years.  Switching providers sounds a lot simpler.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-6526117793835727061?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/6526117793835727061/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=6526117793835727061' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/6526117793835727061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/6526117793835727061'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2007/08/screwed-e-mail.html' title='Screwed E-Mail'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-8018749357799720177</id><published>2007-07-30T03:57:00.000-04:00</published><updated>2007-07-30T04:04:22.373-04:00</updated><title type='text'>New HBO Series</title><content type='html'>&lt;p&gt;
HBO has a couple of new series that I predict will be cancelled at the end of their first season.  Maybe if more people watch them, that won't happen, so I want to do my part to bring attention to them.
&lt;/p&gt;
&lt;p&gt;
&lt;i&gt;John from Cincinatti&lt;/i&gt; is weird, but has the best opening credits of any series ever.  I'll watch anything that has Rebecca DeMornay in it, but this one seems special.  I don't know what's going on, but I trust that David Milch (the genius behind &lt;i&gt;Deadwood&lt;/i&gt;) will eventually deliver.  I am determined to learn how to surf before I get too old.
&lt;/p&gt;
&lt;p&gt;
&lt;i&gt;Flight of the Conchords&lt;/i&gt; is incredibly funny.  I like how the "music videos" spontaneously arise during each episode.
&lt;/p&gt;
&lt;p&gt;
Please watch them.  If you don't like them, then you and I have radically different worldviews.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-8018749357799720177?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/8018749357799720177/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=8018749357799720177' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/8018749357799720177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/8018749357799720177'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2007/07/hbo.html' title='New HBO Series'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-4646501657662462865</id><published>2007-07-16T20:12:00.001-04:00</published><updated>2007-07-19T19:53:58.982-04:00</updated><title type='text'>MacBook Display Problem</title><content type='html'>&lt;div style="float: right; margin-left: 10px; margin-bottom: 10px;"&gt; &lt;a href="http://www.flickr.com/photos/kristopherjohnson/825122256/" title="photo sharing"&gt;&lt;img src="http://farm2.static.flickr.com/1435/825122256_f0dd95f25a_m.jpg" alt="" style="border: solid 2px #000000;" /&gt;&lt;/a&gt; &lt;br /&gt; &lt;span style="font-size: 0.9em; margin-top: 0px;"&gt;  &lt;a href="http://www.flickr.com/photos/kristopherjohnson/825122256/"&gt;MacBook Display Problem&lt;/a&gt;  &lt;br /&gt;  Originally uploaded by &lt;a href="http://www.flickr.com/people/kristopherjohnson/"&gt;kristopherjohnson&lt;/a&gt; &lt;/span&gt;&lt;/div&gt;
&lt;p&gt;
A couple of weeks ago, my Macbook's display started "flickering."  It seemed like I was getting some electromagnetic interference, so I didn't worry much at first.  But, it got progressively worse, and now the screen is unreadable.
&lt;/p&gt;
&lt;p&gt;
I took it in to the local Apple Genius Bar, and they took it in for repair.  I should have it back in a week or less.
&lt;/p&gt;
&lt;p&gt;
I'm glad I have a Genius Bar nearby, considering all the problems I've been having with recent Apple products.  I've been using computers for almost thirty years, but have never needed repairs or service until I bought the iMac G5 and the Macbook.
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;UPDATE 2007/07/19:&lt;/em&gt; Got the Macbook back, and it's working fine now.  According to the service form, the following parts were replaced:
&lt;/p&gt;
&lt;pre&gt;
630-7691  PCB, MLB, 2.0GHZ DC, SMS/KIONI
607-0199  ASSY, HEATSINK, M42(1.0mmConnect
605-0994  SVC, TOP CASE W
646-0302  DSPL 13.3 GLOSSY AUO
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-4646501657662462865?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/4646501657662462865/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=4646501657662462865' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/4646501657662462865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/4646501657662462865'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2007/07/macbook-display-problem.html' title='MacBook Display Problem'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm2.static.flickr.com/1435/825122256_f0dd95f25a_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-9069058745060222983</id><published>2007-07-14T01:27:00.000-04:00</published><updated>2007-07-15T11:46:29.946-04:00</updated><title type='text'>Improving SCons Performance for MSVC8</title><content type='html'>&lt;p&gt;
The developers of &lt;a href="http://www.scons.org"&gt;SCons&lt;/a&gt; don't seem to be very interested in this, but I've found a way to dramatically speed up SCons builds for MSVC8 (Visual Studio 2005's C++ compiler).
&lt;/p&gt;
&lt;pp&gt;
We've got a fairly big codebase with a few levels.  It was taking over a minute to read all the SConstruct/SConscript files, even when there was nothing to do.
&lt;/p&gt;
&lt;p&gt;
I ran the profiler, and found that the bulk of the time was in minidom.py and expatbuilder.py.  This was surprising, because I didn't think SCons used XML.
&lt;p&gt;
Searching further, it turns out that for MSVC8, to determine library and include paths SCons opens a registry key which contains XML, and parses it.  For our codebase, it was doing this about 300 times per build.
&lt;/p&gt;
&lt;p&gt;
So, I hacked up my personal copy of SCons/Tool/msvc.py, and now instead of over a minute, it only takes 20 seconds.  I don't consider this a "patch", because I don't really know much about SCons internals, and so this could be totally wrong, but maybe someone can figure out the right way to do what I have done and get it into CVS.
&lt;/p&gt;
&lt;p&gt;
The idea is to cache the results of _get_msvc8_path, so that the XML parsing doesn't happen every time.  I added a global variable to msvc.py, containing an empty dictionary:
&lt;/p&gt;
&lt;pre&gt;
# START NEW CODE
# KDJ: cache results of _get_msvc8_path in a dictionary
cached_msvc8_path = {}
# END NEW CODE
&lt;/pre&gt;
&lt;p&gt;
Then, I changed a few lines in get_msvc_path as follows:
&lt;/p&gt;
&lt;pre&gt;
    if version_num &gt;= 8.0:
        # ORIGINAL: return _get_msvc8_path(path, str(version_num), platform, suite)
        # START NEW CODE
        global cached_msvc8_path
        if not cached_msvc8_path.has_key(path):
            cached_msvc8_path[path] = _get_msvc8_path(path, str(version_num), platform, suite)
        return cached_msvc8_path[path]
        # END NEW CODE
    elif version_num &gt;= 7.0:
        return _get_msvc7_path(path, str(version_num), platform)
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-9069058745060222983?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/9069058745060222983/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=9069058745060222983' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/9069058745060222983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/9069058745060222983'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2007/07/improving-scons-performance-for-msvc8.html' title='Improving SCons Performance for MSVC8'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-2372921365352634909</id><published>2007-07-09T23:32:00.000-04:00</published><updated>2007-07-14T01:18:59.912-04:00</updated><title type='text'>Business Opportunities</title><content type='html'>&lt;p&gt;
Today I was presented with a business opportunity.  I know a guy who knows a guy who needs some software written, but knows nothing about software, and I know nothing about how do do what he needs done.
&lt;/p&gt;
&lt;p&gt;
Unfortunately, I am the kind of guy who, when presented with a bunch of stuff he has no idea how to do, says "I have no idea how to do that stuff.  You should talk to somebody else."
&lt;/p&gt;
&lt;p&gt;
This is why I will never be rich.  The really rich guys are the ones who say "Sure, we know how to do that," and then charge $150/hour until the client runs out of money.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-2372921365352634909?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/2372921365352634909/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=2372921365352634909' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/2372921365352634909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/2372921365352634909'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2007/07/business-opportunities.html' title='Business Opportunities'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-6775275458005197604</id><published>2007-07-05T20:58:00.000-04:00</published><updated>2007-07-05T21:02:42.980-04:00</updated><title type='text'>Kristopher Johnson Photography</title><content type='html'>&lt;p&gt;
I've been made aware of "Kristopher Johnson Photography" (&lt;a href="http://www.kristopherjohnsonphotography.com"&gt;http://www.kristopherjohnsonphotography.com&lt;/a&gt;).  I'm not that Kristopher Johnson, that's not my web site, and those aren't my pictures.  (His are better than mine.)
&lt;/p&gt;
&lt;p&gt;
My pictures are available on Flickr: &lt;a href="http://www.flickr.com/photos/kristopherjohnson/"&gt;http://www.flickr.com/photos/kristopherjohnson/&lt;/a&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-6775275458005197604?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/6775275458005197604/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=6775275458005197604' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/6775275458005197604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/6775275458005197604'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2007/07/kristopher-johnson-photography.html' title='Kristopher Johnson Photography'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-2439186681371364836</id><published>2007-07-05T09:24:00.000-04:00</published><updated>2007-07-05T09:26:31.893-04:00</updated><title type='text'>Funny Pictures of Photographers</title><content type='html'>&lt;p&gt;
These pictures may only be interesting to other photographers.  A couple of these pictures are a little risqu&amp;eacute;, so beware of who might be looking over your shoulder.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://legko.be/index.php?option=com_content&amp;task=view&amp;id=6053&amp;Itemid=1"&gt;http://legko.be/index.php?option=com_content&amp;task=view&amp;id=6053&amp;Itemid=1&lt;/a&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-2439186681371364836?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/2439186681371364836/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=2439186681371364836' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/2439186681371364836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/2439186681371364836'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2007/07/funny-pictures-of-photographers.html' title='Funny Pictures of Photographers'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-346791786577612508</id><published>2007-07-04T13:51:00.000-04:00</published><updated>2007-07-14T01:12:10.499-04:00</updated><title type='text'>Peachtree Road Race 2007</title><content type='html'>&lt;div style="float: right; margin-left: 10px; margin-bottom: 10px;"&gt;
&lt;a href="http://www.flickr.com/photos/kristopherjohnson/717519883/" title="Photo Sharing"&gt;&lt;img src="http://farm2.static.flickr.com/1086/717519883_2f6ab8c000_m.jpg" width="240" height="240" alt="Peachtree Road Race T-Shirt" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;
What kind of idiot gets up at 5:00 AM on a national holiday to go run six miles in the heat?  I'm that kind of idiot, and today I joined about 55,000 other such idiots in the &lt;a href="http://en.wikipedia.org/wiki/Peachtree_Road_Race"&gt;Peachtree Road Race&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
My goal was to run the full course, without slowing to a walk.  This goal turned out to be unrealistic.  I ran the first three miles without a problem, but then I reached "Cardiac Hill," a long uphill stretch so-named for the obvious reason, and also because there is a hospital conveniently located next to it.  About halfway up the hill, I started feeling dizzy, and I decided it was better to abandon the goal than to collapse.
&lt;/p&gt;
&lt;p&gt;
After clearing the top of the hill, I set a new goal: run the remainder of the course.  That didn't work either; after a half mile or so I again started feeling queasy.
&lt;/p&gt;
&lt;p&gt;
So, I set yet another goal:  walk to the five-mile marker, and then run the last 1.2-mile stretch to the finish.  I accomplished that.
&lt;/p&gt;
&lt;p&gt;
I didn't really run a 10K today.  I ran a 5K and a 2K, with a 3K walk in between.  My time from start to finish was 69 minutes, 28 seconds.  I expect to do better next year.
&lt;/p&gt;
&lt;p&gt;
I'm not disappointed in my performance.  This was my first time.  I don't have any steep hills in the area where I usually run, so I wasn't prepared for Cardiac Hill.  The course is tricky, because the first half is mostly downhill, giving you a false sense of optimism, and then the second half is mostly uphill.
&lt;/p&gt;
&lt;p&gt;
After finishing at Piedmont Park, it is a half-hour walk to get back to the MARTA train station.  That's something they don't point out in the informational handouts.  I would have rested for a while in the park before starting the walk if I'd known.
&lt;/p&gt;
&lt;p&gt;
So anyway, now I have the "coveted Peachtree Road Race t-shirt."  It makes it all worthwhile.
&lt;/p&gt;
&lt;p&gt;
I was impressed with how well organized the event was.  Getting 55,000 into the starting area, lining them up, giving them water and t-shirts, and getting them back home seems to me like a major undertaking, but I never felt crowded, delayed, or unsure of where I was supposed to go and what I was supposed to do.  MARTA, the city police, the Atlanta Track Club, and other involved parties seem to really have their @#$% together for this event.
&lt;/p&gt;
&lt;p&gt;
I didn't take my camera with me.  There was one shot I really wanted to take: a wide-angle shot of hundreds of runners lined up at the banks of porta-potties, taken from above the parking lot.  Maybe next year . . . .
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-346791786577612508?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/346791786577612508/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=346791786577612508' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/346791786577612508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/346791786577612508'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2007/07/peachtree-road-race-2007.html' title='Peachtree Road Race 2007'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm2.static.flickr.com/1086/717519883_2f6ab8c000_t.jpg' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-8105945302817355625</id><published>2007-07-02T23:39:00.000-04:00</published><updated>2007-08-03T21:13:07.385-04:00</updated><title type='text'>Pictures of Women</title><content type='html'>&lt;p&gt;
One thing that makes me laugh about eHarmony.com and Match.com is the terrible pictures that women post of themselves.  Most of the pictures are of women at company Christmas parties, wedding receptions, or at other kinds of celebrations, which means that the pictures usually have the following features:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;alcoholic beverage in hand&lt;/li&gt;
&lt;li&gt;drunken expression on the face&lt;/li&gt;
&lt;li&gt;bright flash&lt;/li&gt;
&lt;li&gt;red-eye&lt;/li&gt;
&lt;li&gt;uncomfortable clothing&lt;/li&gt;
&lt;li&gt;cropped-out boyfriend/ex-husband&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Another popular type of picture is the vacation photo.  The kind where there is some great, big, important, old building filling the frame, but if you look really closely, you can just barely make out a tiny woman standing in front of it, wearing sunglasses.
&lt;/p&gt;
&lt;p&gt;
C'mon ladies, this is simple marketing.  If you really want the Right Guys to notice you, get a couple of good pictures of yourself.  I don't mean Glamour-Shots-style pictures; you should just have some pictures that show your face in flattering light with a pleasant smile, without any distracting features.  The smart women also have a full-length picture or two, because, well, men like to see that.
&lt;/p&gt;
&lt;p&gt;
Don't worry if you don't look like a supermodel.  Nice guys aren't looking for that; they just want to know a woman isn't hideous before starting a conversation.
&lt;/p&gt;
&lt;p&gt;
I volunteer to take pictures of any beautiful women who need me to do so.  I won't charge you anything, but you will have to have coffee with me.  It's part of my creative process.
&lt;/p&gt;
&lt;p&gt;
By the way, I haven't seen any of the men's pictures on the dating sites, so I don't know their common foibles.  Maybe my female readers can let me know what men usually do wrong, so I can check my own pictures.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-8105945302817355625?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/8105945302817355625/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=8105945302817355625' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/8105945302817355625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/8105945302817355625'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2007/07/pictures.html' title='Pictures of Women'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-7944015480038510589</id><published>2007-06-30T15:12:00.000-04:00</published><updated>2007-07-04T15:23:34.820-04:00</updated><title type='text'>Phone Books</title><content type='html'>&lt;p&gt;
I received new phone books yesterday.  I immediately threw them into the closet that contains four years' worth of phone books that I keep meaning to recycle.  I have about ten cubic feet of books.  All the books are still in the plastic bags.
&lt;/p&gt;
&lt;p&gt;
Does anyone actually use phone books anymore?  I can't remember the last time I looked up a number or address in a book.  I suspect it was in the 1990's.  I do use phone books as impromptu stepladders, monitor stands, and replacement table legs, but there are better alternatives.
&lt;/p&gt;
&lt;p&gt;
Phone books are just really-heavy junk mail.  I'll have to look into whether I can request to no longer receive them.  I'll get on that right after I recycle the ones I have.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-7944015480038510589?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/7944015480038510589/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=7944015480038510589' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/7944015480038510589'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/7944015480038510589'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2007/06/phone-books.html' title='Phone Books'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-691249882060643625</id><published>2007-06-27T21:46:00.000-04:00</published><updated>2007-06-27T22:12:44.827-04:00</updated><title type='text'>test.cpp</title><content type='html'>&lt;p&gt;
(For programmers only)
&lt;/p&gt;
&lt;p&gt;
I've had to become familiar with yet another "legacy codebase."  There is no documentation, other than the code itself, and all the people who worked on developing the code are either gone or are too busy with other projects to give me an overview and tour.  So I've been on my own.&lt;/p&gt;
&lt;p&gt;
In such situations, I usually start by finding the &lt;tt&gt;main()&lt;/tt&gt; function and tracing the paths of execution through the code.  If you're lucky, &lt;tt&gt;main()&lt;/tt&gt; has a couple of lines of initialization code, a simple loop, and a few lines of cleanup code.  If you're unlucky, &lt;tt&gt;main()&lt;/tt&gt; is 2,000 lines long with eight levels of indentation and lots of variables with names like &lt;tt&gt;x&lt;/tt&gt;, &lt;tt&gt;tmp&lt;/tt&gt;, &lt;tt&gt;temp&lt;/tt&gt;, and &lt;tt&gt;temp2&lt;/tt&gt;.
&lt;/p&gt;
&lt;p&gt;
But I couldn't find the &lt;tt&gt;main()&lt;/tt&gt;!  When I searched through the code directories (all 72 of them), I did find a few &lt;tt&gt;main()&lt;/tt&gt; functions, but they were all in source files called &lt;tt&gt;test.cpp&lt;/tt&gt;.  "That must just be test code," I thought.
&lt;/p&gt;
&lt;p&gt;
I was mistaken.  As it turns out, every single executable's &lt;tt&gt;main()&lt;/tt&gt; resides in a source file called "&lt;tt&gt;test.cpp&lt;/tt&gt;."
&lt;/p&gt;
&lt;p&gt;
Why?  Because the first guy who wrote an executable program that linked with all these libraries made a simple test program, quite reasonably named "&lt;tt&gt;test.cpp&lt;/tt&gt;."  And then everyone else just copied that guy's files when they needed a new executable.
&lt;/p&gt;
&lt;p&gt;
I understand why somebody might want to copy a working program to create a new program, but I had to ask why nobody bothered to rename each copy to something more descriptive.  The answer: "Because then we'd have to change the copied Makefiles, and that's too much work."
&lt;/p&gt;
&lt;p&gt;
Now that I get paid by the hour, I don't let such answers bother me.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-691249882060643625?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/691249882060643625/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=691249882060643625' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/691249882060643625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/691249882060643625'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2007/06/testcpp.html' title='test.cpp'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-6274367781517145825</id><published>2007-06-18T22:31:00.001-04:00</published><updated>2007-08-16T09:18:57.922-04:00</updated><title type='text'>Replaced flux capacitor</title><content type='html'>&lt;div style="float: right; margin-left: 10px; margin-bottom: 10px;"&gt; &lt;a href="http://www.flickr.com/photos/kristopherjohnson/567189395/" title="photo sharing"&gt;&lt;img src="http://farm2.static.flickr.com/1229/567189395_81e9e6b9b8_m.jpg" alt="" style="border: solid 2px #000000;" /&gt;&lt;/a&gt; &lt;br /&gt; &lt;span style="font-size: 0.9em; margin-top: 0px;"&gt;  &lt;a href="http://www.flickr.com/photos/kristopherjohnson/567189395/"&gt;Replaced flux capacitor&lt;/a&gt;  &lt;br /&gt;  Originally uploaded by &lt;a href="http://www.flickr.com/people/kristopherjohnson/"&gt;kristopherjohnson&lt;/a&gt; &lt;/span&gt;&lt;/div&gt;
&lt;p&gt;
When I returned to my apartment after work today, I found a service-request form indicating that the maintenance guy had fixed my air-conditioning system by replacing the flux capacitor.
&lt;/p&gt;
&lt;p&gt;
This is curious, because the &lt;a href="http://en.wikipedia.org/wiki/Flux_capacitor"&gt;flux capacitor&lt;/a&gt; is the device that makes time travel possible for the DeLorean in the &lt;i&gt;Back to the Future&lt;/i&gt; movies.  I've searched the Internet, but can't find anything about applications of this technology to real-life A/C systems.
&lt;/p&gt;
&lt;p&gt;
The other curious thing is that I have not requested service on my A/C recently.
&lt;/p&gt;
&lt;p&gt;
I have had problems.  The A/C will run for a hour or two and then stop.  It would restart if I turn off the system, wait a few seconds (until I hear a "click") and then turn it back on, but then it would stop again an hour or two later.  If left to itself, it will stay off indefinitely.  This meant that during hot summer months, I would usually awaken at around 3:00 AM every morning sweating, and return from work every day to find my apartment at 95 degrees.
&lt;/p&gt;
&lt;p&gt;
I put in some service requests the first summer after I moved in, but all they did in response was to turn it off and back on, and then say "Look, it works now."  I also got a very-helpful lecture on how to use a thermostat, with special emphasis on the differences between the &lt;i&gt;Heat&lt;/i&gt; and &lt;i&gt;Cool&lt;/i&gt; switch positions.&lt;/p&gt;
&lt;p&gt;
In their defense, I will admit that the A/C was always working when they left.  It only failed when I was trying to get some sleep.
&lt;/p&gt;
&lt;p&gt;
Now, two years later, my flux capacitor has been replaced.  I don't know why they suddenly decided to fix it.
&lt;/p&gt;
&lt;p&gt;
The &lt;i&gt;Comments&lt;/i&gt; section of the service form indicates that the part replaced is the "XXX Capacitor," where XXX is an unreadable word but looks like it might be "Bon" or "Ron."  My best guess is that the guy intended to write "replaced bad capacitor," which makes sense.  Unless it was a bad flux capacitor.
&lt;/p&gt;
&lt;p&gt;
By the way, the problem with my A/C persists.  Maybe I need the dilithium crystals replaced next.
&lt;/p&gt;
&lt;p&gt;
[UPDATE: I called Tuesday morning to make a request that they fix my now-broken A/C.  Tuesday evening, it still wasn't working.  So after another warm sweaty night, I went into the office on Wednesday morning in a foul mood and made demands.  Wednesday afternoon, they replaced the flux capacitor (again), a relay, the fan motor, the transformer, the A/C filter, and the thermostat.  Now, it seems to be working.]
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-6274367781517145825?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/6274367781517145825/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=6274367781517145825' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/6274367781517145825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/6274367781517145825'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2007/06/replaced-flux-capacitor.html' title='Replaced flux capacitor'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm2.static.flickr.com/1229/567189395_81e9e6b9b8_t.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-5268709010086516511</id><published>2007-06-16T06:21:00.000-04:00</published><updated>2007-06-16T06:29:05.423-04:00</updated><title type='text'>Super Sugar Crisp</title><content type='html'>&lt;p&gt;
I believe that America lost something when Post changed the name of "Super Sugar Crisp" to "Golden Honey Crisp" or whatever they call it now, and when "Sugar Bear" became "Golden Bear."
&lt;/p&gt;
&lt;p&gt;
Here's one of the old boxes:
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://theimaginaryworld.com/oxbox05.jpg"&gt;&lt;/img&gt;
&lt;/p&gt;
&lt;p&gt;
I remember this box.  I got the Frankenstein glow-in-the-dark monster.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-5268709010086516511?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/5268709010086516511/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=5268709010086516511' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/5268709010086516511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/5268709010086516511'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2007/06/super-sugar-crisp.html' title='Super Sugar Crisp'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-2318817492035562145</id><published>2007-06-14T02:11:00.000-04:00</published><updated>2007-06-14T02:23:09.804-04:00</updated><title type='text'>Londo and G'Kar</title><content type='html'>&lt;p&gt;
I've been watching all the old &lt;i&gt;Babylon 5&lt;/i&gt; episodes via Netflix.  When the series was originally airing, I stopped watching some time during the third season.
&lt;/p&gt;
&lt;p&gt;
I didn't care much for the Delenn-and-Sheridan romance.  The Vorlon-vs.-Shadows subplot got old.  I didn't like Garibaldi's and Franklin's problems.  These all annoyed me.
&lt;/p&gt;
&lt;p&gt;
But, every time Londo Molari (Centauri) or G'Kar (Narn) were on screen, it was wonderful.
&lt;/p&gt;
&lt;p&gt;
J. Michael Straczynski was a genius.  The story started with G'Kar being the "bad guy" and Londo being a buffoon.  But as the story progressed, G'Kar became more of a stately and sympathetic character, while Londo became a tragic figure.  It really was brilliant.  I don't know how much credit goes to the writer, and how much goes to the actors, but the developments were extraordinary for television.
&lt;/p&gt;
&lt;p&gt;
"Wonderful" is the only term I can use to describe the Londo-and-G'Kar story.  &lt;i&gt;Babylon 5&lt;/i&gt; had a lot of problems, but this is something that was done right.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-2318817492035562145?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/2318817492035562145/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=2318817492035562145' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/2318817492035562145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/2318817492035562145'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2007/06/londo-and-gkar.html' title='Londo and G&apos;Kar'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-5369347501906016031</id><published>2007-06-13T23:55:00.000-04:00</published><updated>2007-06-14T00:00:28.000-04:00</updated><title type='text'>Stick Figures in Peril</title><content type='html'>&lt;p&gt;
I saw this on &lt;a href="http://grayraven.com/JimNtexas/?p=360"&gt;Jim N Texas&lt;/a&gt;'s blog.  It's a collection of pictures of signs illustrating all the dangers of modern life.  It's good for many laughs.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.flickr.com/groups/stickfiguresinperil/pool/"&gt;Stick Figures in Peril&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
I've wondered why there aren't any "Beware of Spinning Propellers" signs at the airport with illustrations of stick figures being ground up into little square bits of meat.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-5369347501906016031?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/5369347501906016031/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=5369347501906016031' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/5369347501906016031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/5369347501906016031'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2007/06/stick-figures-in-peril.html' title='Stick Figures in Peril'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-2084789646646162185</id><published>2007-06-13T22:26:00.001-04:00</published><updated>2007-06-27T22:15:26.362-04:00</updated><title type='text'>Peachtree Race Number</title><content type='html'>&lt;div style="float: right; margin-left: 10px; margin-bottom: 10px;"&gt; &lt;a href="http://www.flickr.com/photos/kristopherjohnson/545268273/" title="photo sharing"&gt;&lt;img src="http://farm2.static.flickr.com/1115/545268273_cf35a6b667_m.jpg" alt="" style="border: solid 2px #000000;" /&gt;&lt;/a&gt; &lt;br /&gt; &lt;span style="font-size: 0.9em; margin-top: 0px;"&gt;  &lt;a href="http://www.flickr.com/photos/kristopherjohnson/545268273/"&gt;Peachtree Race Number&lt;/a&gt;  &lt;br /&gt;  Originally uploaded by &lt;a href="http://www.flickr.com/people/kristopherjohnson/"&gt;kristopherjohnson&lt;/a&gt; &lt;/span&gt;&lt;/div&gt;
&lt;p&gt;
Received my race number for the Peachtree Road Race today.
&lt;/p&gt;
&lt;p&gt;
It's on!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-2084789646646162185?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/2084789646646162185/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=2084789646646162185' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/2084789646646162185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/2084789646646162185'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2007/06/peachtree-race-number.html' title='Peachtree Race Number'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm2.static.flickr.com/1115/545268273_cf35a6b667_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-8966526737255015135</id><published>2007-06-12T04:04:00.000-04:00</published><updated>2007-06-18T22:55:57.723-04:00</updated><title type='text'>Adobe Camera Raw with Photoshop Elements 4.0 for Mac</title><content type='html'>&lt;p&gt;
For anyone with a Nikon D80 who uses Photoshop Elements 4.0 for the Mac, here are some tips if you have problems opening NEF files (Nikon's RAW format):
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The version of that plug-in that comes with Photoshop Elements is old, and does not support the D80 raw format.  The automatic software update feature of Photoshop Elements doesn't update the Adobe Camera Raw plug-in.&lt;/li&gt;
&lt;li&gt;The D80 raw file format is supported by version 3.6 or later of the Adobe Camera Raw plug-in.  As of 2007/6/12, the most current version of the ACR plug-in is 3.7.  (There is an ACR 4.1 version available, but it only works with Photoshop CS3, not with Elements 4.0.)  You can download it from &lt;a href="http://www.adobe.com/support/downloads/thankyou.jsp?ftpID=3591&amp;fileID=3375"&gt;Adobe support&lt;/a&gt;.  Copy the file to the directory &lt;tt&gt;/Library/Application Support/Adobe/Plug-ins/CS2/File Formats&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;If, when opening a NEF file, you get a simple dialog that only allows changing of white balance and exposure compensation instead of the Camera Raw dialog pictured in Adobe's documentation, it may be because you installed PicturePerfect or some other Nikon software that installs its own plug-in which disables Adobe's Camera Raw plug-in.  Check the second section of &lt;a href="http://www.earthboundlight.com/phototips/adobe-camera-raw-problems.html"&gt;Three Common Problems with Adobe Camera Raw . . .&lt;/a&gt; for a solution.  (Basically, if ou have a "Nikon NEF Plugin," you need to move, rename, or delete it.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
[UPDATE 2007/6/18: The upgrade to Elements 4.01 for the Mac is now available, and Camera Raw 4.1 works with that.]
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-8966526737255015135?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/8966526737255015135/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=8966526737255015135' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/8966526737255015135'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/8966526737255015135'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2007/06/adobe-camera-raw-with-photoshop.html' title='Adobe Camera Raw with Photoshop Elements 4.0 for Mac'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6254179.post-5603185041513519868</id><published>2007-06-10T23:02:00.001-04:00</published><updated>2007-06-14T00:04:05.794-04:00</updated><title type='text'>Kayaking</title><content type='html'>&lt;p&gt;
I took a recreational kayaking class.  "Recreational" is the term they use for people who aren't doing anything competitive (racing) and who aren't doing anything crazy (whitewater).  The purpose of the class was to learn the basic strokes and control of a kayak.
&lt;/p&gt;
&lt;p&gt;
The class went from 8:00 AM to about 4:00 PM, with a break for lunch.  There were seven students, and two instructors.  We met at the "put-in" point on the Chattahoochee River.  The first couple of hours were spent on land.  We first unloaded all the equipment, then waited while a few people dropped off their vehicles at the "take-out" point a few miles downstream.  Then the instruction began.
&lt;/p&gt;
&lt;p&gt;
The equipment is pretty simple to understand.  First, you've got a kayak, which is a small narrow boat with a small cockpit, a seat, and a couple of pegs to put your feet on.  For serious kayaking, you wear a skirt that seals the cockpit from water, but we didn't need that for our class.  The kayak has some inflatable airbags in the bow ans stern that will prevent the boat from taking on too much water if it capsizes or goes under a wave.  Kayaks range in size from long "sea kayaks" to the very-short whitewater kayaks.  Recreational kayaks are between those two extremes.
&lt;/p&gt;
&lt;p&gt;
Next, you've got a two-bladed paddle.  The blades are offset at an angle from one another so that when you've got one in the water, the other blade is not flat against the wind.  Kayakers must twist their wrists as they go from one side to the other so that the blade in the water is at the right angle.  Serious kayak racers have their blades at a 90-degree angle to minimize wind drag, but to avoid wrist injuries, most kayakers use a less extreme angle.
&lt;/p&gt;
&lt;p&gt;
Finally, you've got a "personal floatation device" (PFD), which is a fancy name for a lifejacket.  Depending upon the weather and likelihood of getting wet, one might also want a spray jacket, thermal underwear, a wetsuit, or a drysuit, but it was a muggy 90-degree day, and nobody planned to flip their kayak, so we all had minimal clothing.
&lt;/p&gt;
&lt;p&gt;
The instructors covered some safety information.  We were told that if we fell out of the kayak, the best thing to do would be to float on our backs with feet pointed downstream and out of the water.  Smashing against rocks with one's buttocks may not sound pleasant, but it is preferable to hitting your head/face against them by trying to swim face down.  You also don't want your feet to get caught on anything because you could get stuck and then get pushed underwater by the current.
&lt;/p&gt;
&lt;p&gt;
The instructors talked a little about how to control the kayak, but it was surprisingly little information.  Instead, they told us to get into the kayaks and do our best to paddle out and meet just past a bridge downstream.
&lt;/p&gt;
&lt;p&gt;
I quickly concluded that there must be something wrong with my kayak, as it would always turn when I wanted to go straight, and go straight when I wanted to turn.  The other students' kayaks were similarly defective.  But we all managed to reach the designated point, and then the instructors taught us the basic strokes.
&lt;/p&gt;
&lt;p&gt;
This took a couple of hours, and by the end we were all in fairly good control.  We stopped at a park and took a break for lunch, then got back in the kayaks.
&lt;/p&gt;
&lt;p&gt;
The afternoon was spent in some small rapids.  These are known as "Class 1" rapids.  The classification system goes up to 6, but anything over 3 is for experts.
&lt;/p&gt;
&lt;p&gt;
The instructors covered some features of rapids before we got into them.  One feature is rocks.  Obviously, one does not want to hit rocks, but a good feature of a rock is that behind each rock is an area of calm water known as an "eddy."  Eddies are good places to rest or to wait for the rest of your party.  The only problem with eddies is that at the boundary between the eddy and the fast-moving current, the current pushes one away from the eddy, so it takes some finesse and strong paddling to get into an eddy and to exit one gracefully.
&lt;/p&gt;
&lt;p&gt;
Another feature of rapids is a "strainer," which is something that lies across the path but which the water does not go around.  An example would be a fallen tree.  Strainers are bad, because a boater can get trapped, unable to get out due to the strength of the current.  Stay away from strainers.
&lt;/p&gt;
&lt;p&gt;
We went through a few rapids, and it was fun.  However, I had the distinction of being the guy who fell out of his boat.  I got turned sideways while going through some bumpy water and started tilting back and forth.  During the safety lecture earlier, the instructor had mentioned that if you fall out of the boat, it's better to fall upstream than downstream, so that the boat stays downstream of you and will hit rocks and such, instead of sandwiching you between itself and a rock.  So, when I started getting unstable, I deliberately leaned upstream to avoid falling downstream, and I guess I leaned too far.
&lt;/p&gt;
&lt;p&gt;
I managed to hang on to my paddle, and grabbed the capsized kayak.  This was right in the middle of some rapids, so I had little choice but to aim my feet downstream and keep them out of the water, as instructed earlier.  My butt did hit a few rocks as I went down the rapids, but the rocks were all smooth and covered with moss, so there was no pain or damage.
&lt;/p&gt;
&lt;p&gt;
When I got clear of the rapids, the instructor was rowing up to me.  He tied a line to my kayak and towed it and me toward the shore.  I dragged the kayak up on the beach, drained the water out of the kayak, and then put the kayak back on the water and got in.
&lt;/p&gt;
&lt;p&gt;
We went through the rest of the rapids without incident.  We weren't making good time; the river is low these days and the current doesn't flow very fast.  So, for what seemed like an hour or so, we rowed and rowed and rowed until we got to to the take-out point.
&lt;/p&gt;
&lt;p&gt;
We packed everything up and shuttled back to the put-in point, and that was it.
&lt;/p&gt;
&lt;p&gt;
It was fun, but I was completely exhausted when I got home.  I remember getting out of my car when I got home.  The next thing I remember is waking up on the couch three hours later.  Even after that nap and some dinner, I still felt woozy.
&lt;/p&gt;
&lt;p&gt;
My legs were very sore for a couple of days.  One might think that a kayaker doesn't use their legs, and that their arms would get sore, but that's not how it works.  If you are paddling correctly, you twist your hips and torso, and so you rely on the strength of your legs to hold you in your seat.
&lt;/p&gt;
&lt;p&gt;
A few days later, I feel fine.  I'm thinking about signing up for the whitewater course.  I'm sure I'll end up falling out of the boat again, but as they say, if you don't fall out, you aren't trying hard enough.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6254179-5603185041513519868?l=kristopherjohnson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kristopherjohnson.blogspot.com/feeds/5603185041513519868/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6254179&amp;postID=5603185041513519868' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/5603185041513519868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6254179/posts/default/5603185041513519868'/><link rel='alternate' type='text/html' href='http://kristopherjohnson.blogspot.com/2007/06/kayaking.html' title='Kayaking'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm2.static.flickr.com/1206/825030042_b428e380a4_s.jpg'/></author><thr:total>0</thr:total></entry></feed>
