<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Onion Peels</title>
    <description>.NET, Technology, Life, Whatever</description>
    <link>http://blueonionsoftware.com/blog.aspx</link>
    <language>en-us</language>
    <copyright>Copyright (c) 2006 Blue Onion Software, All rights reserved</copyright>
    <webMaster>mike@blueonionsoftware.com</webMaster>
    <generator>Powered by Bloget</generator>
    <image><link>http://blueonionsoftware.com/Blog.aspx</link><url>http://feeds.feedburner.com/~fc/blueonionsoftware</url><title>Blue Onion Software</title></image>
    <geo:lat>42.16489</geo:lat><geo:long>-83.783873</geo:long><creativeCommons:license>http://creativecommons.org/licenses/by/2.0/</creativeCommons:license><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/blueonionsoftware" type="application/rss+xml" /><feedburner:emailServiceId>464104</feedburner:emailServiceId><feedburner:feedburnerHostname>http://www.feedburner.com</feedburner:feedburnerHostname><item>
      <title>Yellowstone - Day 9 and 10</title>
      <pubDate>Fri, 04 Jul 2008 13:46:19 GMT</pubDate>
      <link>http://feeds.feedburner.com/~r/blueonionsoftware/~3/326655532/blog.aspx</link>
      <guid isPermaLink="false">fff38e1e-6a67-4375-b8cb-a8d8785e7665</guid>
      <author>mike@blueonionsoftware.com</author>
      <description>&lt;p&gt;We were up at 5:30 am local time and out the door a little after 6:00 am. We headed North to Hayden Flats in look of wildlife. We came up empty. In fact, we were pretty much a bust on the wildlife aspect of our trip. Others told us they were practically tripping over wildlife but we  were hard pressed to find any. Timing is everything I suppose.&lt;/p&gt;  &lt;p&gt;The balance of our day was spent exploring the thermal activity in area. I'm told there are 10,000 geysers, fumeroles, vents, hot springs and mud pots (my favorite). My wife is something of a goal driven person so I'm betting we saw something like 8,000 of these items. It was a long day and a lot of walking. Still, we did see some great sights, particularly the hot springs.&lt;/p&gt;  &lt;p&gt;My favorite hot springs are deep blue. I'm told the temperature of the blue is the hottest at 197 Fahrenheit. The boiling point of water at this altitude is 199 F. The color is just beautiful. I found myself wanting to dive in. We hiked about 200 ft up a hill to grab a magnificent view of Midway.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blueonionsoftware.com/images/blog/YellowstoneDay9and10_10C60/CIMG1817.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="500" alt="CIMG1817" src="http://blueonionsoftware.com/images/blog/YellowstoneDay9and10_10C60/CIMG1817_thumb.jpg" width="660" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Of course, no trip to Yellowstone would be complete without a visit to Old Faithful. It's a great geyser but it's also a victim of its own success. The viewing area is so large that you end up almost 100 yards away from the geyser. It diminishes the impact considerably. The best geyser we saw was Grand geyser (pictured below). It's almost has big as Old Faithful but not as consistent and therefore not as popular. You can sit much closer to this geyser as well which makes for a much more dramatic event. &lt;/p&gt; &lt;a href="http://blueonionsoftware.com/images/blog/YellowstoneDay9and10_10C60/CIMG1817.jpg"&gt;&lt;/a&gt;  &lt;p&gt;&lt;a href="http://blueonionsoftware.com/images/blog/YellowstoneDay9and10_10C60/CIMG1840.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="500" alt="CIMG1840" src="http://blueonionsoftware.com/images/blog/YellowstoneDay9and10_10C60/CIMG1840_thumb.jpg" width="380" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;After a very full day we retreated to our campsite where a fire, bourbon and a nice cigar awaited. After all the walking (I'm guessing we walked close to 10 miles) we slept like bricks.&lt;/p&gt;  &lt;p&gt;Day 10 of our trip started early again. We were packed and on the road again by 7:30 am. We made a quick stop in Grant Village near the South entrance of Yellowstone and took in the Visitors Center. Heading South from there, we entered Grand Teton an hour later.&lt;/p&gt;  &lt;p&gt;Grand Teton is smaller than Yellowstone (small out here is 45 miles long). The mountains are unique in that they have no foothills in front of them so you can see the entire range almost unobstructed. The mountains are youngsters in the Rockies and still rising. The jaggedness of the peaks is due in part to the relatively young age of the mountains.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blueonionsoftware.com/images/blog/YellowstoneDay9and10_10C60/CIMG1919.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 20px 5px 0px; border-right-width: 0px" height="500" alt="CIMG1919" src="http://blueonionsoftware.com/images/blog/YellowstoneDay9and10_10C60/CIMG1919_thumb.jpg" width="380" align="left" border="0" /&gt;&lt;/a&gt;The main attraction in the area is Jenny Lake. It's a picturesque lake nestled in the mountains. There's a boat ride to the other side leading to some very steep trails. The trails lead to Hidden Falls and Inspiration point. The falls are magnificent and well worth the effort. Inspiration Point is much higher and while the view is great there are similar views to be had else where in the park that can be more easily reached. Signal mountain is perhaps the best view of the valley and you can drive up to it.&lt;/p&gt;  &lt;p&gt;There is also a trial the rings the lake. It's about 3 miles to the falls using this lake trail. We went early in the morning to avoid trial traffic. The trail is lovely and in relatively easy. However, relatively easy out here is still work. We hiked both directions and on the way back I saw plenty of people who were not prepared for hiking in the mountains. Most had no water. Yellowstone and the Tetons are arid places and high altitude as well. It is very easy to become dehydrated out here. It was clear to me that 90% of folks were ill prepared with no water, poor shoes (sandals do not cut it our here) and poor health. The park service stays pretty busy I imagine bailing people out who have over extended themselves.&lt;/p&gt;  &lt;p&gt;The Winter and Spring have been wet here as well and the falls, rivers and lakes are just gorged. The sound of rushing water is everywhere. Wildlife was much more abundant here than in Yellowstone. We saw large herds of Elk in several locations, spotted a Bear (at last) and the usual Prong Horns.&lt;/p&gt;  &lt;p&gt;There are several visitor centers at the Tetons but two stand out. At the Southern entrance is the Craig Thomas Visitor Center which is a marvel of architecture. The exhibits are excellent and one unique display allows you to walk on a stream by embedding monitors in the floor. The other visitor center  is at Coltor Bay and is housed in a decidedly tired building. But don't let that fool you, inside is one of the finest Native American exhibits available. It comes from a private collection and is simply stunning. The artifacts reveal the ingenuity of the plains people to fabricate beautiful utensils and costumes from nothing more than native plants and and animals. It also demonstrates the influence of early settlers who brought technologies like metallurgy that allowed the fashioning of axes and other implements.&lt;/p&gt;  &lt;p&gt;Our visit to the Tetons concluded the wilderness part of our trip. From here we head down to Denver to visit friends and take in a Rockies Baseball game and fireworks.  There's also a visit to Red Rocks which I'm looking forward to.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt; &lt;/a&gt;
      &lt;p&gt;powered by &lt;a href="http://blueonionsoftware.com/bloget.aspx"&gt;Bloget&amp;trade;&lt;/a&gt; - &lt;i&gt;"One File, One
        Binary, One Blog"&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/blueonionsoftware?a=hOBhZQ"&gt;&lt;img src="http://feeds.feedburner.com/~a/blueonionsoftware?i=hOBhZQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/blueonionsoftware?a=oVHsfJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/blueonionsoftware?i=oVHsfJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/blueonionsoftware?a=IuXQ0J"&gt;&lt;img src="http://feeds.feedburner.com/~f/blueonionsoftware?i=IuXQ0J" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/blueonionsoftware?a=yhEhrj"&gt;&lt;img src="http://feeds.feedburner.com/~f/blueonionsoftware?i=yhEhrj" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blueonionsoftware/~4/326655532" height="1" width="1"/&gt;</description>
      <category>Life</category>
    <feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=blueonionsoftware&amp;itemurl=http%3A%2F%2Fblueonionsoftware.com%2Fblog.aspx%3Fp%3Dfff38e1e-6a67-4375-b8cb-a8d8785e7665</feedburner:awareness><feedburner:origLink>http://blueonionsoftware.com/blog.aspx?p=fff38e1e-6a67-4375-b8cb-a8d8785e7665</feedburner:origLink></item>
    <item>
      <title>Yellowstone - Day 7 and 8</title>
      <pubDate>Thu, 03 Jul 2008 15:12:04 GMT</pubDate>
      <link>http://feeds.feedburner.com/~r/blueonionsoftware/~3/325872903/blog.aspx</link>
      <guid isPermaLink="false">8c1158da-44ba-4eb2-92fd-26f72c94dc4e</guid>
      <author>mike@blueonionsoftware.com</author>
      <description>&lt;p&gt;We've arrived at Yellowstone at  last! The day's driving was relatively easy despite the mountainous terrain. Towing a large trailer takes a little different attitude. The cruise control is worthless. It's designed for lightly loaded vehicle. I've found if I accelerate early and keep the RPM's up the truck does a very good job of pulling the trailer. Also, I've been adjusting the load levelers and I think I've found the sweet spot. Despite pulling some pretty steep grades, most of the time I could maintain 55 mph.&lt;/p&gt;  &lt;p&gt;At the RV park we checked in and discovered only hard-sided campers are allowed. Our camper has pop-outs on the ends for sleeping. Apparently the bears find the sleeper sides a bit too tempting. After seeing the sites, it was fine that we could not stay there. Nothing but asphalt and tightly packed campers. We opted for the more primitive tent sites. It means no 110 volt but we have battery for lights and water and gas for cooking. Not exactly what you would call roughing it.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blueonionsoftware.com/images/blog/YellowstoneDay7_13564/CIMG1673.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 20px 5px 0px; border-right-width: 0px" height="200" alt="CIMG1673" src="http://blueonionsoftware.com/images/blog/YellowstoneDay7_13564/CIMG1673_thumb.jpg" width="260" align="left" border="0" /&gt;&lt;/a&gt; We came through the East entrance which took us over some 8000 ft. passes. It's almost July and there's snow on the ground. Temps go down to the 40's at night and only hit 70 during the day. Actually, for me, these are great conditions. I've slept like a brick in the camper with the cooler conditions.&lt;/p&gt;  &lt;p&gt;Despite my reservations about hauling a camper around, I've found the camping experience to be delightful. The cozy space of the camper is a welcome retreat at the end of the day. Make no mistake, there is a bit of extra hassle in setting up and tearing down camp and the trailer  does make for some long driving due to the reduced speeds. Still, on balance, I'm feeling it was the right decision for us. The kids love the adventure of camping and we can cook and eat our own food which is always a plus in my book.&lt;/p&gt;  &lt;p&gt;Nights are very cold here still (late June). Temperatures dipped into the high 30's last night. Thank goodness for down sleeping bags. There is snow every where above 7,000 feet. Two weeks earlier, many of the park roads were closed due to blizzard conditions. The heavy snowfall has meant very high water levels. Many of the creeks look more like small lakes.&lt;/p&gt;  &lt;p&gt;We met our guide the next morning at the historic Yellowstone Lodge. It was built in the 1920's and has that grand style of early turn of the century buildings sometimes had. It has been recently restored and has one of the best views of Yellowstone Lake and the mountains in the entire park. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blueonionsoftware.com/images/blog/YellowstoneDay7_13564/CIMG1681.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 0px 0px 20px; border-right-width: 0px" height="200" alt="CIMG1681" src="http://blueonionsoftware.com/images/blog/YellowstoneDay7_13564/CIMG1681_thumb.jpg" width="260" align="right" border="0" /&gt;&lt;/a&gt;Our first stop was Grand Canyon of the Yellowstone. The upper and lower falls are perhaps the most spectacular feature of the park. We're told the light is best in the early morning. The falls were thundering with the excess water from the heavy snow melt. The water would bounce off the bottom and fly 75 ft back into the air. The surrounding rock contains minerals that turn it yellow. This is where the park gets it name from. There is closer observation point called the "Brink of the Falls". Here you stand at the top of the lower falls. The water is mere feet from us flowing by at an impossible rate. The noise is thunderous.&lt;/p&gt;  &lt;p&gt;Next was the Sulfur Caldron. It's supposedly the smelliest area of the park. It was. But the thermal activity was incredible. Large pools about 50 ft across boiled with a yellow sulfuric fury. Further back, there was a giant mud pot about 25 ft. in size plopping and gurgling like an angry caldron.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blueonionsoftware.com/images/blog/YellowstoneDay7_13564/CIMG1722.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 20px 5px 0px; border-right-width: 0px" height="207" alt="CIMG1722" src="http://blueonionsoftware.com/images/blog/YellowstoneDay7_13564/CIMG1722_thumb.jpg" width="260" align="left" border="0" /&gt;&lt;/a&gt;Further down the road we moved into Hayden Valley. It's a great stop for watching Elk and Wolf packs, but not today. We moved on over the pass and into Northern end of the park. Here we saw Osprey (Fish Hawks), Peregrine Falcons, and Golden Eagle nests. Bison and Elk littered the area. On the way back we stopped at a large rapids and watched Cut Throat Trout jumping to get upstream.&lt;/p&gt;  &lt;p&gt; After dinner, we went to the Fishing Bridget Visitor Center. The kids played on the beach while a stole a few watts from the park service to recharge my laptop. My wife spotted a herd of Elk on the shore to the West. Several juveniles were running about. Coming back from the visitor center we ran into a coyote trying to cross the road. He was a healthy, fluffy specimen rather than the emaciated ones I see back East. He made for quite a traffic jam.&lt;/p&gt;  &lt;p&gt;Tomorrow we go out at 6 am with hopes of seeing a bear or two. Then on to the geysers and mud pots.&lt;/p&gt;
      &lt;p&gt;powered by &lt;a href="http://blueonionsoftware.com/bloget.aspx"&gt;Bloget&amp;trade;&lt;/a&gt; - &lt;i&gt;"One File, One
        Binary, One Blog"&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/blueonionsoftware?a=F5Olgr"&gt;&lt;img src="http://feeds.feedburner.com/~a/blueonionsoftware?i=F5Olgr" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/blueonionsoftware?a=qB9xpJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/blueonionsoftware?i=qB9xpJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/blueonionsoftware?a=XswVnJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/blueonionsoftware?i=XswVnJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/blueonionsoftware?a=ZBqizj"&gt;&lt;img src="http://feeds.feedburner.com/~f/blueonionsoftware?i=ZBqizj" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blueonionsoftware/~4/325872903" height="1" width="1"/&gt;</description>
      <category>Life</category>
    <feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=blueonionsoftware&amp;itemurl=http%3A%2F%2Fblueonionsoftware.com%2Fblog.aspx%3Fp%3D8c1158da-44ba-4eb2-92fd-26f72c94dc4e</feedburner:awareness><feedburner:origLink>http://blueonionsoftware.com/blog.aspx?p=8c1158da-44ba-4eb2-92fd-26f72c94dc4e</feedburner:origLink></item>
    <item>
      <title>Yellowstone - Day 5 and 6</title>
      <pubDate>Wed, 02 Jul 2008 01:29:52 GMT</pubDate>
      <link>http://feeds.feedburner.com/~r/blueonionsoftware/~3/324491857/blog.aspx</link>
      <guid isPermaLink="false">ab126ac0-5459-42d1-932b-7e71de1a1442</guid>
      <author>mike@blueonionsoftware.com</author>
      <description>&lt;p&gt;&lt;a href="http://blueonionsoftware.com/images/blog/YellowstoneDay5_14503/CIMG1580.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 0px 0px 20px; border-right-width: 0px" height="184" alt="CIMG1580" src="http://blueonionsoftware.com/images/blog/YellowstoneDay5_14503/CIMG1580_thumb.jpg" width="244" align="right" border="0" /&gt;&lt;/a&gt; We slept in late (well for us a least) and didn't get out the door until 8:00 am. We set out for the Wildlife Loop in Custer State Park, SD. No sooner did we drive a few miles when we ran into hundreds of buffalo. They were in the road and in no hurry to move. We were near the South entrance to the park. The younger buffalo were checking out some of the doors of the ranger station.&lt;/p&gt;  &lt;p&gt;There were numerous calves everywhere. The heard is more productive than the park can support so the cull the it every fall in a huge round-up. Animals are selected for slaughter and wind up on the menus of many of restaurants in the area.&lt;/p&gt;  &lt;p&gt;The park is alive with life. Everywhere you go you see Long Horned Sheep, Prong Horn Deer, Prairie Dogs, Wild Horses, and lot of birds. The place is just teaming with life. We spent more time outside of the car taking photographs than driving.&lt;/p&gt;  &lt;p&gt;In the afternoon we attended some ranger programs. The kids particularly liked mining for gold. We went to a local creek where they issued the children pans and showed them how to sift for gold.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blueonionsoftware.com/images/blog/YellowstoneDay5_14503/CIMG1599.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 20px 0px 0px; border-right-width: 0px" height="244" alt="CIMG1599" src="http://blueonionsoftware.com/images/blog/YellowstoneDay5_14503/CIMG1599_thumb.jpg" width="184" align="left" border="0" /&gt;&lt;/a&gt;The needles highway is perhaps the most spectacular part of the park. It is a narrow winding road that cuts through the mountain with several very narrow tunnels and leads to some amazing rock formations that jut out of the ground like needles (hence the name I suppose).&lt;/p&gt;  &lt;p&gt;It rained again that night (I thought this was a desert people!). Fortunately for us our travel trailer was water tight and we experienced no leaks. This is one time when the travel trailer trumps tent camping. We sat dry and protected from the storm and could read and play games. It's great family time.&lt;/p&gt;  &lt;p&gt;The next day we left for Thermopolis in Wyoming, famous for their mineral hot springs. Along the way we stopped in Dead Wood, home of Calamity Jane, Wild Bill Hickock and other notable Western figures. It apparently hit bottom in the 1980's and was a dying town. Some one got the idea to introduce gambling shortly afterwards and the downtown has made an amazing comeback. Restored and new structures are carefully monitored to maintain the old West feel of the town. There are numerous hotels, casinos and speciality stores. Definitely touristy but when compared to the 1980 pictures, a vast and welcome improvement.&lt;/p&gt;  &lt;p&gt;The Adams Museum in Dead Wood  is well worth the visit. It's free but they accept donations. It's rated as one of the 10 best Western museums in the United States. I'm not sure what that means but it is a very pleasant and thoughtfully presented collection. Among the many artifacts is the first train that was used in the area. It's quaintly small, almost child sized. It could not have pulled more than a dozen cars.&lt;/p&gt;  &lt;p&gt;From Dead Wood we crossed the mountains. Again I wished for 8 cylinders. The Trailblazer has the muscle, but it takes a lot of RPM's to get the job done. Something I'll remember for the future.&lt;/p&gt;  &lt;p&gt;The hot springs are very comfy by the way. They percolate out of the ground at 130 degrees and then is cooled in graduated pools. One pool was 117 degrees.  The other two were 104 and 97 respectively. Personally, 97 was plenty hot for me.&lt;/p&gt;  &lt;p&gt;Access to the Internet is sporadic here in the mountains. I try to write everyday but it can be several days before I find a Wi-Fi hot spot. Typically, the information centers, sprinkled near the major tourist attractions, are the only places I've found to be reliable.&lt;/p&gt;
      &lt;p&gt;powered by &lt;a href="http://blueonionsoftware.com/bloget.aspx"&gt;Bloget&amp;trade;&lt;/a&gt; - &lt;i&gt;"One File, One
        Binary, One Blog"&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/blueonionsoftware?a=EsUGcQ"&gt;&lt;img src="http://feeds.feedburner.com/~a/blueonionsoftware?i=EsUGcQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/blueonionsoftware?a=Cu0JvJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/blueonionsoftware?i=Cu0JvJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/blueonionsoftware?a=QpMitJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/blueonionsoftware?i=QpMitJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/blueonionsoftware?a=a16Nqj"&gt;&lt;img src="http://feeds.feedburner.com/~f/blueonionsoftware?i=a16Nqj" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blueonionsoftware/~4/324491857" height="1" width="1"/&gt;</description>
      <category>Life</category>
    <feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=blueonionsoftware&amp;itemurl=http%3A%2F%2Fblueonionsoftware.com%2Fblog.aspx%3Fp%3Dab126ac0-5459-42d1-932b-7e71de1a1442</feedburner:awareness><feedburner:origLink>http://blueonionsoftware.com/blog.aspx?p=ab126ac0-5459-42d1-932b-7e71de1a1442</feedburner:origLink></item>
    <item>
      <title>Yellowstone - Day 4</title>
      <pubDate>Fri, 27 Jun 2008 03:17:35 GMT</pubDate>
      <link>http://feeds.feedburner.com/~r/blueonionsoftware/~3/321014353/blog.aspx</link>
      <guid isPermaLink="false">ecefbde8-1b6d-4668-80f7-61df85f3a89c</guid>
      <author>mike@blueonionsoftware.com</author>
      <description>&lt;p&gt;We left the Bad Lands of South Dakota early and headed for the Interstate. First stop was the National Minuteman Missile Launch Facility. The park service runs tours of the old cold war missile silos and command centers. It's such an important part of history that we had to stop and investigate.&lt;/p&gt;  &lt;p&gt;As luck would have it, Tuesday is the only day of the week when they have open house tours. All other times are by appointment. We first headed to one of the control centers (there were 12 at one time in South Dakota). It's a nondescript building that does not stand out in anyway except for the cyclone fence and barb wire. Not unlike what you would find at any other municipal facility.&lt;/p&gt;  &lt;p&gt;Several dozen of us were lined up and waiting when the park rangers came out and began to escort us in groups of 7 or less. Once in side, it had all the charm of a military facility. Fax wood paneling, drop ceilings and drab colored carpet were the extent of decoration. The personnel slept in bunk beds and had to bring their own bedding. There was a hand gun discharge barrel in each room. After unloading, the gun was pointed into the discharge barrel (filled with sand) and the gun fired to confirm the chamber was empty. Guns were then stored in a locker.&lt;/p&gt;  &lt;p&gt;We then proceeded to the elevator which barely fit the 7 people in our group plus the park ranger. The control center was located 31 feet below the surface. Some facilities are as deep as 180 feet.&lt;/p&gt;  &lt;p&gt;Once below, we entered the "Capsule". It's a pill shaped room about 30 feet long and suspended on large springs to absorb the shock of a nuclear strike. The door to the room is 7 tons and looks to be about 4 feet thick. There's a funny cartoon modeled after the Domino's PIzza slogan painted on the door promising delivery in 30 minutes or less.&lt;/p&gt;  &lt;p&gt;The room is vintage 1960's. Some of the computers look like they had nixie tubes. There was a red box with two locks that contained the launch codes. Each missileer (their name, not mine), has separate codes that only he knows. And unlike the movies, there is no red button. There are two keys spaced 12 feet apart that have to be turned simultaneously. &lt;/p&gt;  &lt;p&gt;One thing I didn't know is that it actually takes 4 people, not two to launch a missile. If only the two officers actuate the weapon, it goes into a 2.5 hour count down. Only if 2 other missileers in another control center confirm the launch by the same method is there a launch.&lt;/p&gt;  &lt;p&gt;There was a total of 450 missiles through out South Dakota. All could be launched from multiple launch centers. And even if all the launch centers were destroyed, there was a plane in the air at all times called "Looking Glass" that could launch missiles at a later time. There was a clever array of hardened antennas that were designed to survive an attack and allow Looking Glass to fire the missiles.&lt;/p&gt;  &lt;p&gt;We then drove 7 miles to one of the missile silos. Again, just a barb-wired square area about 200 feet on a side. The silo had some huge freaking door on it (I forget the tonnage). When it came time to fire the door was literally blown off the top and missile is on its way.&lt;/p&gt;  &lt;p&gt;The missile itself is 57 feet tall and looks way to small to fly 6,500 miles and drop a 40 megaton payload. It was clad entirely in white and had no markings on it. I guess the figured the Soviets would figure out who sent the missile.&lt;/p&gt;  &lt;p&gt;There's lots more to tell but I let you discover it for yourself by visiting this interesting relic of the cold war.&lt;/p&gt;  &lt;p&gt;We arrived at Mt. Rushmore later that day. It's smaller than I imagined. The mountain looms 600 feet above the ground. It some how looks unfinished to me. The history and exhibit are well worth the trip but it really can be seen in half a day. Check out the sculpture studio where you can handle the jackhammers and grinders the workers used to shape the granite.&lt;/p&gt;  &lt;p&gt;We left Mt. Rushmore and headed to Custer State Park via Iron Mountain Road. Calling it a road is generous. It's one lane in many places and the fastest you can go is about 25 mph. The have these cool pigtail bridges where you drive under the bridge and then turn sharply while climbing until you cross the bridge. It's a clever way of moving up a hill in a small space.&lt;/p&gt;  &lt;p&gt;We then drove through tunnels that were blasted out of the rock. The tunnels were only 10 feet across and 12 feet high. The camper fit through, but just barely.&lt;/p&gt;  &lt;p&gt;We arrived at Custer State Park. This place is huge. It took us 45 minutes to drive to the camp ground after entering the park. Tomorrow, we go wild life viewing.&lt;/p&gt;
      &lt;p&gt;powered by &lt;a href="http://blueonionsoftware.com/bloget.aspx"&gt;Bloget&amp;trade;&lt;/a&gt; - &lt;i&gt;"One File, One
        Binary, One Blog"&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/blueonionsoftware?a=X96ubV"&gt;&lt;img src="http://feeds.feedburner.com/~a/blueonionsoftware?i=X96ubV" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/blueonionsoftware?a=Hv5xxI"&gt;&lt;img src="http://feeds.feedburner.com/~f/blueonionsoftware?i=Hv5xxI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/blueonionsoftware?a=DSO31I"&gt;&lt;img src="http://feeds.feedburner.com/~f/blueonionsoftware?i=DSO31I" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/blueonionsoftware?a=y7tx0i"&gt;&lt;img src="http://feeds.feedburner.com/~f/blueonionsoftware?i=y7tx0i" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blueonionsoftware/~4/321014353" height="1" width="1"/&gt;</description>
      <category>Life</category>
    <feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=blueonionsoftware&amp;itemurl=http%3A%2F%2Fblueonionsoftware.com%2Fblog.aspx%3Fp%3Decefbde8-1b6d-4668-80f7-61df85f3a89c</feedburner:awareness><feedburner:origLink>http://blueonionsoftware.com/blog.aspx?p=ecefbde8-1b6d-4668-80f7-61df85f3a89c</feedburner:origLink></item>
    <item>
      <title>Yellowstone - Day 2 and 3</title>
      <pubDate>Fri, 27 Jun 2008 03:17:21 GMT</pubDate>
      <link>http://feeds.feedburner.com/~r/blueonionsoftware/~3/321014354/blog.aspx</link>
      <guid isPermaLink="false">07f00c93-4dea-4551-a60f-19a5ca87feae</guid>
      <author>mike@blueonionsoftware.com</author>
      <description>&lt;p&gt;We made a mad dash across Minnesota and then South Dakota to the bad lands. The wind continue to persist for most of the trip which limited me to 55 mph. The landscape goes by very slowly. Not that the country isn't beautiful. There's a great rest stop on I-90 just before the Missouri river. Some really spectacular views. Lewis and Clark must of just been in awe.&lt;/p&gt;  &lt;p&gt;We arrived in the Bad Lands National Park after about 14 hours of driving. A long day, but considering there was not much in the way of interesting stops, it was probably for the best. The camp ground here is primitive with no hook-ups for our trailer. Not a big deal to me and my wife who are accustomed to tent camping, but our kids are a bit put off by the lack of electricity. They're adapting, but not without protest.&lt;/p&gt;  &lt;p&gt;It rained the night we arrived in the Bad Lands. Let me say that again for effect. It rained hard. This has been the wettest Spring in memory here in the Bad Lands. The place is actually green. Really green. People who have lived here all there lives (a few from the Dust Bowl era included) have said the weather is absurd. The place feels lush. Temperatures are in the 70's. Meadowlarks flit about and the cacti are blooming. It's not even close to being desert like.&lt;/p&gt;  &lt;p&gt;While we may not be getting the hot temperatures and desperately dry conditions I was expecting, we are seeing lots of wildlife. Bison roam freely, deer and  mountain sheep can be spotted if you look carefully, and then there are the ubiquitous Prairie Dogs. The little rodents are just everywhere you look.&lt;/p&gt;  &lt;p&gt;The Bad Lands are a unique geologic formation that is different than just about anything else you'll encounter in the West. The colors and variations are wild and unexpected. Many people more famous than I have commented on the spiritual effect the place can have on you and I for one can only add that they're right. It's a remote, desolate, hard and yet endearing place that you would do well to spend some time in.&lt;/p&gt;  &lt;p&gt;South Dakota is a lonely place. The landscape dares you to make a living from it and the shear expanse makes you feel little and unimportant. It's hard to imagine settlers coming out here 150 years ago and making a go of it. The solitude and hardship seems like it could be soul breaking. Obviously, I'm not what you would call the pioneer type.&lt;/p&gt;  &lt;p&gt;There's a little town just outside the park boundary called Interior. By small I mean the city jail, school (elementary and high school), water works and telecommunications services all exist in a single block. Other than a bar advertising ice-cold beer and a gas station, there's not much to recommend the place. Hard to imagine there are people who have lived there for 80 years.&lt;/p&gt;  &lt;p&gt;Tomorrow we are traveling to the Black Hills, famous for Mt. Rushmore and the 1874 gold rush. Should be an easy travel day.&lt;/p&gt;
      &lt;p&gt;powered by &lt;a href="http://blueonionsoftware.com/bloget.aspx"&gt;Bloget&amp;trade;&lt;/a&gt; - &lt;i&gt;"One File, One
        Binary, One Blog"&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/blueonionsoftware?a=EkvzpC"&gt;&lt;img src="http://feeds.feedburner.com/~a/blueonionsoftware?i=EkvzpC" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/blueonionsoftware?a=f8RiTI"&gt;&lt;img src="http://feeds.feedburner.com/~f/blueonionsoftware?i=f8RiTI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/blueonionsoftware?a=L7HCLI"&gt;&lt;img src="http://feeds.feedburner.com/~f/blueonionsoftware?i=L7HCLI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/blueonionsoftware?a=qiwsdi"&gt;&lt;img src="http://feeds.feedburner.com/~f/blueonionsoftware?i=qiwsdi" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blueonionsoftware/~4/321014354" height="1" width="1"/&gt;</description>
      <category>Life</category>
    <feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=blueonionsoftware&amp;itemurl=http%3A%2F%2Fblueonionsoftware.com%2Fblog.aspx%3Fp%3D07f00c93-4dea-4551-a60f-19a5ca87feae</feedburner:awareness><feedburner:origLink>http://blueonionsoftware.com/blog.aspx?p=07f00c93-4dea-4551-a60f-19a5ca87feae</feedburner:origLink></item>
    <item>
      <title>Yellowstone - Day one</title>
      <pubDate>Sun, 22 Jun 2008 00:53:16 GMT</pubDate>
      <link>http://feeds.feedburner.com/~r/blueonionsoftware/~3/317168302/blog.aspx</link>
      <guid isPermaLink="false">08304696-1460-4cd7-9319-0d7ab72ac99e</guid>
      <author>mike@blueonionsoftware.com</author>
      <description>&lt;p&gt;Ok, so we're off and rolling. We left Ann Arbor, MI about 6:00 am. We've rented a 19 ft travel trailer that I'm towing behind my 6 cylinder Trailblazer. I mention this because after fighting strong head-winds all day, I realize why experienced haulers have 8 cylinder engines (and diesel at that). While the Trailblazer can easily haul a 3,000 pound travel trailer, it does so at a cost -- Fuel. I figure I'm going to burn 25% more fuel than anticipated. Bummer.&lt;/p&gt;  &lt;p&gt;Anyway, we made it to Dubuque Iowa, which is our traditional first stop when heading out West. My wife hails from here so we always stop to visit family when we're traveling near-by. Dubuque IA, is a beautiful, if not flooded place. There's lots of evidence of flooding in the form of unplanted and dead fields. It's a real mess and I can only imagine the economic hardship it has caused. People live very close to the land here. Something that is a bit hard for me to relate to since I was raised a city boy (and feel like one every time I visit here).&lt;/p&gt;  &lt;p&gt;The pastoral beauty of the place is still amazing to me, even after 20 years of visiting here (yeah, I've been married 20 years, hard to imagine). Right now I'm sitting on a deck overlooking farmlands that stretch to the horizon. Cows graze a mere 50 yards from me. Hummingbirds flit back and forth from the feeders. The sky is purple velvet.&lt;/p&gt;  &lt;p&gt;My wife and kids are currently with the my in-laws at a go-cart race. You read right, a go-cart race. It's one of the forms of entertainment you don't experience else where (well, I least I haven't experienced it). Tonight, my 7 year old nephew (Ok, great nephew) is racing. How cool (and weird) is that. They limit the speed to 30 mph but still that's a good clip for a 7 year old. I can't imagine something like this occurring in Michigan.&lt;/p&gt;  &lt;p&gt;The other thing I've noticed on this trip is how few cars are on the road. I've driven this route for close to 20 years now and know it well. The high gas prices have really cut down the number of vehicles. It's clear to me that people are pulling back. I've begun to wonder if the family road-trip vacation may be endangered. It's likely gas prices will be higher and not lower next year -- and the year after that. The days of families driving for long distances to exotic and new places are numbered. I'm blessed that I earn an income that entitles me to take vacations like this.&lt;/p&gt;  &lt;p&gt;I'm sad and a bit disconcerted how close others live to the economic edge here in Iowa. I want to help and know that at the same time it likely won't change things. I feel selfish at such times.&lt;/p&gt;  &lt;p&gt;We camp in the Bad-Lands tomorrow. It's a long day of driving but I'm seriously looking forward to it. There is something about the harshness of deserts that has always attracted me. Arid is just in my nature I suppose.&lt;/p&gt;
      &lt;p&gt;powered by &lt;a href="http://blueonionsoftware.com/bloget.aspx"&gt;Bloget&amp;trade;&lt;/a&gt; - &lt;i&gt;"One File, One
        Binary, One Blog"&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/blueonionsoftware?a=ittYkN"&gt;&lt;img src="http://feeds.feedburner.com/~a/blueonionsoftware?i=ittYkN" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/blueonionsoftware?a=cuifwI"&gt;&lt;img src="http://feeds.feedburner.com/~f/blueonionsoftware?i=cuifwI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/blueonionsoftware?a=xTVuSI"&gt;&lt;img src="http://feeds.feedburner.com/~f/blueonionsoftware?i=xTVuSI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/blueonionsoftware?a=3X2ihi"&gt;&lt;img src="http://feeds.feedburner.com/~f/blueonionsoftware?i=3X2ihi" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blueonionsoftware/~4/317168302" height="1" width="1"/&gt;</description>
      <category>Life</category>
    <feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=blueonionsoftware&amp;itemurl=http%3A%2F%2Fblueonionsoftware.com%2Fblog.aspx%3Fp%3D08304696-1460-4cd7-9319-0d7ab72ac99e</feedburner:awareness><feedburner:origLink>http://blueonionsoftware.com/blog.aspx?p=08304696-1460-4cd7-9319-0d7ab72ac99e</feedburner:origLink></item>
    <item>
      <title>Friday Links #6</title>
      <pubDate>Fri, 20 Jun 2008 12:58:39 GMT</pubDate>
      <link>http://feeds.feedburner.com/~r/blueonionsoftware/~3/316204027/blog.aspx</link>
      <guid isPermaLink="false">a8d09663-1065-43b8-a0e6-6da784665dc4</guid>
      <author>mike@blueonionsoftware.com</author>
      <description>&lt;p&gt;I'm on vacation in Yellowstone for the next couple of weeks so this will be the last "techy" post until I return. I will post pictures of trip here along the way if I get the chance.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.controlc.com/index.php" target="_blank"&gt;Control C&lt;/a&gt; - automated solution that will monitor your clipboard and store the data for you so you can later share or retrieve for yourself contents copied to your clipboard that otherwise would have been lost forever. All content uploaded from your clipboard is encrypted to protect your data completely.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.podipodi.com/" target="_blank"&gt;PodiPodi&lt;/a&gt; - Shift-Z to navigate the Web. I kind of didn't get it but the implementation is very cool.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://down2earth.eu/impact_calculator/" target="_blank"&gt;Down 2 Earth | Impact Calculator&lt;/a&gt; - See how big of a hole you can put in the Earth.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://kk.org/kk/2008/06/the-100-oldest-companies.php" target="_blank"&gt;The 100 Oldest Companies&lt;/a&gt; - The oldest living company today is one from Japan. It is a 1,290-year-old hotel located at a hot spring, run by 46 generations of the Hoshi family.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.makeuseof.com/tag/take-advantage-of-the-new-windows-live-writer/" target="_blank"&gt;New Windows Live Writer&lt;/a&gt; - My favorite blog composer has just been updated (beta, but still cool).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://wordle.net/" target="_blank"&gt;Wordle&lt;/a&gt; - Beautiful word clouds. Interesting variations and fonts.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://css-tricks.com/absolute-positioning-inside-relative-positioning/"&gt;Absolute Positioning Inside Relative Positioning&lt;/a&gt; - CSS Tricks always has great articles and explanations on all things CSS.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lifehacker.com/396206/the-history-of-firefox-10-to-30-in-screenshots" target="_blank"&gt;The History of Firefox 1.0 to 3.0 in Screenshots&lt;/a&gt; - I forgot all about that weird red banner on the first version.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.popsci.com/military-aviation-space/article/2008-06/plutoids" target="_blank"&gt;Pluto Gets Reclassified Again&lt;/a&gt; - Will Pluto ever get respect?&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.labnol.org/software/browsers/screencast-how-to-select-multiple-lines-of-text-in-firefox-3/3598/" target="_blank"&gt;Select Multiple Lines of Text in Firefox 3&lt;/a&gt; - Cool selection trick in the newest Firefox. You did download it, didn't you?&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lifehacker.com/5016951/how-to-make-windows-vista-less-annoying"&gt;How to Make Windows Vista Less Annoying&lt;/a&gt; - Good tips on how to make Vista a bit more friendly. Hey, even a Vista fan like me finds aspects of the interface annoying.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://devlicio.us/blogs/derik_whittaker/archive/2008/06/16/using-c-3-0-net-3-5-syntax-in-a-net-2-0-application.aspx" target="_blank"&gt;Using C# 3.0 (.Net 3.5) syntax in a .Net 2.0 application&lt;/a&gt; - I've talked about this before. You can use many of the new C# features while still targeting .Net 2.0. This article does a good job of summarizing those features.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://fileforum.betanews.com/detail/HashTab/1096345722/1" target="_blank"&gt;HashTab&lt;/a&gt; - I love this little guy. New release adds drag and drop support.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.labnol.org/software/tutorials/cut-copy-paste-text-remove-formatting-styles/3607/" target="_blank"&gt;Quickly Remove Formatting when you Copy-Paste Text In Office&lt;/a&gt; - Great way to get plain text from Word.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.makeuseof.com/tag/rogue-software-lies-hang-onto-your-money/"&gt;Rogue Software Lies - Hang Onto Your Money!&lt;/a&gt; - These products look so legit it's hard to believe they're rouge. Very enlightening.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.codeproject.com/KB/session/redirecttimeout.aspx" target="_blank"&gt;Redirect to another page when session timeout in ASP.NET&lt;/a&gt; - Great tip on how to remind users to save their work.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.makeuseof.com/dir/global-rich-list/"&gt;Global Rich List : How Rich Am I in The World ?&lt;/a&gt; - See where you rank in the world. Warning! Possibly depressing.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.dev102.com/net/diagnose-assembly-binding-failures/%20%20%20%20%20%20%20%20%20%20%20%20%20%20http://www.dev102.com/net/diagnose-assembly-binding-failures/"&gt;Diagnose Assembly Binding Failures &lt;/a&gt;- This useful tool is included in the SDK. Who knew!&lt;/p&gt;
      &lt;p&gt;powered by &lt;a href="http://blueonionsoftware.com/bloget.aspx"&gt;Bloget&amp;trade;&lt;/a&gt; - &lt;i&gt;"One File, One
        Binary, One Blog"&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/blueonionsoftware?a=TInMo6"&gt;&lt;img src="http://feeds.feedburner.com/~a/blueonionsoftware?i=TInMo6" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/blueonionsoftware?a=VtezYI"&gt;&lt;img src="http://feeds.feedburner.com/~f/blueonionsoftware?i=VtezYI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/blueonionsoftware?a=xp0bGI"&gt;&lt;img src="http://feeds.feedburner.com/~f/blueonionsoftware?i=xp0bGI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/blueonionsoftware?a=qGgcGi"&gt;&lt;img src="http://feeds.feedburner.com/~f/blueonionsoftware?i=qGgcGi" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blueonionsoftware/~4/316204027" height="1" width="1"/&gt;</description>
      <category>Links</category>
    <feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=blueonionsoftware&amp;itemurl=http%3A%2F%2Fblueonionsoftware.com%2Fblog.aspx%3Fp%3Da8d09663-1065-43b8-a0e6-6da784665dc4</feedburner:awareness><feedburner:origLink>http://blueonionsoftware.com/blog.aspx?p=a8d09663-1065-43b8-a0e6-6da784665dc4</feedburner:origLink></item>
    <item>
      <title>To Throw or not to Throw, that is the question</title>
      <pubDate>Thu, 19 Jun 2008 16:44:02 GMT</pubDate>
      <link>http://feeds.feedburner.com/~r/blueonionsoftware/~3/315553736/blog.aspx</link>
      <guid isPermaLink="false">b5b9e553-3e10-40ae-9f59-e38f1c50e2d6</guid>
      <author>mike@blueonionsoftware.com</author>
      <description>&lt;p&gt;I find it frustrating that there are programmers I work with who still prefer to use error return codes or even worse, asserts, to report errors. We work almost exclusively in .Net here so from my perspective, the decision is clear -- use exceptions. The framework only reports errors using exceptions. That alone should end the argument. Why introduce a second mechanism?&lt;/p&gt;  &lt;p&gt;The two most frequent arguments I get for not using exceptions are:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Exceptions will cause the program to crash if they're not handled &lt;/li&gt;    &lt;li&gt;Exceptions make my code ugly &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The question to ask yourself is, "If the method can not honor its contract, should it report the error?" I think most people would agree the method should report any errors that prevent it from completing its mission. If you have a method that says it's going to open a file for reading and it can't, by golly it better tell the caller. If you don't agree, you can stop reading now.&lt;/p&gt;  &lt;p&gt;Seriously, if your method can't complete it's mission after exhausting all means, then it has to report the problem. Ok, maybe we're in agreement so far. Where the friction begins is how to report the error. Some say to log it and move on. Others say use an assert and test your code. Some like error return codes.&lt;/p&gt;  &lt;p&gt;Logging is nice from the perspective that it allows you to see what happened after the fact. But it does not allow your program to respond to the error since it doesn't know what happened.&lt;/p&gt;  &lt;p&gt;Asserts seem like a nice option. The theory is that the programmer will see the issue during testing and fix it on the spot. From my own experience, it simply doesn't happen and you end-up hitting OK twenty times just to get your program started. Never mind they do nothing in release mode and of course the caller doesn't get told about the error.&lt;/p&gt;  &lt;p&gt;Return codes at least allow the caller to check for errors. Of course if the caller forgets to check, the error goes undiscovered. And then there's the matter of the codes themselves. They have to be documented to know what they mean. Anyone remember programming using native Win32 API's? The same error code meant something different depending on what component was called. No thank you.&lt;/p&gt;  &lt;p&gt;Furthermore, other than logging, none of these mechanism's give you rich error reporting. A stack trace and additional information can be contained an Exception (a .Net exception at least) which is invaluable when trying to diagnose a problem.&lt;/p&gt;  &lt;p&gt;Exceptions (again I'm talking .Net exceptions) allow (actually force) the caller to take action. And in addition, specifics of the problem can be captured in the exception itself. &lt;/p&gt;  &lt;p&gt;Still there's that issue of unhandled exceptions crashing your program. Guess what? That's a good thing! Your program has failed to operate as designed and cannot handle the error. What other choice do you really have? I write medical software and I can tell you that a program crash is preferred (not desired, just preferred) to reporting the wrong information to the doctor. A crash results in a service call. Reporting the wrong data results in a regulatory action from the FDA.&lt;/p&gt;  &lt;p&gt;The ugly argument is even more amusing but also easier to understand. Bracketing your code with try/catch/finally statements does interrupt the flow of your code visually. And it requires more typing which for far too many people in this business is still a chore because they don't touch type. Still, once they start dealing with methods that raise exceptions, they grudgingly give in because there is no other choice for handling exceptions. End of argument, almost.&lt;/p&gt;  &lt;p&gt;For some reason, I run into code every day where the parameters are not validated. Isn't this like programming 101? Check your inputs and never trust that they are valid until proven. One programmer told me he doesn't do it because of the ugliness factor. Really.&lt;/p&gt;  &lt;p&gt;I have to admit that parameter checking is tedious and can munge-up the code a bit. For example:&lt;/p&gt;  &lt;div&gt;   &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; SomeMethod(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; name, &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;)
{
  &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.IsNullOrEmpty(name))
  {
    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (name == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)
      &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ArgumentNullException(&lt;span style="color: #006080"&gt;"name"&lt;/span&gt;);
    &lt;span style="color: #0000ff"&gt;else&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ArgumentException(&lt;span style="color: #006080"&gt;"name"&lt;/span&gt;);
  }

  &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;value&lt;/span&gt; == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)
    &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ArguementNullException(&lt;span style="color: #006080"&gt;"value"&lt;/span&gt;);

  &lt;span style="color: #008000"&gt;// code here...&lt;/span&gt;
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Checking strings is especially tedious because usually null or empty is invalid. For a long time, I coded it up like below which is a bit more compact.&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; SomeMethod(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; name, &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;)
{
  &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.IsNullOrEmpty(name))
  {
    &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; (name == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)
      ? &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ArgumentNullException(&lt;span style="color: #006080"&gt;"name"&lt;/span&gt;)
      : &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ArgumentException(&lt;span style="color: #006080"&gt;"name"&lt;/span&gt;)
  }

  &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;value&lt;/span&gt; == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)
    &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ArgumentNullException(&lt;span style="color: #006080"&gt;"value"&lt;/span&gt;);
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Not much better but it does compact down to fewer lines if you put the &lt;em&gt;throw () ?:&lt;/em&gt; statement on the same line.&lt;/p&gt;

&lt;p&gt;For my own code, I try to check every parameter every time and yes I find all this typing tedious and it does make the code noisy (if not ugly). To combat this problem, I wrote some static methods that handle most of the parameter checking I normally do. They reduce parameter checking to a single line of code. Here's an example:&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; SomeMethod(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; name, &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;)
{
  Throw.IfNullOrEmpty(name, &lt;span style="color: #006080"&gt;"name"&lt;/span&gt;);
  Throw.IfNull(&lt;span style="color: #0000ff"&gt;value&lt;/span&gt;, &lt;span style="color: #006080"&gt;"value"&lt;/span&gt;);

  &lt;span style="color: #008000"&gt;// code here&lt;/span&gt;
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Nothing magically here. Throw is a static class with methods that encapsulate the error handling code. The name of the argument is passed in for better error reporting but is optional. For the truly lazy, you could do the following:&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; SomeMethod(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; name, &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;)
{
  Throw.IfNullOrEmpty(name);
  Throw.IfNull(&lt;span style="color: #0000ff"&gt;value&lt;/span&gt;);

  &lt;span style="color: #008000"&gt;// code here&lt;/span&gt;
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;I think anyone reading the above code for the first time would readily understand what &lt;em&gt;Throw.IfNull()&lt;/em&gt; means. Ok, so less typing, clearer meaning and consistent reporting. Not a bad deal.&lt;/p&gt;

&lt;p&gt;The Throw class has the following static methods which should be self-explanatory.&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; IfNull&lt;T&gt;(T &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;)
&lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; IfNull&lt;T&gt;(T &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; name)
&lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; IfNullOrEmpty(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;)
&lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; IfNullOrEmpty(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; name)
&lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; IfNotEqual&lt;T&gt;(T &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;, T compareTo) &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; T : IComparable&lt;T&gt;
&lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; IfNotEqual&lt;T&gt;(T &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;, T compareTo, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; name) &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; T : IComparable&lt;T&gt;
&lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; IfLessThan&lt;T&gt;(T &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;, T max) &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; T : IComparable&lt;T&gt;
&lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; IfLessThan&lt;T&gt;(T &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;, T max, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; name) &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; T : IComparable&lt;T&gt;
&lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; IfLessThanOrEqual&lt;T&gt;(T &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;, T max) &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; T : IComparable&lt;T&gt;
&lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; IfLessThanOrEqual&lt;T&gt;(T &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;, T max, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; name) &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; T : IComparable&lt;T&gt;
&lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; IfGreaterThan&lt;T&gt;(T &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;, T min) &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; T : IComparable&lt;T&gt;
&lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; IfGreaterThan&lt;T&gt;(T &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;, T min, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; name) &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; T : IComparable&lt;T&gt;
&lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; IfGreaterThanOrEqual&lt;T&gt;(T &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;, T min) &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; T : IComparable&lt;T&gt;
&lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; IfGreaterThanOrEqual&lt;T&gt;(T &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;, T min, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; name) &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; T : IComparable&lt;T&gt;
&lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; IfOutOfRangeInclusive&lt;T&gt;(T &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;, T min, T max) &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; T : IComparable&lt;T&gt;
&lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; IfOutOfRangeInclusive&lt;T&gt;(T &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;, T min, T max, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; name) &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; T : IComparable&lt;T&gt;
&lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; IfOutOfRangeExclusive&lt;T&gt;(T &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;, T min, T max) &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; T : IComparable&lt;T&gt;
&lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; IfOutOfRangeExclusive&lt;T&gt;(T &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;, T min, T max, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; name) &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; T : IComparable&lt;T&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;It's worth spending just a few moments on the Throw class itself to discuss some of the issues I encountered. Lets just look at the IfNull methods first.&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Throw
{
    &lt;span style="color: #0000ff"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; NULL = &lt;span style="color: #006080"&gt;"NULL"&lt;/span&gt;;

    &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; IfNull&lt;T&gt;(T &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;)
    {
        Throw.IfNull(&lt;span style="color: #0000ff"&gt;value&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;);
    }

    &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; IfNull&lt;T&gt;(T &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; name)
    {
        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;value&lt;/span&gt; == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)
        {
            &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ArgumentNullException(name ?? NULL);
        }
    }
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;First notice that although the class is not generic, the methods are generic. C# allows you to use generic methods independent of whether the class is generic. Very handy in this instance. But why use generics here? After all, you can compare "null" with any CLR object. The answer is boxing.&lt;/p&gt;

&lt;p&gt;Boxing is what the compiler does when it passes a value type to a method that requires a reference type. Essentially, the compiler "wraps" the value type in a object. There's some overhead to doing this. By using generics, the overhead problem of boxing is eliminated. The same goes for all the other methods in this class.&lt;/p&gt;

&lt;p&gt;But wait, how can value types be null? In general they can't unless you're using something called a &lt;em&gt;Nullable&lt;/em&gt; ype. This was introduced in .Net 2.0 and in C# using the weird "int? x = 1" syntax.&lt;/p&gt;

&lt;p&gt;While you won't check if an &lt;em&gt;int&lt;/em&gt; is null, you should do range checking to see if the value is what is expected. The range checking classes of course check if their parameters are null so again to avoid boxing, the IfNull() methods are generic.&lt;/p&gt;

&lt;p&gt;Another favorite of mine you might not be familiar with is the &lt;em&gt;null coalescing operator&lt;/em&gt; (??). The ?? operator returns the left-hand operand if it is not null, or else it returns the right-hand operand. Makes for a nice concise syntax.&lt;/p&gt;

&lt;p&gt;The code and numerous unit tests are available from the downloads page.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blueonionsoftware.com/images/blog/ToThrowornottoThrowthatisthequestion_96D3/image.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="484" alt="image" src="http://blueonionsoftware.com/images/blog/ToThrowornottoThrowthatisthequestion_96D3/image_thumb.png" width="626" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;I built this using VS 2008 but as far as know you should be able to include this class in a VS 2005 project.&lt;/p&gt;
      &lt;p&gt;powered by &lt;a href="http://blueonionsoftware.com/bloget.aspx"&gt;Bloget&amp;trade;&lt;/a&gt; - &lt;i&gt;"One File, One
        Binary, One Blog"&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/blueonionsoftware?a=CvES7k"&gt;&lt;img src="http://feeds.feedburner.com/~a/blueonionsoftware?i=CvES7k" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/blueonionsoftware?a=J9yiHI"&gt;&lt;img src="http://feeds.feedburner.com/~f/blueonionsoftware?i=J9yiHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/blueonionsoftware?a=ruA3UI"&gt;&lt;img src="http://feeds.feedburner.com/~f/blueonionsoftware?i=ruA3UI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/blueonionsoftware?a=H2aCYi"&gt;&lt;img src="http://feeds.feedburner.com/~f/blueonionsoftware?i=H2aCYi" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blueonionsoftware/~4/315553736" height="1" width="1"/&gt;</description>
      <category>.Net</category>
      <category>C#</category>
      <category>Programming</category>
    <feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=blueonionsoftware&amp;itemurl=http%3A%2F%2Fblueonionsoftware.com%2Fblog.aspx%3Fp%3Db5b9e553-3e10-40ae-9f59-e38f1c50e2d6</feedburner:awareness><feedburner:origLink>http://blueonionsoftware.com/blog.aspx?p=b5b9e553-3e10-40ae-9f59-e38f1c50e2d6</feedburner:origLink></item>
    <item>
      <title>FreeSnap 1.3 and Desk Drive in the Wild</title>
      <pubDate>Tue, 17 Jun 2008 13:33:18 GMT</pubDate>
      <link>http://feeds.feedburner.com/~r/blueonionsoftware/~3/313798280/blog.aspx</link>
      <guid isPermaLink="false">8b0d5700-4559-474e-8552-3d55b3f6841d</guid>
      <author>mike@blueonionsoftware.com</author>
      <description>&lt;p&gt;&lt;a href="http://www.soft82.com/"&gt;&lt;img style="margin: 0px 0px 0px 20px" height="88" alt="Free download software" src="http://www.soft82.com/images/awards/soft82_award_88x88.gif" width="88" align="right" border="0" /&gt;&lt;/a&gt;It's been about a week now since I released version 1.3 of FreeSnap. Haven't heard a peep out of anyone as to problems. Guess I must be writing perfect code :). Really folks, I'm curious if the multi-monitor support is working out for you so drop me a line. &lt;/p&gt;  &lt;p&gt;Some download sites have picked up on my changes. Soft82 rated &lt;a href="http://www.soft82.com/download/windows/freesnap/" target="_blank"&gt;FreeSnap&lt;/a&gt; 5 stars. &lt;a href="http://www.downloadtube.com/Windows/System-Utilities/FreeSnap-download.html" target="_blank"&gt;Downloadtube.com&lt;/a&gt; gave it a 9 out of 10 and added the following comment.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;A really great little tool, also free, that allows you to move and resize the windows only with your keypad.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I've been tossing around an idea of adding task switching to FreeSnap. My problem with most task switchers is that they are modal. Most either pop-up a window with some type of a view of the current running tasks or aim for an Expose type experience (Expose is the Mac form of task switching). My thought is that task switching should do just that, switch to the next task. No fancy pop-ups, no shrinking the windows, no graying the screen. Just pick the next window in the sequence and activate it. Appreciate any feedback.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blueonionsoftware.com/deskdrive.aspx" target="_blank"&gt;Desk Drive&lt;/a&gt; activity has been off the charts (at least for me). There was something like 20,000 downloads last week. Interestingly, the majority of those came from Japan. Not bad for a non-localized program. By the way, it could be localized if someone wanted to take the time. There's only like half-a-dozen strings in it.&lt;/p&gt;  &lt;p&gt;One final note. I would really appreciate it if you would subscribe to this blog. The larger subscriber numbers help in attracting quality advertisers and keeps me motivated.&lt;/p&gt;
      &lt;p&gt;powered by &lt;a href="http://blueonionsoftware.com/bloget.aspx"&gt;Bloget&amp;trade;&lt;/a&gt; - &lt;i&gt;"One File, One
        Binary, One Blog"&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/blueonionsoftware?a=U3Kevr"&gt;&lt;img src="http://feeds.feedburner.com/~a/blueonionsoftware?i=U3Kevr" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/blueonionsoftware?a=0bJJ9I"&gt;&lt;img src="http://feeds.feedburner.com/~f/blueonionsoftware?i=0bJJ9I" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/blueonionsoftware?a=aRCIxI"&gt;&lt;img src="http://feeds.feedburner.com/~f/blueonionsoftware?i=aRCIxI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/blueonionsoftware?a=4aXRZi"&gt;&lt;img src="http://feeds.feedburner.com/~f/blueonionsoftware?i=4aXRZi" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blueonionsoftware/~4/313798280" height="1" width="1"/&gt;</description>
      <category>Freebies</category>
    <feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=blueonionsoftware&amp;itemurl=http%3A%2F%2Fblueonionsoftware.com%2Fblog.aspx%3Fp%3D8b0d5700-4559-474e-8552-3d55b3f6841d</feedburner:awareness><feedburner:origLink>http://blueonionsoftware.com/blog.aspx?p=8b0d5700-4559-474e-8552-3d55b3f6841d</feedburner:origLink></item>
    <item>
      <title>WCF timings with different bindings</title>
      <pubDate>Mon, 16 Jun 2008 20:16:46 GMT</pubDate>
      <link>http://feeds.feedburner.com/~r/blueonionsoftware/~3/313274233/blog.aspx</link>
      <guid isPermaLink="false">8ddfdace-e0ec-4045-b50b-f005206e6185</guid>
      <author>mike@blueonionsoftware.com</author>
      <description>&lt;p&gt;I was curious how WCF timings compared using different transport bindings. Here's what I came up with:&lt;/p&gt;  &lt;p&gt; &lt;/p&gt; &lt;code&gt;Buffered    &lt;br /&gt;--------     &lt;br /&gt;WSHttpBinding       : time=00:00:00.7206547, length=11520054     &lt;br /&gt;NetTcpBinding       : time=00:00:00.5371746, length=11520054     &lt;p&gt;&lt;/p&gt;    &lt;p&gt;&lt;code&gt;Streaming        &lt;br /&gt;---------         &lt;br /&gt;BasicHttpBinding    : time=00:00:00.9087755, length=11520054         &lt;br /&gt;NetTcpBinding       : time=00:00:01.8869526, length=11520054 &lt;/code&gt;&lt;/p&gt;    &lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;---------        &lt;br /&gt;NetBIOS             : time=00:00:00.9174436, length=11520054&lt;/code&gt; &lt;/p&gt;    &lt;p&gt; &lt;/p&gt;    &lt;p&gt;The test measured how long it took to get an 11MB image file from a remote server. This is not what one would call a definitive test. However, I think the results are interesting enough to share.&lt;/p&gt;    &lt;p&gt;The "Buffered" test retrieves the image file as a byte array. The streaming tests return a stream which is used in a loop to read the file in 16K chunks. And finally, the NetBIOS test is nothing more the opening the same file as a share and reading all the bytes into an array.&lt;/p&gt;    &lt;p&gt;Now I don't know about you, but I would have expected the NetBIOS time to be fastest here. Apparently, NetBIOS is not all the efficient. What's a real surprise is streaming with NetTcpBinding. I ran the test quite a few times and streaming NetTcpBinding always came in dead last. Again, not what I would have expected.&lt;/p&gt;    &lt;p&gt;All bindings were set not to use security. The hosting server was else where on our local LAN.&lt;/p&gt;    &lt;p&gt;Are these numbers in line with what others have found? &lt;/p&gt;
      &lt;p&gt;powered by &lt;a href="http://blueonionsoftware.com/bloget.aspx"&gt;Bloget&amp;trade;&lt;/a&gt; - &lt;i&gt;"One File, One
        Binary, One Blog"&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/blueonionsoftware?a=Hrg1Io"&gt;&lt;img src="http://feeds.feedburner.com/~a/blueonionsoftware?i=Hrg1Io" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/blueonionsoftware?a=9QcBUI"&gt;&lt;img src="http://feeds.feedburner.com/~f/blueonionsoftware?i=9QcBUI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/blueonionsoftware?a=NZkE8I"&gt;&lt;img src="http://feeds.feedburner.com/~f/blueonionsoftware?i=NZkE8I" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/blueonionsoftware?a=jLAJxi"&gt;&lt;img src="http://feeds.feedburner.com/~f/blueonionsoftware?i=jLAJxi" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blueonionsoftware/~4/313274233" height="1" width="1"/&gt;</description>
      <category>.Net</category>
    <feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=blueonionsoftware&amp;itemurl=http%3A%2F%2Fblueonionsoftware.com%2Fblog.aspx%3Fp%3D8ddfdace-e0ec-4045-b50b-f005206e6185</feedburner:awareness><feedburner:origLink>http://blueonionsoftware.com/blog.aspx?p=8ddfdace-e0ec-4045-b50b-f005206e6185</feedburner:origLink></item>
  <feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetFeedData?uri=blueonionsoftware</feedburner:awareness></channel>
</rss>
