<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>The Nuclear Bunny Blog</title>
	<atom:link href="http://blog.nuclearbunny.org/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.nuclearbunny.org</link>
	<description>Blah, blah, blah...</description>
	<lastBuildDate>Thu, 15 Jul 2010 04:45:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>2010 Ride the Rockies</title>
		<link>http://blog.nuclearbunny.org/2010/07/14/2010-ride-the-rockies/</link>
		<comments>http://blog.nuclearbunny.org/2010/07/14/2010-ride-the-rockies/#comments</comments>
		<pubDate>Thu, 15 Jul 2010 04:42:16 +0000</pubDate>
		<dc:creator>chadwick</dc:creator>
				<category><![CDATA[Cycling]]></category>
		<category><![CDATA[Sports]]></category>

		<guid isPermaLink="false">http://blog.nuclearbunny.org/?p=621</guid>
		<description><![CDATA[From June 13th through 19th I rode in the 25th anniversary edition of the Ride the Rockies bike tour. I had planned on doing either this ride or the Bicycle Tour of Colorado again, but since I made it past the lottery for Ride the Rockies I picked that one for a slightly different experience. [...]]]></description>
			<content:encoded><![CDATA[<p>From June 13th through 19th I rode in the 25th anniversary edition of the <a href="http://www.ridetherockies.com/" target="_blank">Ride the Rockies</a> bike tour. I had planned on doing either this ride or the <a href="http://www.bicycletourcolorado.com/" target="_blank">Bicycle Tour of Colorado</a> again, but since I made it past the lottery for Ride the Rockies I picked that one for a slightly different experience. I had briefly flirted with the idea of doing both rides back-to-back, but was talked out of that after realizing how difficult it would be to enjoy both weeks with such high fatigue levels.</p>
<p>One immediate difference between the Ride the Rockies and what I did last year was the route. Last year, I rode a loop, which made the logistics of travel a little bit easier. This year, it was a point-to-point ride from Grand Junction to Salida. Neither town is easy to get to, and while I had originally planned on driving, the logistics of getting both my bike and myself back to where my car would be parked would be annoying.</p>
<p>The ride organizers contracted a bus service that could be purchased from the various towns, but since for your bike to be transported you would have to disassemble and box it anyway, I decided to just save the time and effort and fly myself and ship my bike. I like driving, but the thought of driving through west Texas <em>again</em> just to get to Colorado is never fun.</p>
<p>This was the first time I had ever disassembled a bike and had it shipped. I first purchased one of the more popular hard-case luggage boxes for the bike but it didn&#8217;t fit my frame. I decided in the end to just use the cardboard box method and it worked out fine, although there&#8217;s a little bit of wear and tear on the bike from the experience.</p>
<h1><strong>Training</strong></h1>
<p>Unlike <a href="http://blog.nuclearbunny.org/2009/07/02/2009-bicycle-tour-of-colorado/">2009</a>, I knew coming into 2010 that I was going to ride either Ride the Rockies or the Bicycle Tour of Colorado again. I put in significantly more time and effort into training prior to this year&#8217;s event compared to last year. Instead of just under 1,000 miles of cycling from January through June in 2009, I managed to put in 2,500. Instead of just riding with no real plan in mind, I used a <a href="http://www.trainright.com/" target="_blank">professional coach</a> this year to correctly manage my workout, recovery and nutrition efforts before the ride. And last, but not least, I purchased a new bike with better gearing and a lighter frame to improve climbing potential.</p>
<p>My coach also talked me into buying a <a href="http://cycleops.com/products/power-meters.html" target="_blank">power meter</a> for the bike early on in the training season. I had read about the benefits of training with a power meter for years, but the high price, and the knowledge that I only race occasionally, had kept me from buying one. In the end I gave in, and it really did help make my training time more efficient and beneficial.</p>
<p>One of the biggest changes with my training plan, versus the previous years when I had no real plan, was both the frequency of training rides and the intervals within them. In most years, I would only ride on the weekend and maybe one ride in the middle of a week. This season, it was pretty consistently 5 times a week.</p>
<p>Interval training is how you improve your performance, strength and speed in any endurance sport, and cycling is no different. With the power meter, my coach was able to tell where my weaknesses were and tailor my training program based upon that data and the goal of my season (the tour!).</p>
<p>For me, that meant a lot of tempo intervals &#8211; slower cadence rides at moderate power levels that help build slow-twitch muscle strength. Since I tended to ride at high cadences, I found myself relatively weak at these lower cadences for any long duration rides. The tempo intervals paid off big-time here.</p>
<p>The other big focus was on climbing repeat intervals where I would ride just under my lactate threshold at a moderate cadence to simulate a long, steady hill climb. These proved pretty difficult for me. When I would ride in Austin, TX, the hills were both too short and too steep for me to stay in the proper power range. In the Houston area, well, there are no hills, so your best approach is to just use a very large gear and ride into the wind to sort-of simulate the effort it would take to do a long climb. Frankly, it&#8217;s not anywhere close to what a real climb is like. Regardless, these climbs did do a lot to improve sustained strength on the longer climbs I had coming up.</p>
<h1>The Ride</h1>
<h2>Day 1 &#8211; Colorado National Monument</h2>
<p>Our first day was a short ride through the <a href="http://www.nps.gov/colm/index.htm" target="_blank">Colorado National Monument</a> just outside Grand Junction. The monument is an amazing place to take in the canyons of the great southwest. I had never been to the monument before, so being able to see it for the first time on a bicycle was quite a joy.</p>
<p><img class="alignleft" style="margin: 2px; border: 1px solid black;" title="Colorado National Monument" src="http://farm5.static.flickr.com/4019/4696377653_1b94331df8.jpg" alt="" width="500" height="375" /></p>
<p>We entered the monument from its south entrance and then stayed on Rim Rock Drive until leaving on the north side of the monument and returning to <a href="http://www.mesastate.edu/" target="_blank">Mesa State College</a>.</p>
<p>The steepness of the climb surprised me, since the elevation profile didn&#8217;t look bad at all from the ride book. Over 44 miles we climbed (and then descended) 4,200 ft. It took me just under 3.5 hours, including breaks and sight-seeing. Energy was 1,688 kJ &amp; TSS was 184.</p>
<p>I left about an hour before most of the attendees did for this ride and it turned out to be a very good idea. When I got back to town there was a light rain storm, but up at the monument it was a heavy hail and lightning storm. There were lots of very wet and cold riders when the main group began to return to town.</p>
<p>I talked with some Grand Junction locals during the afternoon who said the monument was a weekly ride ritual for them. That would not get old.</p>
<h2>Day 2 &#8211; Grand Junction to Delta via Grand Mesa</h2>
<p>Day 2 was the hardest day of the tour on paper, and proved to be on the road, too. Oddly enough, during last year&#8217;s Bicycle Tour of Colorado, we also rode up Grand Mesa but that year we started from the south side of the mountain, whereas this year we started on the north side. I&#8217;ve heard locals say that riding from the south side is more difficult.</p>
<p><img class="alignright" style="margin: 2px; border: 1px solid black;" title="Looking towards the Land's End region of Grand Mesa" src="http://farm5.static.flickr.com/4018/4718951859_243d3cd36c.jpg" alt="" width="500" height="375" />Now, ultimately, this is just one tough mountain to climb. From either side you&#8217;re looking at 6,000 ft of climbing over 20 solid miles. If you&#8217;re a flat-lander like me, you have the additional disadvantage of not yet having any acclimation to altitude to contend with.</p>
<p>Unlike my 2009 climb up Grand Mesa, 2010 was quite a bit easier. The training and gearing paid off, and we had cooler, cloudier weather to contend with. That weather actually turned out to be a disadvantage on the descent, where a rainstorm kicked up and I rode over 10 miles at high speed with heavy rain and sleet &#8211; ouch!</p>
<p><img class="alignleft" style="margin: 2px; border: 1px solid black;" title="Chad at the Grand Mesa Summit" src="http://farm5.static.flickr.com/4064/4719599946_c33d7bb6eb_m.jpg" alt="" width="240" height="180" />At the summit of the climb, the logistical skills of the Ride the Rockies crew really shined. There were plenty of supplies and food vendors ready for us, and no shortage of food and drinks. They even had a motor coach idling a the top with its heaters on, so riders could go inside and warm up nicely &#8211; it was about 38 degrees F at the top when I arrived.</p>
<p>Overall the ride took me a whopping 8 hours and 20 minutes, with just under 7 hours of actual riding time to cover 94 miles. I did 3,578 kJ and my TSS was 350.9 with right at 8,000 ft of total climbing. That&#8217;s a big ride!</p>
<h2>Day 3 &#8211; Delta to Ouray</h2>
<p>Day 3 was assumed to be a nice easy day for us to recover. At only 67 miles and with a nice gentle slope up to the town of Ouray, it didn&#8217;t look like a rough ride. We were in for a surprise, though, as the route we took from Delta to bypass the main highway to Montrose was some of the roughest roads I&#8217;ve ever ridden on. It was incredibly jarring and annoying, especially after being rather worn-out from day 2.</p>
<p><img class="alignright" style="margin: 2px; border: 1px solid black;" title="Riding towards Ouray and the San Juan Mountains Beyond" src="http://farm5.static.flickr.com/4015/4719600840_e6f24482db.jpg" alt="" width="500" height="375" />Luckily, the scenery made up for the road quality. While not very dramatic, the farms and ranches along the route were gorgeous and as we got closer to Ouray, we began to see the San Juan Mountains in the distance &#8211; our destination for day 4.</p>
<p>Day&#8217;s 3 ride took 6 hours 34 minutes, with just under 5 hours of actual riding time to cover 67 miles. I did 2,375 kJ of work and my TSS was 208 with just 4,000 ft of total climbing.</p>
<p>Arriving into Ouray was a real treat in itself. I had never been to this tiny mountain town, and it was amazing how gorgeous it really was. The local businesses did a bang up job hosting and it was a great place to have lots of beer and food.</p>
<h2><strong>Day 4 &#8211; Ouray to Durango via Red Mountain Pass, Molas Pass and Coal Bank Pass</strong></h2>
<p><img class="alignleft" style="margin: 2px; border: 1px solid black;" title="Chad climbing Red Mountain Pass" src="http://farm5.static.flickr.com/4142/4743969172_9412856cfd_m.jpg" alt="" width="160" height="240" /></p>
<p>I expected day 4 to be everyone&#8217;s favorite of the entire tour, and I was not disappointed. The day began with a climb up to Red Mountain Pass immediately upon leaving the town of Ouray &#8211; no warm-up here! Literally before we made it six blocks and to the end of town we were climbing on a steep grade.</p>
<p>The ride up Red Mountain Pass was, simply put, stunning. The road is narrow, winding, and steep. Halfway up the climb to Red Mountain Pass was the first aid station of the day. So far in the tour I hadn&#8217;t been stopping this early, but today I was tired enough after the initial climb to take an early break and have a big breakfast.</p>
<p>The break was worth it, as the rest of the climb to the summit of Red Mountain Pass was a tough, but incredibly gorgeous, climb. After the summit was a fast, winding descent into the town of Silverton.</p>
<p>After Silverton, the second big climb of the day started immediately &#8211; the climb up to Molas Pass. This was my favorite climb of the entire tour as the scenery of this part of the San Juan Mountains is hard to beat.</p>
<p><img class="alignright" style="margin: 2px; border: 1px solid black;" title="Looking at the San Juan Mountains from the summit of Molas Pass" src="http://farm5.static.flickr.com/4058/4719604926_394eb870bb.jpg" alt="" width="500" height="375" /></p>
<p>Molas Pass was a good spot for a rest, with a short climb to Coal Bank Pass to follow. The climb up Coal Bank pass continued to be incredibly scenic and afterwards everyone knew the climbs were done for the day and all we had was a 35 mile descent into Durango.</p>
<p>As soon as I started the descent off Coal Bank Pass I had my first safety incident of the tour. At about 40 mph a female elk darted out in front of me from the side of the road. I braked hard &#8211; too hard and the rear wheel locked up and started to skid. Luckily I let go of the brake immediately and my bike corrected. Even though I was only yards away from hitting the elk, she moved across fast enough that I could have avoided her even if I hadn&#8217;t braked. That said, the adrenaline rush from that little experience stuck with me for a while and I took the rest of the descent into the Purgatory area a little bit easier than I would have otherwise.</p>
<p>It turns out the descent into Durango wasn&#8217;t as easy as we had been expecting. We had a strong headwind to contend with and the increased heat of the afternoon as we exited the high mountains. I screwed up and wore a long sleeved jersey on the day, which was great until the last 20 miles. At that point, not only could I not remove my sleeves to keep cool, I also found my sunscreen had given up and I lost my spare tube somewhere during my descent. Luckily one of the riding medics loaned me some of her sunscreen so I covered up a bit, but regardless I was still rather toasty.</p>
<p>The last few miles in Durango proper were a bit of a surprise, at least if you haven&#8217;t ridden in the area before. Rather than being straight down into town, there was a very steep short climb to go up from the valley where Durango proper is to reach the top of the mesa were <a href="http://explore.fortlewis.edu/" target="_blank">Fort Lewis College</a> is. As minor as that climb was, by that time of day I was spent and was just looking forward to getting off the bike, finding some food and taking a cold shower.</p>
<p>The best part of being in Durango was that I knew some of the good restaurants in town and found one of my favorite sushi restaurants. What a treat after a long, hot day in the beautiful San Juans.</p>
<p>Day 4&#8242;s ride took me just under 9 hours elapsed time with 7 hours on the bike itself to cover just 75 miles. I did 3,068 kJ of work and had a TSS of 294 with 7,818 ft of elevation gain.</p>
<h2>Day 5 &#8211; Durango to Pagosa Springs</h2>
<p>But not for me! I decided to take a tactical rest day on day 5, despite the promise of an easy day. The route was a long 87 miles, but with only 2 short climbs. In retrospect I probably would have been fine to ride it, but I wanted to be fully rested for day 6.</p>
<p>I took one of the motor coaches to the next town and had the entire day for R&amp;R in Pagosa Springs. The hot springs there were a great treat and the warm waters made my muscles feel better, even though it probably was not the best thing for recovery. Nor was all the beer probably the best idea either, but it hit the spot regardless.</p>
<p>Disaster almost struck today as my helmet was not attached to my bike when I went to go check on my bike before getting ready for bed. I foolishly had my helmet attached to the bike when I handed it off to the luggage truck folks before boarding the motor coach for my ride into town. And since I checked too late in the day, all of the local vendors that might have sold helmets were closed already, as was the information tent with the lost &amp; found.</p>
<p>The next morning I was assuming I would likely have to take the bus again since I didn&#8217;t have a helmet, but one of the folks working the luggage trucks in the morning was kind enough to loan me his helmet for the day. Random kindness from strangers saved my bacon!</p>
<h2>Day 6 &#8211; Pagosa Springs to Alamosa via Wolf Creek Pass</h2>
<p>Day 6 started with a climb up Wolf Creek Pass on US160 &#8211; one of my favorite passes to drive over in a car, especially if you take the side road off the pass onto the mountain top once you reach the summit of the pass. The true climb was only 8 miles total, but we had a 16 mile warm-up climb that slowly took us up the 700 ft or so before the true climb begin. Since aid station 1 was right at the base of the climb, it was a perfect spot to take a rest and grab a nice breakfast.</p>
<p><img class="alignleft" style="margin: 2px; border: 1px solid black;" title="Halfway up Wolf Creek Pass" src="http://farm5.static.flickr.com/4027/4719609060_272cb56d50.jpg" alt="" width="500" height="375" />Wolf Creek pass is a gorgeous climb and a moderately difficult 6.5% grade the whole way up. Halfway up there was a bit of a distraction as a tractor-trailer had rolled itself in a tight corner and almost plowed off the side of the pass. That slowed us down a bit as the road went down to one-lane and we had to intermix with road traffic a bit more than we otherwise would be.</p>
<p>The summit of Wolf Creek Pass is a bit anti-climatic as its rather flat and wide with no dramatic views. The side-road going up to the top of the mountain is gravel, so a no-go on a road bike. So, after a quick resupply, it was time for the very long descent off the pass and into Alamosa.</p>
<p>The descent off Wolf Creek Pass proved to be one of the more dangerous ones of the whole tour as there were several crashes reported later on in the press. I almost did myself in by swatting at a bee that landed on my knee rather than keeping both hands on my handlebars &#8211; moving your arms quickly at 45 mph is not the best way to keep your bike stable. Luckily I corrected myself just in time before entering one of the larger tunnels that you go through on the descent.</p>
<p>US160 turns from a northeasterly direction to a southeasterly direction between the towns of South Fork and Del Norte. For us, that meant exposing ourselves to a pretty rough crosswind about the same time the valley opened up for the trip into Alamosa. The ride from Del Norte into Alamosa was the toughest, or at least most uncomfortable, part of my entire tour as my body could just not get comfortable on the bike and my riding form wasn&#8217;t good as a result. Crosswinds take even more out of you than headwinds as they can be rather dangerous when gusty and make it harder to hold a steady tempo pace.</p>
<p>Day 6 took me a total of 7 hours 17 minutes with 6 hours 18 minutes on the bike to cover 92 miles. I did 2,909 kJ of work and my TSS was 270 with 5,000 ft of total elevation gain.</p>
<h2>Day 7 &#8211; Alamosa to Pagosa Springs</h2>
<p>The final day of the tour turned out to be one of the most fun, thanks largely to Mother Nature cooperating with favorable wind conditions. We road north from Alamosa up to the San Luis Valley to Pocha Pass before descending into Salida.</p>
<p><img class="alignright" style="margin: 2px; border: 1px solid black;" title="Sangre de Cristo Mountains as seen from Villa Grove" src="http://farm5.static.flickr.com/4049/4718962333_a4cfa65174.jpg" alt="" width="500" height="375" />What is amazing about this route is just how incredibly flat the road is. For the first 40 miles we gained 30 ft &#8211; yes, 30. With a tailwind, this meant nice, fast speeds of over 20 mph even while soft pedaling, and over 25 mph with a little bit of effort.</p>
<p>Once the valley began to narrow and we began to ascend towards Pocha Pass, we added only 1,600 ft of elevation gain over the next 20 miles. The climb up Poncha Pass from the south is amazing in that you don&#8217;t really feel like you are going up a mountain pass at all. Once you begin your descent, however, it is a totally different story.</p>
<p>The descent off Poncha Pass into Salida was a nice, steep grade to keep the speeds up. I hit my top speed of any of the descents during the tour right at 50 mph, or 80 kph.</p>
<p>Day 7 took me 5 hours 27 minutes total time, with 4 hours 22 minutes on the bike. I did 2,171 kJ of work with a TSS of 178 and 1,753 ft of total elevation gain over 85 miles.</p>
<p>Once in Salida, it was time to disassemble and box up my bike, find a cold shower and hot food, and then wait for the bus that returned me to Denver for my plane ride home the next morning.</p>
<h1>Reflections</h1>
<p><span style="text-decoration: underline;">On the tour</span>: The Ride the Rockies organizers are very professional and the overall smoothness of the tour reflects it. Everything wasn&#8217;t perfect, but it was very well done. My only real complaint would be the over-reliance on third-party vendors at aid stations. That meant no key supplies like sunscreen, etc. at most of the aid stations. For the most part, this is a non-issue, until you&#8217;re That Guy that forgot to bring some that day and forgot to make a quick stop at a connivence store along the route to get one. Don&#8217;t be That Guy!</p>
<p>I do also wish the ride had organized ways to drop off some of your extra clothing at aid stations and have it returned to you at the next nightly camp. The Bicycle Tour of Colorado folks did this in 2009 and for some of the big mountain pass days it made perfect sense &#8211; you would need a lot of warm clothing for the first half of the day, but the second half you were hot and needed to get rid of some of that bulk.</p>
<p><span style="text-decoration: underline;">On the route</span>: It was awesome. They certainly made it difficult, and I thought they should have thrown in a rest day in the middle. But in hindsight, it was so easy to take your own rest day, and the majority of people did ride all 7 days, so clearly while the route was hard, it was not too hard. From having done two tours in Colorado now, somewhere between 450 and 550 miles does seem like the right amount for a week-long tour.</p>
<p><span style="text-decoration: underline;">On the equipment</span>: My new bike was awesome. The frame was lighter and more comfortable than my previous bike, and the compact gearing with the 11-28 cassette made climbing the big, steep hills a lot easier for a flatlander like me. I could have done the ride with standard gearing and an 11-25 cassette, but my knees would not be thanking me now.</p>
<p>And the power meter? For something that you totally don&#8217;t <em>need</em>, it&#8217;s totally worth having. But then I&#8217;m a data junkie so my perspective might be a bit skewed.</p>
<p>I also avoided carrying extra equipment with me this year &#8211; no camelback backpack for holding extra clothes, etc. &#8211; everything went into my jersey pockets. I just made sure I bought jerseys with big enough pockets and it worked out just fine. I even managed to carry my rain gear almost the entire tour except on days with no chance of rain.</p>
<p><span style="text-decoration: underline;">On coaching</span>: Totally worth the price. Yes, you can self-coach, and yes, once you know what coaching is all about,  it&#8217;s more likely that you could self-coach and be effective. But the information and insight I gained, along with the planning of my training season to match my priorities, was easily worth the price. If I had tried to do this myself again, I would have not ridden as much total volume, nor would I have utilized the build-up and recovery cycles effectively and would have not been in peak condition for the tour.</p>
<h2>Ride Your Bike</h2>
<p>If you haven&#8217;t done a long bike tour yet, especially somewhere in the mountains, put it on your list. If you like to ride, there is something really special about being out on the bike for a solid week of riding. The event itself will be amazing, and if you properly train for it that effort will be life-changing all on its own.</p>
<p>All of the pictures I took on the ride are on my flickr page here: <a href="http://www.flickr.com/photos/26521676@N00/sets/72157624320722734/show/" target="_blank">http://www.flickr.com/photos/26521676@N00/sets/72157624320722734/show/</a></p>



Share and Enjoy:


	<a rel="nofollow"  href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fblog.nuclearbunny.org%2F2010%2F07%2F14%2F2010-ride-the-rockies%2F&amp;title=2010%20Ride%20the%20Rockies&amp;bodytext=From%20June%2013th%20through%2019th%20I%20rode%20in%20the%2025th%20anniversary%20edition%20of%20the%20Ride%20the%20Rockies%20bike%20tour.%20I%20had%20planned%20on%20doing%20either%20this%20ride%20or%20the%20Bicycle%20Tour%20of%20Colorado%20again%2C%20but%20since%20I%20made%20it%20past%20the%20lottery%20for%20Ride%20the%20Rockies%20I%20picked%20th" title="Digg"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fblog.nuclearbunny.org%2F2010%2F07%2F14%2F2010-ride-the-rockies%2F&amp;title=2010%20Ride%20the%20Rockies" title="StumbleUpon"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://delicious.com/post?url=http%3A%2F%2Fblog.nuclearbunny.org%2F2010%2F07%2F14%2F2010-ride-the-rockies%2F&amp;title=2010%20Ride%20the%20Rockies&amp;notes=From%20June%2013th%20through%2019th%20I%20rode%20in%20the%2025th%20anniversary%20edition%20of%20the%20Ride%20the%20Rockies%20bike%20tour.%20I%20had%20planned%20on%20doing%20either%20this%20ride%20or%20the%20Bicycle%20Tour%20of%20Colorado%20again%2C%20but%20since%20I%20made%20it%20past%20the%20lottery%20for%20Ride%20the%20Rockies%20I%20picked%20th" title="del.icio.us"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fblog.nuclearbunny.org%2F2010%2F07%2F14%2F2010-ride-the-rockies%2F&amp;title=2010%20Ride%20the%20Rockies&amp;annotation=From%20June%2013th%20through%2019th%20I%20rode%20in%20the%2025th%20anniversary%20edition%20of%20the%20Ride%20the%20Rockies%20bike%20tour.%20I%20had%20planned%20on%20doing%20either%20this%20ride%20or%20the%20Bicycle%20Tour%20of%20Colorado%20again%2C%20but%20since%20I%20made%20it%20past%20the%20lottery%20for%20Ride%20the%20Rockies%20I%20picked%20th" title="Google Bookmarks"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.facebook.com/share.php?u=http%3A%2F%2Fblog.nuclearbunny.org%2F2010%2F07%2F14%2F2010-ride-the-rockies%2F&amp;t=2010%20Ride%20the%20Rockies" title="Facebook"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blog.nuclearbunny.org/2010/07/14/2010-ride-the-rockies/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>You Don&#8217;t Need Flash for Rich Graphs on a Web Page</title>
		<link>http://blog.nuclearbunny.org/2010/04/11/you-dont-need-flash-for-rich-graphs-on-a-web-page/</link>
		<comments>http://blog.nuclearbunny.org/2010/04/11/you-dont-need-flash-for-rich-graphs-on-a-web-page/#comments</comments>
		<pubDate>Sun, 11 Apr 2010 21:35:33 +0000</pubDate>
		<dc:creator>chadwick</dc:creator>
				<category><![CDATA[Jobs]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Zenoss]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[graphs]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[ria]]></category>

		<guid isPermaLink="false">http://blog.nuclearbunny.org/?p=593</guid>
		<description><![CDATA[Adobe&#8217;s Flash has a lot of uses, but one of the most impressive to me has been the the creation of interactive graphs on a web page. One just has to visit Google Finance to see a great example of this in action; it&#8217;s fast, effective and fits seemlessly within the rest of the page. [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.adobe.com/flashplatform/">Adobe&#8217;s Flash</a> has a lot of uses, but one of the most impressive to me has been the the creation of interactive graphs  on a web page. One just has to visit <a href="http://www.google.com/finance?q=NASDAQ:GOOG" target="_blank">Google Finance</a> to see a great example of this in action; it&#8217;s fast, effective and fits seemlessly within the rest of the page.</p>
<p>Many times, however, Flash isn&#8217;t an appropriate technology to use. If you&#8217;re an open-source product like Zenoss, Flash presents a licensing issue. If you&#8217;re targeting mobile platforms like the <a href="http://www.apple.com/iphone/">iPhone</a>, Flash isn&#8217;t available. And, sometimes, you may just not like Flash; it does have it&#8217;s own security problems and overhead, for example. What&#8217;s a web developer to do? Enter HTML5 to the rescue&#8230;</p>
<p><a href="http://en.wikipedia.org/wiki/Html5" target="_blank">HTML5</a> is not yet an approved standard, but it&#8217;s well on its way and surprisingly well-supported by the browser community already. One of the nice new features provided in HTML5 is the <a href="http://en.wikipedia.org/wiki/Canvas_element" target="_blank">canvas element</a> which allows for two-dimensional drawing functionality. Between this new feature and JavaScript, we should be able to create a rich graph display.</p>
<p>To get started, we&#8217;ll first need to create an HTML document that has the structure we&#8217;re after and a place for our drawing canvas to reside.</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
  &lt;head&gt;
    &lt;title&gt;Rich Graph Example using HTML5's Canvas Element&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;h1&gt;Rich Graph Example using HTML5's Canvas Element&lt;/h1&gt;
    &lt;canvas id=&quot;graph1&quot; width=&quot;500&quot; height=&quot;200&quot;&gt;
      This text is displayed if your browser sucks.
    &lt;/canvas&gt;
  &lt;/body&gt;
&lt;/html&gt;</pre></div></div>

<p>Next, we&#8217;ll need some JavaScript to do the work of creating the actual graph display. First, we&#8217;ll need to get a reference to the canvas DOM element and then ask it for it&#8217;s 2D drawing context:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">    <span style="color: #003366; font-weight: bold;">var</span> graph1 <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'graph1'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #003366; font-weight: bold;">var</span> context <span style="color: #339933;">=</span> graph1.<span style="color: #660066;">getContext</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'2d'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Next, we&#8217;ll need to define the raw data used to display the graph. We&#8217;re going to assume a set of CPU processor time measurements with 5-minute measurement intervals, much like you would see in <a href="http://www.zenoss.com/">Zenoss</a> or other systems management application.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">    <span style="color: #006600; font-style: italic;">// Raw data, such as what might come back from a server query.</span>
    data <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span>
      <span style="color: #009900;">&#123;</span> value<span style="color: #339933;">:</span> <span style="color: #CC0000;">9.9430</span><span style="color: #339933;">,</span> time<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">new</span> Date<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">2010</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">4</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">9</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">7</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">50</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
      <span style="color: #009900;">&#123;</span> value<span style="color: #339933;">:</span> <span style="color: #CC0000;">0.0000</span><span style="color: #339933;">,</span> time<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">new</span> Date<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">2010</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">4</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">9</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">7</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">55</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
      <span style="color: #009900;">&#123;</span> value<span style="color: #339933;">:</span> <span style="color: #CC0000;">0.0000</span><span style="color: #339933;">,</span> time<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">new</span> Date<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">2010</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">4</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">9</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">8</span><span style="color: #339933;">,</span> 00<span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
      <span style="color: #009900;">&#123;</span> value<span style="color: #339933;">:</span> <span style="color: #CC0000;">0.0000</span><span style="color: #339933;">,</span> time<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">new</span> Date<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">2010</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">4</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">9</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">8</span><span style="color: #339933;">,</span> 05<span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
      <span style="color: #009900;">&#123;</span> value<span style="color: #339933;">:</span> <span style="color: #CC0000;">5.5828</span><span style="color: #339933;">,</span> time<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">new</span> Date<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">2010</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">4</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">9</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">8</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">10</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
      <span style="color: #009900;">&#123;</span> value<span style="color: #339933;">:</span> <span style="color: #CC0000;">1.0000</span><span style="color: #339933;">,</span> time<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">new</span> Date<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">2010</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">4</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">9</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">8</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">15</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
      <span style="color: #009900;">&#123;</span> value<span style="color: #339933;">:</span> <span style="color: #CC0000;">25.3120</span><span style="color: #339933;">,</span> time<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">new</span> Date<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">2010</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">4</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">9</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">8</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">20</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
      <span style="color: #009900;">&#123;</span> value<span style="color: #339933;">:</span> <span style="color: #CC0000;">45.8210</span><span style="color: #339933;">,</span> time<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">new</span> Date<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">2010</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">4</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">9</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">8</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">25</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
      <span style="color: #009900;">&#123;</span> value<span style="color: #339933;">:</span> <span style="color: #CC0000;">98.3211</span><span style="color: #339933;">,</span> time<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">new</span> Date<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">2010</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">4</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">9</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">8</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">30</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
      <span style="color: #009900;">&#123;</span> value<span style="color: #339933;">:</span> <span style="color: #CC0000;">96.1290</span><span style="color: #339933;">,</span> time<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">new</span> Date<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">2010</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">4</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">9</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">8</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">35</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
      <span style="color: #009900;">&#123;</span> value<span style="color: #339933;">:</span> <span style="color: #CC0000;">94.9128</span><span style="color: #339933;">,</span> time<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">new</span> Date<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">2010</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">4</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">9</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">8</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">40</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
      <span style="color: #009900;">&#123;</span> value<span style="color: #339933;">:</span> <span style="color: #CC0000;">98.3219</span><span style="color: #339933;">,</span> time<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">new</span> Date<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">2010</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">4</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">9</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">8</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">45</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
      <span style="color: #009900;">&#123;</span> value<span style="color: #339933;">:</span> <span style="color: #CC0000;">32.4912</span><span style="color: #339933;">,</span> time<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">new</span> Date<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">2010</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">4</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">9</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">8</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">50</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
    <span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// Calculate the maximums in the provided data.</span>
    <span style="color: #003366; font-weight: bold;">var</span> maxY <span style="color: #339933;">=</span> <span style="color: #CC0000;">0.0</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> data.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      maxY <span style="color: #339933;">=</span> Math.<span style="color: #660066;">max</span><span style="color: #009900;">&#40;</span>data<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">value</span><span style="color: #339933;">,</span> maxY<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #003366; font-weight: bold;">var</span> dataMaxY <span style="color: #339933;">=</span> Math.<span style="color: #660066;">ceil</span><span style="color: #009900;">&#40;</span>maxY<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #003366; font-weight: bold;">var</span> dataMaxX <span style="color: #339933;">=</span> data.<span style="color: #660066;">length</span><span style="color: #339933;">;</span></pre></div></div>

<p>Now, we have to calculate where we can start drawing on the canvas and how many pixels equal one coordinate in our user space data. The more elaborate legends we&#8217;ll want to use on the graph, the more these calculations will matter as we leave space for drawing text around the actual graph.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">    <span style="color: #006600; font-style: italic;">// define a font to use for legends</span>
    <span style="color: #003366; font-weight: bold;">var</span> fontHeight <span style="color: #339933;">=</span> <span style="color: #CC0000;">20</span><span style="color: #339933;">;</span>
    <span style="color: #003366; font-weight: bold;">var</span> font <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;12px/20px arial, sans-serif&quot;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #003366; font-weight: bold;">var</span> xStart <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
    <span style="color: #003366; font-weight: bold;">var</span> yStart <span style="color: #339933;">=</span> fontHeight <span style="color: #339933;">*</span> <span style="color: #CC0000;">2</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// leave room for 2 lines of text at the bottom</span>
    <span style="color: #003366; font-weight: bold;">var</span> xEnd <span style="color: #339933;">=</span> graph1.<span style="color: #660066;">width</span><span style="color: #339933;">;</span>
    <span style="color: #003366; font-weight: bold;">var</span> yEnd <span style="color: #339933;">=</span> graph1.<span style="color: #660066;">height</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// Determine how many pixel units equal one user space coordinate.</span>
    <span style="color: #003366; font-weight: bold;">var</span> xStep <span style="color: #339933;">=</span> dataMaxX <span style="color: #339933;">/</span> <span style="color: #009900;">&#40;</span>xEnd <span style="color: #339933;">-</span> xStart<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #003366; font-weight: bold;">var</span> yStep <span style="color: #339933;">=</span> dataMaxY <span style="color: #339933;">/</span> <span style="color: #009900;">&#40;</span>yEnd <span style="color: #339933;">-</span> yStart<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// Create an array of 2D points to represent the user space</span>
    <span style="color: #006600; font-style: italic;">// coordinates of each data item.</span>
    points <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Array<span style="color: #009900;">&#40;</span>data.<span style="color: #660066;">length</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> data.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #003366; font-weight: bold;">var</span> x <span style="color: #339933;">=</span> i <span style="color: #339933;">/</span> xStep <span style="color: #339933;">+</span> xStart<span style="color: #339933;">;</span>
      <span style="color: #003366; font-weight: bold;">var</span> y <span style="color: #339933;">=</span> data<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">value</span> <span style="color: #339933;">/</span> yStep <span style="color: #339933;">+</span> yStart<span style="color: #339933;">;</span>
      points<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span> x<span style="color: #339933;">:</span> x<span style="color: #339933;">,</span> y<span style="color: #339933;">:</span> y <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span></pre></div></div>

<p>Now we get to the actual drawing of the graph. This is straight-forward 2D drawing that should be familiar to anyone who has done it with other technology.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">    <span style="color: #006600; font-style: italic;">// Save the graphics context before we begin mucking with it.</span>
    context.<span style="color: #660066;">save</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// Create a transform so that the graph portion of the chart can be</span>
    <span style="color: #006600; font-style: italic;">// drawn using a bottom-left origin instead of the default upper-left.</span>
    context.<span style="color: #660066;">translate</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> yEnd<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    context.<span style="color: #660066;">scale</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">1.0</span><span style="color: #339933;">,</span> <span style="color: #339933;">-</span><span style="color: #CC0000;">1.0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// Draw our path using the appropriate color.</span>
    context.<span style="color: #660066;">beginPath</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    context.<span style="color: #660066;">strokeStyle</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'black'</span><span style="color: #339933;">;</span>
    context.<span style="color: #660066;">lineWidth</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">5</span><span style="color: #339933;">;</span>
    context.<span style="color: #660066;">moveTo</span><span style="color: #009900;">&#40;</span>points<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">x</span><span style="color: #339933;">,</span> points<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">y</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> points.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      context.<span style="color: #660066;">lineTo</span><span style="color: #009900;">&#40;</span>points<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">x</span><span style="color: #339933;">,</span> points<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">y</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    context.<span style="color: #660066;">stroke</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    context.<span style="color: #660066;">restore</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>At this stage, we can render a simple line-graph using JavaScript and an HTML5 canvas element. Now about making it rich and interactive? We&#8217;ll need to add some mouse event handling. We&#8217;ll do something simple here: as the mouse moves along the x-axis of the graph we&#8217;ll find the current data point based solely on its x-position. This technique is more useful to an end-user and saves the calculation of finding how close a point is to a line segment.</p>
<p>Mouse events are still rather browser specific, so the calculations presented here to determine the offset of the mouse inside of the canvas are simplified and will not work in all scenarios.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">    graph1.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'mousemove'</span><span style="color: #339933;">,</span> mouseWatcher<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #003366; font-weight: bold;">function</span> mouseWatcher<span style="color: #009900;">&#40;</span>evt<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #006600; font-style: italic;">// Get the mouse position relative to the canvas element. This stuff</span>
      <span style="color: #006600; font-style: italic;">// is still gnarly across browsers. Here we're assuming we need to</span>
      <span style="color: #006600; font-style: italic;">// figure out the offset the canvas has in the client area, so our</span>
      <span style="color: #006600; font-style: italic;">// mouse position is really relative to the canvas, not the client area.</span>
      <span style="color: #003366; font-weight: bold;">var</span> x <span style="color: #339933;">=</span> graph1.<span style="color: #660066;">offsetLeft</span> <span style="color: #339933;">+</span> evt.<span style="color: #660066;">clientX</span><span style="color: #339933;">;</span>
      <span style="color: #003366; font-weight: bold;">var</span> y <span style="color: #339933;">=</span> graph1.<span style="color: #660066;">height</span> <span style="color: #339933;">+</span> graph1.<span style="color: #660066;">offsetTop</span> <span style="color: #339933;">-</span> evt.<span style="color: #660066;">clientY</span><span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #006600; font-style: italic;">// Get the data point at this X position</span>
      <span style="color: #003366; font-weight: bold;">var</span> foundPoint <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
      <span style="color: #003366; font-weight: bold;">var</span> x1 <span style="color: #339933;">=</span> points<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">x</span><span style="color: #339933;">;</span>
      <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> points.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003366; font-weight: bold;">var</span> x2 <span style="color: #339933;">=</span> points<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">x</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>x <span style="color: #339933;">&gt;=</span> x1 <span style="color: #339933;">&amp;&amp;</span> x <span style="color: #339933;">&lt;=</span> x2<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
          foundPoint <span style="color: #339933;">=</span> i<span style="color: #339933;">-</span><span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
          <span style="color: #000066; font-weight: bold;">break</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
      <span style="color: #009900;">&#125;</span>
&nbsp;
      <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>foundPoint <span style="color: #339933;">&gt;=</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        txt <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;&quot;</span> <span style="color: #339933;">+</span> data<span style="color: #009900;">&#91;</span>foundPoint<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">value</span>.<span style="color: #660066;">toFixed</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">&quot; @ &quot;</span> <span style="color: #339933;">+</span> data<span style="color: #009900;">&#91;</span>foundPoint<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">time</span>.<span style="color: #660066;">toDateString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #006600; font-style: italic;">// draw a new information line in the legend</span>
        context.<span style="color: #660066;">save</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        context.<span style="color: #660066;">font</span> <span style="color: #339933;">=</span> font<span style="color: #339933;">;</span>
        context.<span style="color: #660066;">clearRect</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> yEnd <span style="color: #339933;">-</span> fontHeight<span style="color: #339933;">,</span> xEnd<span style="color: #339933;">,</span> fontHeight<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        context.<span style="color: #660066;">fillText</span><span style="color: #009900;">&#40;</span>txt<span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> yEnd<span style="color: #339933;">,</span> xEnd<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        context.<span style="color: #660066;">restore</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span></pre></div></div>

<p>And that&#8217;s it. Over your Sunday morning coffee you can write a simple, yet effective, interactive graph display using HTML and JavaScript alone. Clearly, a tremendous amount of work remains to make the graphs beautiful and robust, but luckily a large number of people are already working on libraries to do this work for us.</p>
<p>Internet Explorer will not yet display canvas elements natively, but luckily this problem is being <a href="http://blog.vlad1.com/2008/07/30/no-browser-left-behind/">solved</a> for us.</p>
<p>There are other problems, too. Today, for example, the font measurement abilities in the HTML5 specification are lacking.</p>
<p>If you want to see the example in action click <a href='http://blog.nuclearbunny.org/wp-content/uploads/2010/04/canvas-graphs.html'>here.</a> View the source in your browser to see the final source code to the example. A screenshot of the example is below.</p>
<p><a href="http://blog.nuclearbunny.org/wp-content/uploads/2010/04/Screen-shot-2010-04-11-at-16.44.55.png"><img src="http://blog.nuclearbunny.org/wp-content/uploads/2010/04/Screen-shot-2010-04-11-at-16.44.55.png" alt="" title="Screen shot of graph" width="666" height="277" class="aligncenter size-full wp-image-616" /></a></p>



Share and Enjoy:


	<a rel="nofollow"  href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fblog.nuclearbunny.org%2F2010%2F04%2F11%2Fyou-dont-need-flash-for-rich-graphs-on-a-web-page%2F&amp;title=You%20Don%27t%20Need%20Flash%20for%20Rich%20Graphs%20on%20a%20Web%20Page&amp;bodytext=Adobe%27s%20Flash%20has%20a%20lot%20of%20uses%2C%20but%20one%20of%20the%20most%20impressive%20to%20me%20has%20been%20the%20the%20creation%20of%20interactive%20graphs%20%20on%20a%20web%20page.%20One%20just%20has%20to%20visit%20Google%20Finance%20to%20see%20a%20great%20example%20of%20this%20in%20action%3B%20it%27s%20fast%2C%20effective%20and%20fits%20seemles" title="Digg"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fblog.nuclearbunny.org%2F2010%2F04%2F11%2Fyou-dont-need-flash-for-rich-graphs-on-a-web-page%2F&amp;title=You%20Don%27t%20Need%20Flash%20for%20Rich%20Graphs%20on%20a%20Web%20Page" title="StumbleUpon"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://delicious.com/post?url=http%3A%2F%2Fblog.nuclearbunny.org%2F2010%2F04%2F11%2Fyou-dont-need-flash-for-rich-graphs-on-a-web-page%2F&amp;title=You%20Don%27t%20Need%20Flash%20for%20Rich%20Graphs%20on%20a%20Web%20Page&amp;notes=Adobe%27s%20Flash%20has%20a%20lot%20of%20uses%2C%20but%20one%20of%20the%20most%20impressive%20to%20me%20has%20been%20the%20the%20creation%20of%20interactive%20graphs%20%20on%20a%20web%20page.%20One%20just%20has%20to%20visit%20Google%20Finance%20to%20see%20a%20great%20example%20of%20this%20in%20action%3B%20it%27s%20fast%2C%20effective%20and%20fits%20seemles" title="del.icio.us"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fblog.nuclearbunny.org%2F2010%2F04%2F11%2Fyou-dont-need-flash-for-rich-graphs-on-a-web-page%2F&amp;title=You%20Don%27t%20Need%20Flash%20for%20Rich%20Graphs%20on%20a%20Web%20Page&amp;annotation=Adobe%27s%20Flash%20has%20a%20lot%20of%20uses%2C%20but%20one%20of%20the%20most%20impressive%20to%20me%20has%20been%20the%20the%20creation%20of%20interactive%20graphs%20%20on%20a%20web%20page.%20One%20just%20has%20to%20visit%20Google%20Finance%20to%20see%20a%20great%20example%20of%20this%20in%20action%3B%20it%27s%20fast%2C%20effective%20and%20fits%20seemles" title="Google Bookmarks"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.facebook.com/share.php?u=http%3A%2F%2Fblog.nuclearbunny.org%2F2010%2F04%2F11%2Fyou-dont-need-flash-for-rich-graphs-on-a-web-page%2F&amp;t=You%20Don%27t%20Need%20Flash%20for%20Rich%20Graphs%20on%20a%20Web%20Page" title="Facebook"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blog.nuclearbunny.org/2010/04/11/you-dont-need-flash-for-rich-graphs-on-a-web-page/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>An Early iPad Review</title>
		<link>http://blog.nuclearbunny.org/2010/04/05/an-early-ipad-review/</link>
		<comments>http://blog.nuclearbunny.org/2010/04/05/an-early-ipad-review/#comments</comments>
		<pubDate>Tue, 06 Apr 2010 01:33:11 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[iPad]]></category>

		<guid isPermaLink="false">http://blog.nuclearbunny.org/2010/04/05/an-early-ipad-review/</guid>
		<description><![CDATA[I&#8217;ve been using the iPad heavily for 2 days now. There is an awful lot of potential in this device, ands there is no doubt that the best is yet to come. If you are already an iPhone user, the iPad will simultaneously feel familiar but also so incredibly rich and powerful compared to it&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been using the iPad heavily for 2 days now. There is an awful lot of potential in this device, ands there is no doubt that the best is yet to come. </p>
<p>If you are already an iPhone user, the iPad will simultaneously feel familiar but also so incredibly rich and powerful compared to it&#8217;s little brother. The extra screen real estate is in itself nice, but more importantly is how the iPhone OS&#8217;s approach to user interaction makes use of this extra room. </p>
<p>For example, the Mail app shows each message in full screen glory, but with a fast overlay window to show message and folder navigation. The usability effect is wonderful. Using Safari is now like browsing on a regular computer, except with a multi-touch interface. </p>
<p>I don&#8217;t play very many games on the iPhone or iPad, but the Words With Friends game (think Scrabble) is almost worth getting an iPad for just to play it. I suspect the casual gaming crowd I&#8217;ll a have a lot to look forward to with their new toy. </p>
<p>Battery life on the iPad has been better than I expected. A little over 48 hour into ownership and I&#8217;m down to 10% battery life. I&#8217;ve used it a lot, including a lot of reading, so it seems to hold up well there. While it does not compare to the extra long battery life of a Kindle, the device does so much more it seems like a good trade-off. </p>
<p>As far as being an e-reader, I like the iPad better than the Kindle DX (that I normally read from), but not as much as the regular Kindle 2. That device is sized so well, and the battery life is so good, it&#8217;s easy to see it remaining the king of its segment for a while. That said, I am a guy, so i like big screens, and here the iPad wins over the DX. The iPad is a touch heavier, but it still feels natural to hold. A minor, but very nice feature in the iPad is the physical orientation lock button, something which the DX has as a software feature that is hard to use. </p>
<p>I plan on using my iPad as a replacement for my laptop for casual computing. It seems like it is going to do that job well. They keyboard is easy enough to use even for this blog entry, and the heavy writers out there may find the keyboard dock option even better than lugging around a laptop. </p>



Share and Enjoy:


	<a rel="nofollow"  href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fblog.nuclearbunny.org%2F2010%2F04%2F05%2Fan-early-ipad-review%2F&amp;title=An%20Early%20iPad%20Review&amp;bodytext=I%27ve%20been%20using%20the%20iPad%20heavily%20for%202%20days%20now.%20There%20is%20an%20awful%20lot%20of%20potential%20in%20this%20device%2C%20ands%20there%20is%20no%20doubt%20that%20the%20best%20is%20yet%20to%20come.%20%0A%0AIf%20you%20are%20already%20an%20iPhone%20user%2C%20the%20iPad%20will%20simultaneously%20feel%20familiar%20but%20also%20so%20incre" title="Digg"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fblog.nuclearbunny.org%2F2010%2F04%2F05%2Fan-early-ipad-review%2F&amp;title=An%20Early%20iPad%20Review" title="StumbleUpon"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://delicious.com/post?url=http%3A%2F%2Fblog.nuclearbunny.org%2F2010%2F04%2F05%2Fan-early-ipad-review%2F&amp;title=An%20Early%20iPad%20Review&amp;notes=I%27ve%20been%20using%20the%20iPad%20heavily%20for%202%20days%20now.%20There%20is%20an%20awful%20lot%20of%20potential%20in%20this%20device%2C%20ands%20there%20is%20no%20doubt%20that%20the%20best%20is%20yet%20to%20come.%20%0A%0AIf%20you%20are%20already%20an%20iPhone%20user%2C%20the%20iPad%20will%20simultaneously%20feel%20familiar%20but%20also%20so%20incre" title="del.icio.us"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fblog.nuclearbunny.org%2F2010%2F04%2F05%2Fan-early-ipad-review%2F&amp;title=An%20Early%20iPad%20Review&amp;annotation=I%27ve%20been%20using%20the%20iPad%20heavily%20for%202%20days%20now.%20There%20is%20an%20awful%20lot%20of%20potential%20in%20this%20device%2C%20ands%20there%20is%20no%20doubt%20that%20the%20best%20is%20yet%20to%20come.%20%0A%0AIf%20you%20are%20already%20an%20iPhone%20user%2C%20the%20iPad%20will%20simultaneously%20feel%20familiar%20but%20also%20so%20incre" title="Google Bookmarks"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.facebook.com/share.php?u=http%3A%2F%2Fblog.nuclearbunny.org%2F2010%2F04%2F05%2Fan-early-ipad-review%2F&amp;t=An%20Early%20iPad%20Review" title="Facebook"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blog.nuclearbunny.org/2010/04/05/an-early-ipad-review/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lightning Quick Summary of the Houston Auto Show</title>
		<link>http://blog.nuclearbunny.org/2010/01/31/lightning-summary-of-the-houston-auto-show/</link>
		<comments>http://blog.nuclearbunny.org/2010/01/31/lightning-summary-of-the-houston-auto-show/#comments</comments>
		<pubDate>Sun, 31 Jan 2010 17:08:03 +0000</pubDate>
		<dc:creator>chadwick</dc:creator>
				<category><![CDATA[Cars]]></category>
		<category><![CDATA[Reviews]]></category>

		<guid isPermaLink="false">http://blog.nuclearbunny.org/?p=589</guid>
		<description><![CDATA[New BMW 5-series Gran Turismo = stunner, inside &#38; out. Was happy to see roof-rack slots are back for the 5-series (presumably the new sedan out later this year will have them as well). BMW 7-series = nicer than the previous generation, also quite surprised to see roof-rack slots in for this model. All Audis [...]]]></description>
			<content:encoded><![CDATA[<p>New BMW 5-series Gran Turismo = stunner, inside &amp; out. Was happy to see roof-rack slots are back for the 5-series (presumably the new sedan out later this year will have them as well).</p>
<p>BMW 7-series = nicer than the previous generation, also quite surprised to see roof-rack slots in for this model.</p>
<p>All Audis = beautiful design on the exterior, meh on the inside. You can do better, Audi&#8230; make me feel like I&#8217;m giving up something if I go buy a BMW.</p>
<p>Cadillac CTS, CTS-V and CTS SportWagon = much nicer than I expected. Exterior is sharp, interior is nicely done and about on par with the BMW 3-series as it should be. CTS-V is slightly nicer on the inside.</p>
<p>New Camaro = too bad they kept the name, because eventually this car will be in every trailer park making the new ones look horrible. Extremely well done car, inside &amp; out. Back-seat only for midgets and a large trunk with one of the smallest hatches I&#8217;ve ever seen on a car. Totally not practical, but totally awesome. Even the V6 version looks good.</p>
<p>New Grand Sport version of the Corvette = much, much sharper looking in person than I expected. Tempting, tempting&#8230;</p>
<p>New Mercedes-Benz E-Class sedan &amp; coupe = absolutely gorgeous on the outside and a total letdown on the inside. Not even as nice as a BMW 3-series, let alone a 5-series. These were the E-350 versions, so hopefully the V8 and AMG versions will remedy some of that. Having a total display floor size of an average size guest bedroom doesn&#8217;t help showing off the cars.</p>
<p>All Acuras = couldn&#8217;t be more boring if they tried. Interiors remind me of cheap GM cars from the early 90s. Exteriors only a boy racer wanna-be could love. The new ZDX was interesting but had rear-doors that would make you yearn for the spaciousness of a Camaro.</p>



Share and Enjoy:


	<a rel="nofollow"  href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fblog.nuclearbunny.org%2F2010%2F01%2F31%2Flightning-summary-of-the-houston-auto-show%2F&amp;title=Lightning%20Quick%20Summary%20of%20the%20Houston%20Auto%20Show&amp;bodytext=New%20BMW%205-series%20Gran%20Turismo%20%3D%20stunner%2C%20inside%20%26amp%3B%20out.%20Was%20happy%20to%20see%20roof-rack%20slots%20are%20back%20for%20the%205-series%20%28presumably%20the%20new%20sedan%20out%20later%20this%20year%20will%20have%20them%20as%20well%29.%0D%0A%0D%0ABMW%207-series%20%3D%20nicer%20than%20the%20previous%20generation%2C%20also%20qu" title="Digg"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fblog.nuclearbunny.org%2F2010%2F01%2F31%2Flightning-summary-of-the-houston-auto-show%2F&amp;title=Lightning%20Quick%20Summary%20of%20the%20Houston%20Auto%20Show" title="StumbleUpon"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://delicious.com/post?url=http%3A%2F%2Fblog.nuclearbunny.org%2F2010%2F01%2F31%2Flightning-summary-of-the-houston-auto-show%2F&amp;title=Lightning%20Quick%20Summary%20of%20the%20Houston%20Auto%20Show&amp;notes=New%20BMW%205-series%20Gran%20Turismo%20%3D%20stunner%2C%20inside%20%26amp%3B%20out.%20Was%20happy%20to%20see%20roof-rack%20slots%20are%20back%20for%20the%205-series%20%28presumably%20the%20new%20sedan%20out%20later%20this%20year%20will%20have%20them%20as%20well%29.%0D%0A%0D%0ABMW%207-series%20%3D%20nicer%20than%20the%20previous%20generation%2C%20also%20qu" title="del.icio.us"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fblog.nuclearbunny.org%2F2010%2F01%2F31%2Flightning-summary-of-the-houston-auto-show%2F&amp;title=Lightning%20Quick%20Summary%20of%20the%20Houston%20Auto%20Show&amp;annotation=New%20BMW%205-series%20Gran%20Turismo%20%3D%20stunner%2C%20inside%20%26amp%3B%20out.%20Was%20happy%20to%20see%20roof-rack%20slots%20are%20back%20for%20the%205-series%20%28presumably%20the%20new%20sedan%20out%20later%20this%20year%20will%20have%20them%20as%20well%29.%0D%0A%0D%0ABMW%207-series%20%3D%20nicer%20than%20the%20previous%20generation%2C%20also%20qu" title="Google Bookmarks"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.facebook.com/share.php?u=http%3A%2F%2Fblog.nuclearbunny.org%2F2010%2F01%2F31%2Flightning-summary-of-the-houston-auto-show%2F&amp;t=Lightning%20Quick%20Summary%20of%20the%20Houston%20Auto%20Show" title="Facebook"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blog.nuclearbunny.org/2010/01/31/lightning-summary-of-the-houston-auto-show/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Year of Motion</title>
		<link>http://blog.nuclearbunny.org/2009/12/31/a-year-of-motion/</link>
		<comments>http://blog.nuclearbunny.org/2009/12/31/a-year-of-motion/#comments</comments>
		<pubDate>Fri, 01 Jan 2010 02:46:52 +0000</pubDate>
		<dc:creator>chadwick</dc:creator>
				<category><![CDATA[Cars]]></category>
		<category><![CDATA[Cycling]]></category>
		<category><![CDATA[Sports]]></category>

		<guid isPermaLink="false">http://blog.nuclearbunny.org/?p=586</guid>
		<description><![CDATA[The end of the year is always a good time for reflection. One of the things I always do is look at how much time and distance I&#8217;ve spent in a car or on a bicycle. 2009 was a record year for riding in a cars at just over 21,000 miles, just over my previous [...]]]></description>
			<content:encoded><![CDATA[<p>The end of the year is always a good time for reflection. One of the things I always do is look at how much time and distance I&#8217;ve spent in a car or on a bicycle.</p>
<p>2009 was a record year for riding in a cars at just over 21,000 miles, just over my previous record driving year of 2008 which was around 19,000 miles.</p>
<p>On the bicycles, I only managed 2,000 miles, significantly less than my 2008 peak of 2,700 miles.</p>



Share and Enjoy:


	<a rel="nofollow"  href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fblog.nuclearbunny.org%2F2009%2F12%2F31%2Fa-year-of-motion%2F&amp;title=A%20Year%20of%20Motion&amp;bodytext=The%20end%20of%20the%20year%20is%20always%20a%20good%20time%20for%20reflection.%20One%20of%20the%20things%20I%20always%20do%20is%20look%20at%20how%20much%20time%20and%20distance%20I%27ve%20spent%20in%20a%20car%20or%20on%20a%20bicycle.%0D%0A%0D%0A2009%20was%20a%20record%20year%20for%20riding%20in%20a%20cars%20at%20just%20over%2021%2C000%20miles%2C%20just%20over%20my%20" title="Digg"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fblog.nuclearbunny.org%2F2009%2F12%2F31%2Fa-year-of-motion%2F&amp;title=A%20Year%20of%20Motion" title="StumbleUpon"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://delicious.com/post?url=http%3A%2F%2Fblog.nuclearbunny.org%2F2009%2F12%2F31%2Fa-year-of-motion%2F&amp;title=A%20Year%20of%20Motion&amp;notes=The%20end%20of%20the%20year%20is%20always%20a%20good%20time%20for%20reflection.%20One%20of%20the%20things%20I%20always%20do%20is%20look%20at%20how%20much%20time%20and%20distance%20I%27ve%20spent%20in%20a%20car%20or%20on%20a%20bicycle.%0D%0A%0D%0A2009%20was%20a%20record%20year%20for%20riding%20in%20a%20cars%20at%20just%20over%2021%2C000%20miles%2C%20just%20over%20my%20" title="del.icio.us"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fblog.nuclearbunny.org%2F2009%2F12%2F31%2Fa-year-of-motion%2F&amp;title=A%20Year%20of%20Motion&amp;annotation=The%20end%20of%20the%20year%20is%20always%20a%20good%20time%20for%20reflection.%20One%20of%20the%20things%20I%20always%20do%20is%20look%20at%20how%20much%20time%20and%20distance%20I%27ve%20spent%20in%20a%20car%20or%20on%20a%20bicycle.%0D%0A%0D%0A2009%20was%20a%20record%20year%20for%20riding%20in%20a%20cars%20at%20just%20over%2021%2C000%20miles%2C%20just%20over%20my%20" title="Google Bookmarks"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.facebook.com/share.php?u=http%3A%2F%2Fblog.nuclearbunny.org%2F2009%2F12%2F31%2Fa-year-of-motion%2F&amp;t=A%20Year%20of%20Motion" title="Facebook"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blog.nuclearbunny.org/2009/12/31/a-year-of-motion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>My Zenoss Development Environment &#8211; Part 3</title>
		<link>http://blog.nuclearbunny.org/2009/10/22/my-zenoss-development-environment-part-3/</link>
		<comments>http://blog.nuclearbunny.org/2009/10/22/my-zenoss-development-environment-part-3/#comments</comments>
		<pubDate>Thu, 22 Oct 2009 22:01:01 +0000</pubDate>
		<dc:creator>chadwick</dc:creator>
				<category><![CDATA[Jobs]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Zenoss]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://blog.nuclearbunny.org/?p=545</guid>
		<description><![CDATA[In Part 1 of this series we discussed getting an initial Zenoss environment checked out and running on a Mac OS X or Ubuntu system. In Part 2 we discussed how to configure Eclipse to use the Zenoss source. In this part, we&#8217;ll discuss how to handle day-to-day operations such as branch management and working [...]]]></description>
			<content:encoded><![CDATA[<p>In <a href="../2009/10/22/my-zenoss-development-environment-part-1/" target="_blank">Part 1</a> of this series we discussed getting an initial <a href="http://www.zenoss.com/" target="_blank">Zenoss</a> environment checked out and running on a <a href="http://www.apple.com/macosx/" target="_blank">Mac OS X </a>or <a href="http://www.ubuntu.com/" target="_blank">Ubuntu</a> system. In <a href="http://blog.nuclearbunny.org/2009/10/22/my-zenoss-development-environment-part-2/" target="_self">Part 2</a> we discussed how to configure <a href="http://www.eclipse.org/" target="_blank">Eclipse</a> to use the Zenoss source. In this part, we&#8217;ll discuss how to handle day-to-day operations such as branch management and working with multiple versions.</p>
<h2>Branch-Based Development</h2>
<p>At Zenoss we do all development, including bug fixes and small maintenance tasks, in a private development branch within the subversion repository. This allows us to independently work-on changes, check-them into the repository for safe-keeping, and then perform code reviews with team members without having to share files or using <a href="http://pastebin.com/" target="_blank">pastebin</a> style tools (even though we do both at times).</p>
<ol>
<li>Create a branch within your user&#8217;s sandbox. In this example, I&#8217;ve decided to name the sandbox <code>new-widget</code> to identify what I&#8217;m working on. If I were fixing a defect, I&#8217;d use the defect number from the defect tracking system. Create the branch by copying the trunk folder to the sandbox branch. In Subversion this is a low-overhead operation and doesn&#8217;t actually copy files.<code><br />
svn copy http://dev.zenoss.org/svn/trunk http://dev.zenoss.org/svn/sandboxen/cgibbons/new-widget -m " * Copying trunk to sandbox branch."<br />
</code></li>
<li>Switch your working directory to use the new sandbox branch. You can do this either from the command-line or using Eclipse. From the command line, you&#8217;d do the following:<code><br />
cd $HOME/zenoss/core<br />
svn switch http://dev.zenoss.org/svn/sandboxen/cgibbons/new-widget<br />
</code>From within Eclipse, secondary-click on the <code>core</code> project and choose <em>Switch to Another Branch/Tag/Revision&#8230;</em> option from the Team menu. On the dialog that appears, enter in the sandbox URL. After switching, your Eclipse will show the new location next to the core project item.<br />
<a rel="attachment wp-att-549" href="http://blog.nuclearbunny.org/2009/10/22/my-zenoss-development-environment-part-3/picture-8/"><img class="aligncenter size-full wp-image-549" title="svn switch" src="http://blog.nuclearbunny.org/wp-content/uploads/2009/10/Picture-8.png" alt="svn switch" width="670" height="491" /></a></li>
</ol>
<p>Once your development environment has been switched, you can make changes and commit to the Subversion repository as desired. If you&#8217;re unsure if you are in the right branch, you can always use the <code>svn info</code> command to see which directory is being used.</p>
<h2>Merging Branches</h2>
<p>Once you have completed changes in a branch and have had them reviewed by a peer, it is time to merge them into trunk (or another branch, if using a maintenance release). Merging can be tricky, but a consistent process can make it much easier to handle.</p>
<ol>
<li>Change your working directory to a checked-out and clean version of the branch you want to merge into. For example, I keep a <code>$HOME/zenoss/clean-trunk</code> directory that I never make changes to, except for merging.</li>
<li>Determine the base working revision of your working branch. There are a variety of ways to do this, but one of the best is to view the revision log graph within the Trac system directly. For example, for the branch discussed above we can browse to <a href="http://dev.zenoss.org/trac/log/sandboxen/cgibbons/new-widget" target="_blank">http://dev.zenoss.org/trac/log/sandboxen/cgibbons/new-widget/</a> and see that revision <strong>15513</strong> is the base.</li>
<li>Perform a dry-run on the merge to get a general idea of what the changes into the branch will be. You should see your expected changes, plus any conflicts from changes to the other branch while you have been working in the sandbox branch.<code><br />
svn merge --dry-run --revision <strong>15513</strong>:HEAD <strong>http://dev.zenoss.org/svn/sandboxen/cgibbons/new-widget</strong> .<br />
</code></li>
<li>If the merge results look satisfactory, rerun the command without the dry-run argument.</li>
<li>Look at the final merge results using <code>svn status</code> and <code>svn diff</code>, and once you&#8217;re ready, issue an <code>svn commit</code>.</li>
</ol>
<h2>Multiple Branches and Zenoss Configuration</h2>
<p>As you switch between branches you will often render your Zenoss configuration useless.  Resetting your database after each branch switch is usually a good practice, and being able to quickly recreate any test data you may need makes this process less painful.</p>
<p>After switching a branch, my process is usually the following:</p>
<ol>
<li>Shutdown zenoss and restart only zeo.<code><br />
zenoss stop<br />
zeoctl start</code></li>
<li>Run the zenwipe script from the inst source directory.<code><br />
$HOME/zenoss/inst/zenwipe.sh --no-prompt</code></li>
<li>Run <code>zenmigrate</code> to install any database changes available within the current branch.</li>
</ol>
<p>Depending upon the task at hand, I may install additional ZenPacks and add new devices through the command-line if those are needed. Helper scripts, such as <code>install-windows.sh</code> to install of the Windows ZenPacks and create several local test devices in the instance, are useful tools to have for your typical configurations.</p>



Share and Enjoy:


	<a rel="nofollow"  href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fblog.nuclearbunny.org%2F2009%2F10%2F22%2Fmy-zenoss-development-environment-part-3%2F&amp;title=My%20Zenoss%20Development%20Environment%20-%20Part%203&amp;bodytext=In%20Part%201%20of%20this%20series%20we%20discussed%20getting%20an%20initial%20Zenoss%20environment%20checked%20out%20and%20running%20on%20a%20Mac%20OS%20X%20or%20Ubuntu%20system.%20In%20Part%202%20we%20discussed%20how%20to%20configure%20Eclipse%20to%20use%20the%20Zenoss%20source.%20In%20this%20part%2C%20we%27ll%20discuss%20how%20to%20handle%20da" title="Digg"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fblog.nuclearbunny.org%2F2009%2F10%2F22%2Fmy-zenoss-development-environment-part-3%2F&amp;title=My%20Zenoss%20Development%20Environment%20-%20Part%203" title="StumbleUpon"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://delicious.com/post?url=http%3A%2F%2Fblog.nuclearbunny.org%2F2009%2F10%2F22%2Fmy-zenoss-development-environment-part-3%2F&amp;title=My%20Zenoss%20Development%20Environment%20-%20Part%203&amp;notes=In%20Part%201%20of%20this%20series%20we%20discussed%20getting%20an%20initial%20Zenoss%20environment%20checked%20out%20and%20running%20on%20a%20Mac%20OS%20X%20or%20Ubuntu%20system.%20In%20Part%202%20we%20discussed%20how%20to%20configure%20Eclipse%20to%20use%20the%20Zenoss%20source.%20In%20this%20part%2C%20we%27ll%20discuss%20how%20to%20handle%20da" title="del.icio.us"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fblog.nuclearbunny.org%2F2009%2F10%2F22%2Fmy-zenoss-development-environment-part-3%2F&amp;title=My%20Zenoss%20Development%20Environment%20-%20Part%203&amp;annotation=In%20Part%201%20of%20this%20series%20we%20discussed%20getting%20an%20initial%20Zenoss%20environment%20checked%20out%20and%20running%20on%20a%20Mac%20OS%20X%20or%20Ubuntu%20system.%20In%20Part%202%20we%20discussed%20how%20to%20configure%20Eclipse%20to%20use%20the%20Zenoss%20source.%20In%20this%20part%2C%20we%27ll%20discuss%20how%20to%20handle%20da" title="Google Bookmarks"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.facebook.com/share.php?u=http%3A%2F%2Fblog.nuclearbunny.org%2F2009%2F10%2F22%2Fmy-zenoss-development-environment-part-3%2F&amp;t=My%20Zenoss%20Development%20Environment%20-%20Part%203" title="Facebook"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blog.nuclearbunny.org/2009/10/22/my-zenoss-development-environment-part-3/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>My Zenoss Development Environment &#8211; Part 2</title>
		<link>http://blog.nuclearbunny.org/2009/10/22/my-zenoss-development-environment-part-2/</link>
		<comments>http://blog.nuclearbunny.org/2009/10/22/my-zenoss-development-environment-part-2/#comments</comments>
		<pubDate>Thu, 22 Oct 2009 19:26:36 +0000</pubDate>
		<dc:creator>chadwick</dc:creator>
				<category><![CDATA[Jobs]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Zenoss]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://blog.nuclearbunny.org/?p=511</guid>
		<description><![CDATA[In Part 1 of this series we discussed getting an initial Zenoss environment checked out and running on a Mac OS X or Ubuntu system. In this part, we&#8217;ll discuss configuring Eclipse to use this environment. Mac OS X Prerequisites Install Eclipse Classic 3.5.x Mac Cocoa 32-bit. Ubuntu Prerequisites Install the Sun Java JDK. Why? [...]]]></description>
			<content:encoded><![CDATA[<p>In <a href="http://blog.nuclearbunny.org/2009/10/22/my-zenoss-development-environment-part-1/" target="_blank">Part 1</a> of this series we discussed getting an initial <a href="http://www.zenoss.com/" target="_blank">Zenoss</a> environment checked out and running on a <a href="http://www.apple.com/macosx/" target="_blank">Mac OS X </a>or <a href="http://www.ubuntu.com/" target="_blank">Ubuntu</a> system. In this part, we&#8217;ll discuss configuring <a href="http://www.eclipse.org/" target="_blank">Eclipse</a> to use this environment.</p>
<h2>Mac OS X Prerequisites</h2>
<ol>
<li>Install <a href="http://www.eclipse.org/downloads/" target="_blank">Eclipse Classic</a> 3.5.x Mac <a href="http://blog.zvikico.com/2009/06/eclipse-galileo-for-mac-cocoa-or-carbon.html" target="_blank">Cocoa 32-bit</a>.</li>
</ol>
<h2>Ubuntu Prerequisites</h2>
<ol>
<li>Install the Sun Java JDK. <strong>Why?</strong> Eclipse is a Java application and requires a full-fledged Java environment to run properly.<code><br />
sudo apt-get -y install sun-java6-jdk<br />
</code></li>
<li>Install <a href="http://www.eclipse.org/downloads/" target="_blank">Eclipse Classic</a> 3.5.x Linux 32-bit.</li>
</ol>
<h2>Eclipse Configuration</h2>
<ol>
<li>In part one, we created a Zenoss root project directory of <code>$HOME/zenoss</code> &#8211; use that directory, or the one you created, for the rest of these steps.</li>
<li>Launch Eclipse and configure it to use the Zenoss root project directory. <strong>Why?</strong> Eclipse needs a workspace directory to keep track of configuration settings for a group of related projects. By placing the workspace directory inside of the Zenoss root workspace, we can separate the requirements for a Zenoss workspace from other projects you may be using.<a rel="attachment wp-att-484" href="http://blog.nuclearbunny.org/2009/10/22/my-zenoss-development-environment-part-1/eclipse-workspace-2/"><img title="eclipse-workspace" src="http://blog.nuclearbunny.org/wp-content/uploads/2009/10/eclipse-workspace1.png" alt="eclipse-workspace" width="677" height="324" /></a></li>
<li>Install the <a href="http://pydev.org/" target="_blank">PyDev</a> plug-in for Eclipse. <strong>Why?</strong> PyDev provides Python language support to Eclipse.
<ol>
<li>Go to the Help Menu and choose<em> Install New Software</em>.</li>
<li>In the Available Software dialog, choose <em>Add</em> and enter in <code>http://pydev.org/updates/</code> as the Location and close the dialog. Eclipse will return to the Available Software dialog.<a rel="attachment wp-att-498" href="http://blog.nuclearbunny.org/2009/10/22/my-zenoss-development-environment-part-1/picture-5/"><img title="PyDev" src="http://blog.nuclearbunny.org/wp-content/uploads/2009/10/Picture-5.png" alt="PyDev" width="555" height="260" /></a></li>
<li>Software matching PyDev will appear in the dialog; pick the <em>PyDev</em> option but do not pick <em>PyDev Mylyn Integration</em>. Click <em>Next</em> and install the plug-in.</li>
</ol>
<p><a rel="attachment wp-att-500" href="http://blog.nuclearbunny.org/2009/10/22/my-zenoss-development-environment-part-1/picture-6-2/"><img title="PyDev" src="http://blog.nuclearbunny.org/wp-content/uploads/2009/10/Picture-61.png" alt="PyDev" width="725" height="643" /></a></li>
<li>Install the <a href="http://subclipse.tigris.org/" target="_blank">Subclipse</a> plug-in. <strong>Why?</strong> Subclipse allows you to work with the Subversion version control system directly from within Eclipse.
<ol>
<li>In the Available Software dialog add the Subclipse plug-in update site: <code>
<p>http://subclipse.tigris.org/update_1.6.x</p>
<p></code></li>
<li>In the Available Software dialog, choose the <em>Subclipse</em>, <em>Subversion Client Adapter</em>, <em>Subversion JavaHL Native Library Adapter</em> and the <em>Subversion Revision Graph </em>items.<a rel="attachment wp-att-553" href="http://blog.nuclearbunny.org/2009/10/22/my-zenoss-development-environment-part-2/picture-5-2/"><img class="aligncenter size-full wp-image-553" title="Subclipse" src="http://blog.nuclearbunny.org/wp-content/uploads/2009/10/Picture-51.png" alt="Subclipse" width="798" height="742" /></a></li>
</ol>
</li>
<li>Go to the Window menu, choose Open Perspective and then SVN Repository Exploring (you may have to choose Other&#8230; to see this option).</li>
<li>Choose the New Repository Location button in the SVN Repositories panel. Add the Zenoss SVN site at <code>http://dev.zenoss.org/svn</code></li>
<li>Open the SVN repository and select the <code>trunk</code> folder. Secondary-click the folder and choose the <em>Checkout&#8230; </em>option. Be sure to change the Depth option to be <em>Only this item</em> so that we don&#8217;t check out any of the sub-folders of trunk just yet (many of the folders within trunk are not needed for development, but we want to keep the directory structure). In the next dialog you will be asked to choose a Project Wizard. Open the Pydev tree item and select the <em>Pydev Project</em> option.<a rel="attachment wp-att-554" href="http://blog.nuclearbunny.org/2009/10/22/my-zenoss-development-environment-part-2/picture-6-3/"><img class="aligncenter size-full wp-image-554" title="svn checkout" src="http://blog.nuclearbunny.org/wp-content/uploads/2009/10/Picture-62.png" alt="svn checkout" width="605" height="556" /></a></li>
<li>Create the project in the Pydev Project dialog:
<ol>
<li>Use <code>core</code> as the project name and use the default location. This should create a core project at <code>$HOME/zenoss/core</code>.</li>
<li>Make sure the <em>Python</em> project type is selected.</li>
<li>Select<em> 2.4</em> as the Python Grammar version.</li>
<li>Uncheck the <em>Create default &#8216;src&#8217; folder..</em>. option.</li>
<li>Click the Click here to <em>configure an interpreter not listed&#8230;</em> option in order to add the python interpreter built by the Zenoss installation scripts.
<ol>
<li>In the Preferences Dialog, choose the Interpreter &#8211; Python item underneath Pydev and select the <em>New&#8230;</em> button to add a new Python interpreter.</li>
<li>Browse to the <code>$ZENHOME/bin</code> directory and choose the <code>python2.4</code> executable from that directory.</li>
<li>Name the interpreter <code>python-2.4</code>, <code>zenoss-python</code> or some other variant.</li>
<p><a rel="attachment wp-att-529" href="http://blog.nuclearbunny.org/2009/10/22/my-zenoss-development-environment-part-2/picture-13/"><img class="aligncenter size-full wp-image-529" title="Picture 13" src="http://blog.nuclearbunny.org/wp-content/uploads/2009/10/Picture-13.png" alt="Picture 13" width="632" height="303" /></a>After the new Python interpreter has been added, return to the Pydev Project dialog and choose that interpreter from the list and then click <em>Finish</em> to create the project.</ol>
</li>
<li>Update the <code>core</code> folder from the command-line SVN client so you can selectively pull the sub-folders of the core project and not all of them:<code><br />
cd $HOME/zenoss/core<br />
svn update Products<br />
</code></li>
<li>Move the Products directory the installation checked out and create a symbolic link to the one updated above. <strong>Why?</strong> This allows the Products source tree to be worked on from Eclipse and then also used by the Zenoss run-time.<code><br />
cd $ZENHOME<br />
mv Products Products.old<br />
ln -s $HOME/zenoss/core/Products Products</code></li>
<li>Return to Eclipse and choose the <em>Refresh</em> option from the File menu so that Eclipse notices the updated directory and builds necessary dependencies.</li>
<li>Secondary-click on the core project folder in Eclipse and choose <em>Properties</em>. Choose the <em>PyDev &#8211; PYTHONPATH</em> item and add source folders so PyDev can reference the project from within itself.
<ol>
<li>In the Source Folders tab choose the <em>Add source folder</em> button and pick the root <code>core</code> folder from the provided list.<a rel="attachment wp-att-532" href="http://blog.nuclearbunny.org/2009/10/22/my-zenoss-development-environment-part-2/picture-2/"><img class="aligncenter size-full wp-image-532" title="Picture 2" src="http://blog.nuclearbunny.org/wp-content/uploads/2009/10/Picture-2.png" alt="Picture 2" width="860" height="617" /></a></li>
<li>In the External Libraries tab choose the <em>Add source folder</em> button and choose the <code>$ZENHOME/lib/python</code> directory.<a rel="attachment wp-att-533" href="http://blog.nuclearbunny.org/2009/10/22/my-zenoss-development-environment-part-2/picture-3/"><img class="aligncenter size-full wp-image-533" title="Picture 3" src="http://blog.nuclearbunny.org/wp-content/uploads/2009/10/Picture-3.png" alt="Picture 3" width="860" height="617" /></a></li>
</ol>
</li>
</ol>
<p>At this point, your Eclipse project should allow you to navigate between dependencies within the Zenoss project. You can also simultaneously switch between using the Team feature within Eclipse to update and manage Subversion or do so using the command-line svn client.</p>
<h2>Next&#8230;</h2>
<p>In <a href="http://blog.nuclearbunny.org/2009/10/22/my-zenoss-development-environment-part-3/" target="_blank">Part 3</a> of this series, we&#8217;ll discuss how to manage day-to-day activities such as creating sandbox branches for changes and dealing with multiple versions are done from within the same environment.</li>
</ol>



Share and Enjoy:


	<a rel="nofollow"  href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fblog.nuclearbunny.org%2F2009%2F10%2F22%2Fmy-zenoss-development-environment-part-2%2F&amp;title=My%20Zenoss%20Development%20Environment%20-%20Part%202&amp;bodytext=In%20Part%201%20of%20this%20series%20we%20discussed%20getting%20an%20initial%20Zenoss%20environment%20checked%20out%20and%20running%20on%20a%20Mac%20OS%20X%20or%20Ubuntu%20system.%20In%20this%20part%2C%20we%27ll%20discuss%20configuring%20Eclipse%20to%20use%20this%20environment.%0D%0AMac%20OS%20X%20Prerequisites%0D%0A%0D%0A%09Install%20Eclipse%20C" title="Digg"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fblog.nuclearbunny.org%2F2009%2F10%2F22%2Fmy-zenoss-development-environment-part-2%2F&amp;title=My%20Zenoss%20Development%20Environment%20-%20Part%202" title="StumbleUpon"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://delicious.com/post?url=http%3A%2F%2Fblog.nuclearbunny.org%2F2009%2F10%2F22%2Fmy-zenoss-development-environment-part-2%2F&amp;title=My%20Zenoss%20Development%20Environment%20-%20Part%202&amp;notes=In%20Part%201%20of%20this%20series%20we%20discussed%20getting%20an%20initial%20Zenoss%20environment%20checked%20out%20and%20running%20on%20a%20Mac%20OS%20X%20or%20Ubuntu%20system.%20In%20this%20part%2C%20we%27ll%20discuss%20configuring%20Eclipse%20to%20use%20this%20environment.%0D%0AMac%20OS%20X%20Prerequisites%0D%0A%0D%0A%09Install%20Eclipse%20C" title="del.icio.us"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fblog.nuclearbunny.org%2F2009%2F10%2F22%2Fmy-zenoss-development-environment-part-2%2F&amp;title=My%20Zenoss%20Development%20Environment%20-%20Part%202&amp;annotation=In%20Part%201%20of%20this%20series%20we%20discussed%20getting%20an%20initial%20Zenoss%20environment%20checked%20out%20and%20running%20on%20a%20Mac%20OS%20X%20or%20Ubuntu%20system.%20In%20this%20part%2C%20we%27ll%20discuss%20configuring%20Eclipse%20to%20use%20this%20environment.%0D%0AMac%20OS%20X%20Prerequisites%0D%0A%0D%0A%09Install%20Eclipse%20C" title="Google Bookmarks"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.facebook.com/share.php?u=http%3A%2F%2Fblog.nuclearbunny.org%2F2009%2F10%2F22%2Fmy-zenoss-development-environment-part-2%2F&amp;t=My%20Zenoss%20Development%20Environment%20-%20Part%202" title="Facebook"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blog.nuclearbunny.org/2009/10/22/my-zenoss-development-environment-part-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>My Zenoss Development Environment &#8211; Part 1</title>
		<link>http://blog.nuclearbunny.org/2009/10/22/my-zenoss-development-environment-part-1/</link>
		<comments>http://blog.nuclearbunny.org/2009/10/22/my-zenoss-development-environment-part-1/#comments</comments>
		<pubDate>Thu, 22 Oct 2009 17:05:46 +0000</pubDate>
		<dc:creator>chadwick</dc:creator>
				<category><![CDATA[Jobs]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Zenoss]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://blog.nuclearbunny.org/?p=469</guid>
		<description><![CDATA[Over the past 18 months the developers at Zenoss have used a variety of development environments and methods to productively work with Zenoss, but there are a lot of best practices that have emerged out of this diversity. I develop Zenoss primarily on Mac OS X, with some work done on Ubuntu when necessary. I [...]]]></description>
			<content:encoded><![CDATA[<p>Over the past 18 months the developers at <a href="http://www.zenoss.com/" target="_blank">Zenoss</a> have used a variety of development environments and methods to productively work with Zenoss, but there are a lot of best practices that have emerged out of this diversity.</p>
<p>I develop Zenoss primarily on <a href="http://www.apple.com/macosx/" target="_blank">Mac OS X</a>, with some work done on <a href="http://www.ubuntu.com/" target="_blank">Ubuntu</a> when necessary. I normally use <a href="http://www.eclipse.org/" target="_blank">Eclipse</a> as my development editor, although I&#8217;ll often just use <a href="http://www.vim.org/" target="_blank">vim</a> when doing quick changes or bug fixes. In either case, careful setup of the Zenoss environment is key to being able to productively work with both the new development version and with the shipping versions that require maintenance.</p>
<p>The environment you get by default when you check out the source version of Zenoss from the source repository, or from a source tarball, is not necessarily setup in the best way to develop productively using tools like Eclipse.</p>
<p>The rest of this post will document how both my Mac OS X and Ubuntu environments are initially configured so that a working source Zenoss installation is realized.</p>
<h2>Mac OS X Prerequisites</h2>
<p>These prerequisite instructions assume Mac OS X 10.5 Leopard; 10.6 Snow Leopard will not be able to compile Zenoss&#8217;s third-party dependencies, so an additional work-around is required for that platform until Zenoss moves to <a href="http://www.python.org/download/releases/2.6/" target="_blank">Python 2.6</a>.</p>
<ol>
<li>Install <a href="http://developer.apple.com/technology/xcode.html" target="_blank">Xcode</a>. <strong>Why?</strong> Installs the GNU C/C++ compiler and other command-line development tools needed to build dependencies used by Zenoss.</li>
<li>Install <a href="http://www.open.collab.net/downloads/community/" target="_blank">Universal Subversion 1.6.x from CollabNet Community</a>.<strong>Why?</strong> Leopard only comes with Subversion 1.4.x. This version is not compatible with the Subclipse plug-in for Eclipse that will be used later. In order to be able to use both the command-line and Eclipse Subversion versions simultaneously on the same checked our source, the release of subversion should match. This installation will place the Subversion binaries in <code>/opt/subversion</code> and should automatically add it to your <code>PATH</code>.</li>
<li> Install <a href="http://dev.mysql.com/downloads/" target="_blank">MySQL Community Edition 5.1 32-bit</a>. <strong>Why?</strong> Zenoss needs MySQL for storage of event data.</li>
</ol>
<h2>Ubuntu Prerequisites</h2>
<p>These prerequisite instructions assume Ubuntu 9.04 32-bit Desktop Edition. Installing the server edition or one with different options may require additional prerequisites to be installed.</p>
<ol>
<li>Install Subversion. <strong>Why?</strong> Working with the Zenoss product in source form requires Subversion to access the source repositories (it is also possible to build directly from a source tarball, but this is not discussed here).<br />
<code>sudo apt-get -y install subversion<br />
</code></li>
<li>Install MySQL. <strong>Why?</strong> Zenoss needs MySQL for storage of event data.<br />
<code>sudo apt-get -y install mysql-client mysql-server libmysqlclient15-dev<br />
</code></li>
<li>Install additional development environment tools. <strong>Why?</strong> Zenoss third-party dependencies require several binaries to be built from source.<br />
<code>sudo apt-get -y install patch make vim gcc g++ autoconf</code></li>
<li>Install SNMP support. <strong>Why</strong>? Zenoss requires SNMP libraries for monitoring, and having a local SNMP agent is useful for testing.<code><br />
sudo apt-get -y install libsnmp-base snmp snmpd</code></li>
<li>Install Liberation TrueType fonts. <strong>Why?</strong> Graphs generated by RRDtool will not contain the correct glyphs without this font package.<code><br />
sudo apt-get -y install ttf-liberation</code></li>
</ol>
<h2>Environment Configuration</h2>
<p>Configuring Eclipse will require determining where you want to work with your Zenoss installation, and installing Eclipse plug-ins to provide the features required for Python and Subversion support.</p>
<ol>
<li>Create your Zenoss root directory:<code><br />
mkdir $HOME/zenoss<br />
</code></li>
<li>Create and run a <code>setup.sh</code> script that will configure needed environment variables for zenoss. This script can be started from your log in profile if desired.<code><br />
cd $HOME/zenoss<br />
cat &gt; zenoss-config.sh &lt;&lt;EOF<br />
ZENHOME=$HOME/zenoss/zenhome<br />
PYTHONPATH=$ZENHOME/lib/python<br />
PATH=\$ZENHOME/bin:\$PATH<br />
export ZENHOME PYTHONPATH PATH<br />
EOF<br />
chmod +x zenoss-config.sh<br />
. zenoss-config.sh<br />
mkdir $ZENHOME<br />
</code></li>
<li>Checkout the Zenoss source installation tree. <strong>Why?</strong> This tree is used to bootstrap the installation from the source repository and create a running Zenoss installation. We&#8217;ll need this before we modify it to fit the needs of our development environment.<code><br />
svn co http://dev.zenoss.org/svn/trunk/inst inst<br />
</code></li>
<li>Run the installation script to checkout, compile, and configure a zenoss environment. If you need to customize your MySQL configuration at all do not use the <code>--no-prompt</code> argument.<code><br />
cd inst<br />
./install.sh --no-prompt<br />
</code></li>
<li>Modify the <code>zensocket</code> file to be setuid root. <strong>Why?</strong> Some of the Zenoss daemons use a privileged port and making the file owned by root and accessible by the Zenoss user allows the daemons to be run as a non-priviledged user but still use the privileged port.<code><br />
sudo chown root:`id -g` $ZENHOME/bin/zensocket<br />
sudo chmod 04750 $ZENHOME/bin/zensocket<br />
</code></li>
</ol>
<p>At this point, you should have running zeo and zope processes and be able to log on to the local Zenoss instance. Your Zenoss root directory should look similar to the following:<br />
<a rel="attachment wp-att-491" href="http://blog.nuclearbunny.org/2009/10/22/my-zenoss-development-environment-part-1/picture-4/"><img class="aligncenter size-full wp-image-491" title="zenoss workspace" src="http://blog.nuclearbunny.org/wp-content/uploads/2009/10/Picture-4.png" alt="zenoss workspace" width="492" height="393" /></a></p>
<h2>Next&#8230;</h2>
<p>In <a title="Part 2" href="http://blog.nuclearbunny.org/2009/10/22/my-zenoss-development-environment-part-2/" target="_self">Part 2</a> of this series, we&#8217;ll download and configure the Eclipse IDE.</p>



Share and Enjoy:


	<a rel="nofollow"  href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fblog.nuclearbunny.org%2F2009%2F10%2F22%2Fmy-zenoss-development-environment-part-1%2F&amp;title=My%20Zenoss%20Development%20Environment%20-%20Part%201&amp;bodytext=Over%20the%20past%2018%20months%20the%20developers%20at%20Zenoss%20have%20used%20a%20variety%20of%20development%20environments%20and%20methods%20to%20productively%20work%20with%20Zenoss%2C%20but%20there%20are%20a%20lot%20of%20best%20practices%20that%20have%20emerged%20out%20of%20this%20diversity.%0D%0A%0D%0AI%20develop%20Zenoss%20primaril" title="Digg"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fblog.nuclearbunny.org%2F2009%2F10%2F22%2Fmy-zenoss-development-environment-part-1%2F&amp;title=My%20Zenoss%20Development%20Environment%20-%20Part%201" title="StumbleUpon"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://delicious.com/post?url=http%3A%2F%2Fblog.nuclearbunny.org%2F2009%2F10%2F22%2Fmy-zenoss-development-environment-part-1%2F&amp;title=My%20Zenoss%20Development%20Environment%20-%20Part%201&amp;notes=Over%20the%20past%2018%20months%20the%20developers%20at%20Zenoss%20have%20used%20a%20variety%20of%20development%20environments%20and%20methods%20to%20productively%20work%20with%20Zenoss%2C%20but%20there%20are%20a%20lot%20of%20best%20practices%20that%20have%20emerged%20out%20of%20this%20diversity.%0D%0A%0D%0AI%20develop%20Zenoss%20primaril" title="del.icio.us"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fblog.nuclearbunny.org%2F2009%2F10%2F22%2Fmy-zenoss-development-environment-part-1%2F&amp;title=My%20Zenoss%20Development%20Environment%20-%20Part%201&amp;annotation=Over%20the%20past%2018%20months%20the%20developers%20at%20Zenoss%20have%20used%20a%20variety%20of%20development%20environments%20and%20methods%20to%20productively%20work%20with%20Zenoss%2C%20but%20there%20are%20a%20lot%20of%20best%20practices%20that%20have%20emerged%20out%20of%20this%20diversity.%0D%0A%0D%0AI%20develop%20Zenoss%20primaril" title="Google Bookmarks"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.facebook.com/share.php?u=http%3A%2F%2Fblog.nuclearbunny.org%2F2009%2F10%2F22%2Fmy-zenoss-development-environment-part-1%2F&amp;t=My%20Zenoss%20Development%20Environment%20-%20Part%201" title="Facebook"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blog.nuclearbunny.org/2009/10/22/my-zenoss-development-environment-part-1/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Why is my car&#8217;s satellite navigation system so stupid?</title>
		<link>http://blog.nuclearbunny.org/2009/09/18/why-is-my-cars-satellite-navigation-system-so-stupid/</link>
		<comments>http://blog.nuclearbunny.org/2009/09/18/why-is-my-cars-satellite-navigation-system-so-stupid/#comments</comments>
		<pubDate>Fri, 18 Sep 2009 23:57:27 +0000</pubDate>
		<dc:creator>chadwick</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Cars]]></category>
		<category><![CDATA[gps]]></category>
		<category><![CDATA[lame]]></category>
		<category><![CDATA[rant]]></category>

		<guid isPermaLink="false">http://blog.nuclearbunny.org/?p=474</guid>
		<description><![CDATA[I have two different late model (a 2006 and a 2007) GM vehicles with satellite navigation systems. Both are manufactured for GM by Denso, although they clearly have different implementations and features. The one thing they both share, however, is blatant stupidity when calculating routes. I travel quite a bit between Houston and Austin and [...]]]></description>
			<content:encoded><![CDATA[<p>I have two different late model (a 2006 and a 2007) GM vehicles with satellite navigation systems. Both are manufactured for GM by Denso, although they clearly have different implementations and features. The one thing they both share, however, is blatant stupidity when calculating routes.</p>
<p>I travel quite a bit between Houston and Austin and there are really only three reasonable ways to go: US-290; I-10 &amp; TX-71; or I-10 &amp; TX-183. Over the years my preference has moved from US-290 to I-10 &amp; TX-71 as traffic along US-290 has increased on the eastern fridges of the Austin area, but the distance and time between the two is very similar and really it depends upon where in Austin you might be headed.</p>
<p><img class="alignright" style="border: 1px solid black; margin: 2px;" title="GM GPS Route" src="http://farm3.static.flickr.com/2622/3913527957_5875c4fbf4.jpg" alt="" width="300" height="225" /></p>
<p>The GPS systems in my cars have three route options when you pick a destination: fastest, shortest and other. In both cars, the route displayed is none of the above three, but instead a long, out-of-the-way route of I-10 to Seguin before heading north on TX-123 to San Marcos, and then heading into Austin on I-35. This option is a whopping 222 miles with an estimated travel time of 3 hours and 39 minutes.</p>
<p>Now, the fastest route is usually not the shortest. Route calculations are supposed to take into account the actual speeds of the road segments involved, and since interstate highways are almost always faster than anything else, there is a natural preference to these roads. In this case, however, the calculation is way off. Taking I-10 to US-71 (via US-59 &amp; TX-8 inside of Houston for those familiar with the area) is only 166 miles and estimated to take 3 hours 29 minutes according to Google. Likewise, taking US-290 is only 168 miles and estimated to take 3 hours 22 minutes.</p>
<p>Of course these time estimates are usually worst case scenario. Driving a few miles per hour over the speed limit I often make my trip in 2 hours and 30 minutes; worst case has been 3 hours and 10 minutes when driving 55 as an experiment (a painful one at that).</p>
<p>What about the shortest route option in the GPS system? That does actually route you onto I-10 &amp; US-71 in this example, but the shortest route calculations are always incredibly stupid, too. They will often take you onto side streets for half a mile or less just to maintain the shortest possible distance. Once, when driving through Memphis, TN, the GM GPS took us on and off the interstate highway three times when driving through town, often for just a couple of blocks, just to maintain the shortest distance. Granted this is a clear example of a GPS system not being there to replace your own intelligence, but if you don&#8217;t know the town&#8230;</p>
<p>In the early days of consumer-level GPS systems, one of the common problems was having accurate speed data for different road segments. In western states especially, secondary highways often have the same speed limits as interstate highways. In Texas, the past 20 years has seen many of these highways improved so they route around the smaller towns, rather than going through them and stopping at every light. Consequently it is often better to take these roads than the interstates whenever possible. If the GM GPS systems do not have accurate speed data then it can account for some of this behavior, but not all.</p>
<p>On my normal route, once you finally hit TX-71 and the GPS decides you mean it, suddenly the estimated arrival time drops dramatically along with the distance. Is it computing this arrival time based upon your actual speed so far, or based upon the speed data of the road?</p>
<p>Over the years I&#8217;ve gone from absolutely wanting a satnav system in the car to wishing mine didn&#8217;t. I get much better results using a smart phone with Google Maps to get a general idea of the route to take and then consulting with it now and then if things get tricky. But for the most part, they seem poorly done enough that they just get in the way rather than help. Will the newer generations out now that provide real-time traffic data and have hard-disk based data improve their logic and performance enough that these problems are solved?</p>
<p>One final note for embedded systems developers: you don&#8217;t get to break the interactive response time rule of 250ms just because you are writing code for an embedded system.</p>



Share and Enjoy:


	<a rel="nofollow"  href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fblog.nuclearbunny.org%2F2009%2F09%2F18%2Fwhy-is-my-cars-satellite-navigation-system-so-stupid%2F&amp;title=Why%20is%20my%20car%27s%20satellite%20navigation%20system%20so%20stupid%3F&amp;bodytext=I%20have%20two%20different%20late%20model%20%28a%202006%20and%20a%202007%29%20GM%20vehicles%20with%20satellite%20navigation%20systems.%20Both%20are%20manufactured%20for%20GM%20by%20Denso%2C%20although%20they%20clearly%20have%20different%20implementations%20and%20features.%20The%20one%20thing%20they%20both%20share%2C%20however%2C%20is%20bl" title="Digg"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fblog.nuclearbunny.org%2F2009%2F09%2F18%2Fwhy-is-my-cars-satellite-navigation-system-so-stupid%2F&amp;title=Why%20is%20my%20car%27s%20satellite%20navigation%20system%20so%20stupid%3F" title="StumbleUpon"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://delicious.com/post?url=http%3A%2F%2Fblog.nuclearbunny.org%2F2009%2F09%2F18%2Fwhy-is-my-cars-satellite-navigation-system-so-stupid%2F&amp;title=Why%20is%20my%20car%27s%20satellite%20navigation%20system%20so%20stupid%3F&amp;notes=I%20have%20two%20different%20late%20model%20%28a%202006%20and%20a%202007%29%20GM%20vehicles%20with%20satellite%20navigation%20systems.%20Both%20are%20manufactured%20for%20GM%20by%20Denso%2C%20although%20they%20clearly%20have%20different%20implementations%20and%20features.%20The%20one%20thing%20they%20both%20share%2C%20however%2C%20is%20bl" title="del.icio.us"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fblog.nuclearbunny.org%2F2009%2F09%2F18%2Fwhy-is-my-cars-satellite-navigation-system-so-stupid%2F&amp;title=Why%20is%20my%20car%27s%20satellite%20navigation%20system%20so%20stupid%3F&amp;annotation=I%20have%20two%20different%20late%20model%20%28a%202006%20and%20a%202007%29%20GM%20vehicles%20with%20satellite%20navigation%20systems.%20Both%20are%20manufactured%20for%20GM%20by%20Denso%2C%20although%20they%20clearly%20have%20different%20implementations%20and%20features.%20The%20one%20thing%20they%20both%20share%2C%20however%2C%20is%20bl" title="Google Bookmarks"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.facebook.com/share.php?u=http%3A%2F%2Fblog.nuclearbunny.org%2F2009%2F09%2F18%2Fwhy-is-my-cars-satellite-navigation-system-so-stupid%2F&amp;t=Why%20is%20my%20car%27s%20satellite%20navigation%20system%20so%20stupid%3F" title="Facebook"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blog.nuclearbunny.org/2009/09/18/why-is-my-cars-satellite-navigation-system-so-stupid/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>IcyBee needs a new maintainer</title>
		<link>http://blog.nuclearbunny.org/2009/09/03/icybee-needs-a-new-maintainer/</link>
		<comments>http://blog.nuclearbunny.org/2009/09/03/icybee-needs-a-new-maintainer/#comments</comments>
		<pubDate>Thu, 03 Sep 2009 23:16:05 +0000</pubDate>
		<dc:creator>chadwick</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://blog.nuclearbunny.org/?p=472</guid>
		<description><![CDATA[The IcyBee project is a client for the ICB chat network with a graphical user interface and written in the Java language for cross-platform portability. The current version of the software has several years of stability behind it and few user requests, but there is always more work to do. The project is currently hosted [...]]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://www.nuclearbunny.org/icybee/" target="_blank">IcyBee project</a> is a client for the <a href="http://www.icb.net/" target="_blank">ICB chat network</a> with a graphical user interface and written in the Java language for cross-platform portability. The current version of the software has several years of stability behind it and few user requests, but there is always more work to do. The project is currently hosted on <a href="http://sourceforge.net/projects/icybee/" target="_blank">SourceForge</a> and all of the source is already available.</p>
<p>I&#8217;m looking for a maintainer that will take the reins of the project from me and give the project some much needed love as time and platforms march on. If interested, drop a comment on this post and we can discuss the possibility.</p>



Share and Enjoy:


	<a rel="nofollow"  href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fblog.nuclearbunny.org%2F2009%2F09%2F03%2Ficybee-needs-a-new-maintainer%2F&amp;title=IcyBee%20needs%20a%20new%20maintainer&amp;bodytext=The%20IcyBee%20project%20is%20a%20client%20for%20the%20ICB%20chat%20network%20with%20a%20graphical%20user%20interface%20and%20written%20in%20the%20Java%20language%20for%20cross-platform%20portability.%20The%20current%20version%20of%20the%20software%20has%20several%20years%20of%20stability%20behind%20it%20and%20few%20user%20request" title="Digg"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fblog.nuclearbunny.org%2F2009%2F09%2F03%2Ficybee-needs-a-new-maintainer%2F&amp;title=IcyBee%20needs%20a%20new%20maintainer" title="StumbleUpon"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://delicious.com/post?url=http%3A%2F%2Fblog.nuclearbunny.org%2F2009%2F09%2F03%2Ficybee-needs-a-new-maintainer%2F&amp;title=IcyBee%20needs%20a%20new%20maintainer&amp;notes=The%20IcyBee%20project%20is%20a%20client%20for%20the%20ICB%20chat%20network%20with%20a%20graphical%20user%20interface%20and%20written%20in%20the%20Java%20language%20for%20cross-platform%20portability.%20The%20current%20version%20of%20the%20software%20has%20several%20years%20of%20stability%20behind%20it%20and%20few%20user%20request" title="del.icio.us"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fblog.nuclearbunny.org%2F2009%2F09%2F03%2Ficybee-needs-a-new-maintainer%2F&amp;title=IcyBee%20needs%20a%20new%20maintainer&amp;annotation=The%20IcyBee%20project%20is%20a%20client%20for%20the%20ICB%20chat%20network%20with%20a%20graphical%20user%20interface%20and%20written%20in%20the%20Java%20language%20for%20cross-platform%20portability.%20The%20current%20version%20of%20the%20software%20has%20several%20years%20of%20stability%20behind%20it%20and%20few%20user%20request" title="Google Bookmarks"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.facebook.com/share.php?u=http%3A%2F%2Fblog.nuclearbunny.org%2F2009%2F09%2F03%2Ficybee-needs-a-new-maintainer%2F&amp;t=IcyBee%20needs%20a%20new%20maintainer" title="Facebook"><img src="http://blog.nuclearbunny.org/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://blog.nuclearbunny.org/2009/09/03/icybee-needs-a-new-maintainer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
