<?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'><id>tag:blogger.com,1999:blog-6254179</id><updated>2009-10-03T08:04:08.966-04: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'/><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=26&amp;max-results=25'/><author><name>Kris Johnson</name><uri>http://www.blogger.com/profile/05074794127008708420</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>683</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</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'/&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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01801438491229995271'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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'/&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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01801438491229995271'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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'/&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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01801438491229995271'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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'/&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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01801438491229995271'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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'/&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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01801438491229995271'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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'/&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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01801438491229995271'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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'/&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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01801438491229995271'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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'/&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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01801438491229995271'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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'/&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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01801438491229995271'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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'/&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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01801438491229995271'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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'/&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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01801438491229995271'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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'/&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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01801438491229995271'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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'/&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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01801438491229995271'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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'/&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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01801438491229995271'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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'/&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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01801438491229995271'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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'/&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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01801438491229995271'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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'/&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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01801438491229995271'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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'/&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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01801438491229995271'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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'/&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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01801438491229995271'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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'/&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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01801438491229995271'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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'/&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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01801438491229995271'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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'/&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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01801438491229995271'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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'/&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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01801438491229995271'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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'/&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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01801438491229995271'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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'/&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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01801438491229995271'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry></feed>