<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>keithbrown42</title>
	<atom:link href="http://keithbrown42.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://keithbrown42.wordpress.com</link>
	<description>Tidbits from the Pluralsight trenches</description>
	<lastBuildDate>Sun, 11 Mar 2012 01:22:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='keithbrown42.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>keithbrown42</title>
		<link>http://keithbrown42.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://keithbrown42.wordpress.com/osd.xml" title="keithbrown42" />
	<atom:link rel='hub' href='http://keithbrown42.wordpress.com/?pushpress=hub'/>
		<item>
		<title>I&#8217;ve been blogging over at pluralsight.com</title>
		<link>http://keithbrown42.wordpress.com/2012/03/10/ive-been-blogging-over-at-pluralsight-com/</link>
		<comments>http://keithbrown42.wordpress.com/2012/03/10/ive-been-blogging-over-at-pluralsight-com/#comments</comments>
		<pubDate>Sun, 11 Mar 2012 01:22:30 +0000</pubDate>
		<dc:creator>Keith Brown</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://keithbrown42.wordpress.com/?p=69</guid>
		<description><![CDATA[Seems like I&#8217;ve been saying all I need to say technically (which is mainly what this blog was for) over at blog.pluralsight.com. So I probably won&#8217;t be posting much here anymore. Follow me there!<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=keithbrown42.wordpress.com&#038;blog=9514285&#038;post=69&#038;subd=keithbrown42&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Seems like I&#8217;ve been saying all I need to say technically (which is mainly what this blog was for) over at <a title="Pluralsight's Blog" href="http://blog.pluralsight.com">blog.pluralsight.com</a>. So I probably won&#8217;t be posting much here anymore. Follow me there!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/keithbrown42.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/keithbrown42.wordpress.com/69/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=keithbrown42.wordpress.com&#038;blog=9514285&#038;post=69&#038;subd=keithbrown42&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://keithbrown42.wordpress.com/2012/03/10/ive-been-blogging-over-at-pluralsight-com/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/5116c31b42219bb646ba8ed67c04c7c3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">keithbrown42</media:title>
		</media:content>
	</item>
		<item>
		<title>I wish Twitter would provide a standard way to express times.</title>
		<link>http://keithbrown42.wordpress.com/2011/12/01/i-wish-twitter-would-provide-a-standard-way-to-express-times/</link>
		<comments>http://keithbrown42.wordpress.com/2011/12/01/i-wish-twitter-would-provide-a-standard-way-to-express-times/#comments</comments>
		<pubDate>Thu, 01 Dec 2011 14:09:25 +0000</pubDate>
		<dc:creator>Keith Brown</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://keithbrown42.wordpress.com/?p=59</guid>
		<description><![CDATA[I see this sort of thing all the time on Twitter: 4 hours until Foo happens!!! Eight hours later, people are still retweeting it. Using absolute times isn&#8217;t any easier due to time zone differences. It&#8217;s a *lot* easier to provide relative times like, &#8220;3 hours until&#8230;&#8221;, until you see how retweets completely destroy your [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=keithbrown42.wordpress.com&#038;blog=9514285&#038;post=59&#038;subd=keithbrown42&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>I see this sort of thing all the time on Twitter: <strong>4 hours until Foo happens!!!</strong></p>
<p>Eight hours later, people are still retweeting it.</p>
<p>Using absolute times isn&#8217;t any easier due to time zone differences. It&#8217;s a *lot* easier to provide relative times like, &#8220;3 hours until&#8230;&#8221;, until you see how retweets completely destroy your intent.</p>
<p>I wonder if Twitter is thinking about ways of making this better? Imagine a world where I could use a standard syntax to establish an absolute point in time, say &#8220;T+3h&#8221; for, &#8220;the point in time 3 hours from now&#8221;, or T9:00 for 9:00 local time (which my twitter client would convert to universal time before sending to Twitter), or T16:00U to express universal time directly. I&#8217;m sure there&#8217;s better syntax, but you get the idea.</p>
<p>Twitter would then always render these in a standard way using universal time, and clients could do simple things like make it clear that the time is in the future or in the past (reducing accidental retweets of stale event announcements, etc.) You could hover your mouse over one of these dates and your client could pop up a tooltip showing it in relative time, like &#8220;in 6 hours&#8221;, or you could configure a preference to always compute and display relative times when they are within a certain number of hours of Now.</p>
<p>I&#8217;d love to know if anyone at Twitter is working on solving this problem, but I&#8217;ve yet to come up with a good search expression for this topic. &#8220;Twitter time&#8221; gets you a bunch of posts on how to avoid wasting <strong>time</strong> with twitter. &#8220;Twitter dates&#8221; gets you lots of posts on how to get a <strong>date</strong> using Twitter. &#8220;Twitter express standard time&#8221; gets you posts about <strong>express</strong> rail and air service <strong>time</strong>s.</p>
<p>Sigh.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/keithbrown42.wordpress.com/59/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/keithbrown42.wordpress.com/59/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=keithbrown42.wordpress.com&#038;blog=9514285&#038;post=59&#038;subd=keithbrown42&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://keithbrown42.wordpress.com/2011/12/01/i-wish-twitter-would-provide-a-standard-way-to-express-times/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/5116c31b42219bb646ba8ed67c04c7c3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">keithbrown42</media:title>
		</media:content>
	</item>
		<item>
		<title>Keith and Mari ride to Yellowstone</title>
		<link>http://keithbrown42.wordpress.com/2011/10/10/43/</link>
		<comments>http://keithbrown42.wordpress.com/2011/10/10/43/#comments</comments>
		<pubDate>Mon, 10 Oct 2011 23:45:51 +0000</pubDate>
		<dc:creator>Keith Brown</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://keithbrown42.wordpress.com/?p=43</guid>
		<description><![CDATA[Saturday, Oct 8 we headed out from Syracuse UT, riding up I-15 to Brigham City, then through Logan via highway 89, up through Logan Canyon, by Bear Lake, through Idaho and into Wyoming, where we spent the night in Jackson. It was cold. It snowed on us. We skirted some ice patches on the road [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=keithbrown42.wordpress.com&#038;blog=9514285&#038;post=43&#038;subd=keithbrown42&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Saturday, Oct 8 we <a href="http://g.co/maps/xae8t">headed out</a> from Syracuse UT, riding up I-15 to Brigham City, then through Logan via highway 89, up through Logan Canyon, by Bear Lake, through Idaho and into Wyoming, where we spent the night in Jackson.</p>
<p>It was cold. It snowed on us. We skirted some ice patches on the road over a couple of mountain passes. But we dressed warm, cranked up the seat and grip heaters on the <a href="http://www.polarisindustries.com/en-us/victory-motorcycles/touring/vision/pages/overview.aspx?WT.si_n=VIC-top_nav_enter_2012_vision&amp;WT.si_x=1">Vision</a>, and hunkered down. And boy was it worth it. We saw some of the most beautiful fall colors. We didn&#8217;t see a single motorcycle on the road, which meant I could relax and not worry about waving at everyone <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  We did see one motorcycle in Yellowstone park, but I think it was a park ranger. We got lots of attention as we walked around Jackson with our helmets &#8211; lots of folks were admiring the bike. I had more than one guy tell me how bad ass we were to make the ride at this time of year.</p>
<p>The following day we rode through Grand Teton National Park on our way into Yellowstone.</p>
<div id="attachment_53" class="wp-caption alignnone" style="width: 310px"><a href="http://keithbrown42.files.wordpress.com/2011/10/img_0528.jpg"><img class="size-medium wp-image-53" title="IMG_0528" src="http://keithbrown42.files.wordpress.com/2011/10/img_0528.jpg?w=300&#038;h=225" alt="" width="300" height="225" /></a><p class="wp-caption-text">We made it!</p></div>
<p>There were lots of low clouds so our view of the mountains was limited to the foothills on the way in. But the fall foliage was on fire!</p>
<p><a href="http://keithbrown42.files.wordpress.com/2011/10/img_0480.jpg"><img class="alignnone size-medium wp-image-48" title="IMG_0480" src="http://keithbrown42.files.wordpress.com/2011/10/img_0480.jpg?w=300&#038;h=225" alt="" width="300" height="225" /></a></p>
<p>There was a little bit of ice on the road here and there, and I was really careful going over bridges as we rode over mountain passes in Yellowstone. By the time we got to Old Faithful, the day had started warming up quite a bit.</p>

<a href='http://keithbrown42.wordpress.com/2011/10/10/43/img_0466/' title='IMG_0466'><img data-liked='0' data-reblogged='0' data-attachment-id="44" data-orig-file="http://keithbrown42.files.wordpress.com/2011/10/img_0466.jpg" data-orig-size="3648,2736" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;3.2&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;Canon PowerShot A490&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1318082368&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;8.06&quot;,&quot;iso&quot;:&quot;125&quot;,&quot;shutter_speed&quot;:&quot;0.0008&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="IMG_0466" data-image-description="" data-medium-file="http://keithbrown42.files.wordpress.com/2011/10/img_0466.jpg?w=300" data-large-file="http://keithbrown42.files.wordpress.com/2011/10/img_0466.jpg?w=700" width="150" height="112" src="http://keithbrown42.files.wordpress.com/2011/10/img_0466.jpg?w=150&#038;h=112" class="attachment-thumbnail" alt="IMG_0466" /></a>
<a href='http://keithbrown42.wordpress.com/2011/10/10/43/img_0468/' title='IMG_0468'><img data-liked='0' data-reblogged='0' data-attachment-id="45" data-orig-file="http://keithbrown42.files.wordpress.com/2011/10/img_0468.jpg" data-orig-size="3648,2736" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;3.2&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;Canon PowerShot A490&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1318082431&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;8.06&quot;,&quot;iso&quot;:&quot;125&quot;,&quot;shutter_speed&quot;:&quot;0.0008&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="IMG_0468" data-image-description="" data-medium-file="http://keithbrown42.files.wordpress.com/2011/10/img_0468.jpg?w=300" data-large-file="http://keithbrown42.files.wordpress.com/2011/10/img_0468.jpg?w=700" width="150" height="112" src="http://keithbrown42.files.wordpress.com/2011/10/img_0468.jpg?w=150&#038;h=112" class="attachment-thumbnail" alt="Mari was a real trooper - it was about 35F at the top of Bear Lake Summit, lots of fog, snow, and some ice on the road." /></a>
<a href='http://keithbrown42.wordpress.com/2011/10/10/43/img_0473/' title='IMG_0473'><img data-liked='0' data-reblogged='0' data-attachment-id="46" data-orig-file="http://keithbrown42.files.wordpress.com/2011/10/img_0473.jpg" data-orig-size="3648,2736" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;4.5&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;Canon PowerShot A490&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1318086117&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;6.6&quot;,&quot;iso&quot;:&quot;160&quot;,&quot;shutter_speed&quot;:&quot;0.001&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="IMG_0473" data-image-description="" data-medium-file="http://keithbrown42.files.wordpress.com/2011/10/img_0473.jpg?w=300" data-large-file="http://keithbrown42.files.wordpress.com/2011/10/img_0473.jpg?w=700" width="150" height="112" src="http://keithbrown42.files.wordpress.com/2011/10/img_0473.jpg?w=150&#038;h=112" class="attachment-thumbnail" alt="This section of the Snake River was gorgeous. It was so still, like glass." /></a>
<a href='http://keithbrown42.wordpress.com/2011/10/10/43/img_0477/' title='IMG_0477'><img data-liked='0' data-reblogged='0' data-attachment-id="47" data-orig-file="http://keithbrown42.files.wordpress.com/2011/10/img_0477.jpg" data-orig-size="3648,2736" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;3&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;Canon PowerShot A490&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1318086450&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;6.6&quot;,&quot;iso&quot;:&quot;80&quot;,&quot;shutter_speed&quot;:&quot;0.00125&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="IMG_0477" data-image-description="" data-medium-file="http://keithbrown42.files.wordpress.com/2011/10/img_0477.jpg?w=300" data-large-file="http://keithbrown42.files.wordpress.com/2011/10/img_0477.jpg?w=700" width="150" height="112" src="http://keithbrown42.files.wordpress.com/2011/10/img_0477.jpg?w=150&#038;h=112" class="attachment-thumbnail" alt="By the Snake River, on our way to Jackson" /></a>
<a href='http://keithbrown42.wordpress.com/2011/10/10/43/img_0480/' title='IMG_0480'><img data-liked='0' data-reblogged='0' data-attachment-id="48" data-orig-file="http://keithbrown42.files.wordpress.com/2011/10/img_0480.jpg" data-orig-size="3648,2736" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;3&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;Canon PowerShot A490&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1318160533&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;6.6&quot;,&quot;iso&quot;:&quot;160&quot;,&quot;shutter_speed&quot;:&quot;0.0008&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="IMG_0480" data-image-description="" data-medium-file="http://keithbrown42.files.wordpress.com/2011/10/img_0480.jpg?w=300" data-large-file="http://keithbrown42.files.wordpress.com/2011/10/img_0480.jpg?w=700" width="150" height="112" src="http://keithbrown42.files.wordpress.com/2011/10/img_0480.jpg?w=150&#038;h=112" class="attachment-thumbnail" alt="Those aspens in the distance were glowing. This pic doesn&#039;t do it justice!" /></a>
<a href='http://keithbrown42.wordpress.com/2011/10/10/43/img_0490/' title='IMG_0490'><img data-liked='0' data-reblogged='0' data-attachment-id="49" data-orig-file="http://keithbrown42.files.wordpress.com/2011/10/img_0490.jpg" data-orig-size="3648,2736" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;3&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;Canon PowerShot A490&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1318163858&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;6.6&quot;,&quot;iso&quot;:&quot;160&quot;,&quot;shutter_speed&quot;:&quot;0.0008&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="IMG_0490" data-image-description="" data-medium-file="http://keithbrown42.files.wordpress.com/2011/10/img_0490.jpg?w=300" data-large-file="http://keithbrown42.files.wordpress.com/2011/10/img_0490.jpg?w=700" width="150" height="112" src="http://keithbrown42.files.wordpress.com/2011/10/img_0490.jpg?w=150&#038;h=112" class="attachment-thumbnail" alt="IMG_0490" /></a>
<a href='http://keithbrown42.wordpress.com/2011/10/10/43/img_0495/' title='IMG_0495'><img data-liked='0' data-reblogged='0' data-attachment-id="50" data-orig-file="http://keithbrown42.files.wordpress.com/2011/10/img_0495.jpg" data-orig-size="2736,3648" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;3&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;Canon PowerShot A490&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1318166409&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;6.6&quot;,&quot;iso&quot;:&quot;160&quot;,&quot;shutter_speed&quot;:&quot;0.001&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="IMG_0495" data-image-description="" data-medium-file="http://keithbrown42.files.wordpress.com/2011/10/img_0495.jpg?w=225" data-large-file="http://keithbrown42.files.wordpress.com/2011/10/img_0495.jpg?w=525" width="112" height="150" src="http://keithbrown42.files.wordpress.com/2011/10/img_0495.jpg?w=112&#038;h=150" class="attachment-thumbnail" alt="Mari&#039;s a bit afraid of heights :-)" /></a>
<a href='http://keithbrown42.wordpress.com/2011/10/10/43/img_0498/' title='IMG_0498'><img data-liked='0' data-reblogged='0' data-attachment-id="51" data-orig-file="http://keithbrown42.files.wordpress.com/2011/10/img_0498-e1318290396943.jpg" data-orig-size="2736,3648" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;5.8&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;Canon PowerShot A490&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1318166493&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;21.6&quot;,&quot;iso&quot;:&quot;125&quot;,&quot;shutter_speed&quot;:&quot;0.004&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="IMG_0498" data-image-description="" data-medium-file="http://keithbrown42.files.wordpress.com/2011/10/img_0498-e1318290396943.jpg?w=225" data-large-file="http://keithbrown42.files.wordpress.com/2011/10/img_0498-e1318290396943.jpg?w=525" width="112" height="150" src="http://keithbrown42.files.wordpress.com/2011/10/img_0498-e1318290396943.jpg?w=112&#038;h=150" class="attachment-thumbnail" alt="Kepler Cascades" /></a>
<a href='http://keithbrown42.wordpress.com/2011/10/10/43/img_0516/' title='IMG_0516'><img data-liked='0' data-reblogged='0' data-attachment-id="52" data-orig-file="http://keithbrown42.files.wordpress.com/2011/10/img_0516.jpg" data-orig-size="3648,2736" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;4.5&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;Canon PowerShot A490&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1318174724&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;6.6&quot;,&quot;iso&quot;:&quot;80&quot;,&quot;shutter_speed&quot;:&quot;0.00125&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="IMG_0516" data-image-description="" data-medium-file="http://keithbrown42.files.wordpress.com/2011/10/img_0516.jpg?w=300" data-large-file="http://keithbrown42.files.wordpress.com/2011/10/img_0516.jpg?w=700" width="150" height="112" src="http://keithbrown42.files.wordpress.com/2011/10/img_0516.jpg?w=150&#038;h=112" class="attachment-thumbnail" alt="IMG_0516" /></a>
<a href='http://keithbrown42.wordpress.com/2011/10/10/43/img_0528/' title='IMG_0528'><img data-liked='0' data-reblogged='0' data-attachment-id="53" data-orig-file="http://keithbrown42.files.wordpress.com/2011/10/img_0528.jpg" data-orig-size="3648,2736" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;3&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;Canon PowerShot A490&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1318179526&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;6.6&quot;,&quot;iso&quot;:&quot;160&quot;,&quot;shutter_speed&quot;:&quot;0.002&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="IMG_0528" data-image-description="" data-medium-file="http://keithbrown42.files.wordpress.com/2011/10/img_0528.jpg?w=300" data-large-file="http://keithbrown42.files.wordpress.com/2011/10/img_0528.jpg?w=700" width="150" height="112" src="http://keithbrown42.files.wordpress.com/2011/10/img_0528.jpg?w=150&#038;h=112" class="attachment-thumbnail" alt="We made it!" /></a>
<a href='http://keithbrown42.wordpress.com/2011/10/10/43/img_0493/' title='IMG_0493'><img data-liked='0' data-reblogged='0' data-attachment-id="54" data-orig-file="http://keithbrown42.files.wordpress.com/2011/10/img_0493.jpg" data-orig-size="3648,2736" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;4.5&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;Canon PowerShot A490&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1318165569&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;6.6&quot;,&quot;iso&quot;:&quot;160&quot;,&quot;shutter_speed&quot;:&quot;0.000625&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="IMG_0493" data-image-description="" data-medium-file="http://keithbrown42.files.wordpress.com/2011/10/img_0493.jpg?w=300" data-large-file="http://keithbrown42.files.wordpress.com/2011/10/img_0493.jpg?w=700" width="150" height="112" src="http://keithbrown42.files.wordpress.com/2011/10/img_0493.jpg?w=150&#038;h=112" class="attachment-thumbnail" alt="Lily pads on a small lake on a mountain pass in Yellowstone park" /></a>

<p>When it hit 50F we were pretty happy <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  It was pretty chilly riding back to Jackson that evening, but we got in before dark and warmed up in the hot tub at the Elk Country Inn before going out for a delicious dinner at Thai Me Up (if you&#8217;re hungry for some Thai in Jackson, be sure to visit them &#8211; their home brewed beers are delicious).</p>
<p>The next day was partly cloudy and still a bit chilly as we headed back home. We added some hand and feet warmers to our attire and Mari picked up a neck gator. We stopped in Alpine, WY for a late breakfast at Yankee Doodle&#8217;s &#8211; Stephen Colbert would love this joint. Delicious food, and an incredible attention to detail as everything in the restaurant was red white and blue.</p>
<p>As we rode South, the day continued to warm until we were riding through Idaho at a comfortable 54F. By the time we got back into our hometown of Syracuse, UT, the temp was up to 64F and there were several motorcycles out and about.</p>
<p>It was quite an adventure. I was ready to turn around at the first sign of trouble, but we stuck it out and it was well worth it!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/keithbrown42.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/keithbrown42.wordpress.com/43/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=keithbrown42.wordpress.com&#038;blog=9514285&#038;post=43&#038;subd=keithbrown42&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://keithbrown42.wordpress.com/2011/10/10/43/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/5116c31b42219bb646ba8ed67c04c7c3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">keithbrown42</media:title>
		</media:content>

		<media:content url="http://keithbrown42.files.wordpress.com/2011/10/img_0528.jpg?w=300" medium="image">
			<media:title type="html">IMG_0528</media:title>
		</media:content>

		<media:content url="http://keithbrown42.files.wordpress.com/2011/10/img_0480.jpg?w=300" medium="image">
			<media:title type="html">IMG_0480</media:title>
		</media:content>

		<media:content url="http://keithbrown42.files.wordpress.com/2011/10/img_0466.jpg?w=150" medium="image">
			<media:title type="html">IMG_0466</media:title>
		</media:content>

		<media:content url="http://keithbrown42.files.wordpress.com/2011/10/img_0468.jpg?w=150" medium="image">
			<media:title type="html">Mari was a real trooper - it was about 35F at the top of Bear Lake Summit, lots of fog, snow, and some ice on the road.</media:title>
		</media:content>

		<media:content url="http://keithbrown42.files.wordpress.com/2011/10/img_0473.jpg?w=150" medium="image">
			<media:title type="html">This section of the Snake River was gorgeous. It was so still, like glass.</media:title>
		</media:content>

		<media:content url="http://keithbrown42.files.wordpress.com/2011/10/img_0477.jpg?w=150" medium="image">
			<media:title type="html">By the Snake River, on our way to Jackson</media:title>
		</media:content>

		<media:content url="http://keithbrown42.files.wordpress.com/2011/10/img_0480.jpg?w=150" medium="image">
			<media:title type="html">Those aspens in the distance were glowing. This pic doesn&#039;t do it justice!</media:title>
		</media:content>

		<media:content url="http://keithbrown42.files.wordpress.com/2011/10/img_0490.jpg?w=150" medium="image">
			<media:title type="html">IMG_0490</media:title>
		</media:content>

		<media:content url="http://keithbrown42.files.wordpress.com/2011/10/img_0495.jpg?w=112" medium="image">
			<media:title type="html">Mari&#039;s a bit afraid of heights :-)</media:title>
		</media:content>

		<media:content url="http://keithbrown42.files.wordpress.com/2011/10/img_0498-e1318290396943.jpg?w=112" medium="image">
			<media:title type="html">Kepler Cascades</media:title>
		</media:content>

		<media:content url="http://keithbrown42.files.wordpress.com/2011/10/img_0516.jpg?w=150" medium="image">
			<media:title type="html">IMG_0516</media:title>
		</media:content>

		<media:content url="http://keithbrown42.files.wordpress.com/2011/10/img_0528.jpg?w=150" medium="image">
			<media:title type="html">We made it!</media:title>
		</media:content>

		<media:content url="http://keithbrown42.files.wordpress.com/2011/10/img_0493.jpg?w=150" medium="image">
			<media:title type="html">Lily pads on a small lake on a mountain pass in Yellowstone park</media:title>
		</media:content>
	</item>
		<item>
		<title>IEnumerable considered ambiguous</title>
		<link>http://keithbrown42.wordpress.com/2011/08/03/ienumerable-considered-ambiguous/</link>
		<comments>http://keithbrown42.wordpress.com/2011/08/03/ienumerable-considered-ambiguous/#comments</comments>
		<pubDate>Wed, 03 Aug 2011 13:36:16 +0000</pubDate>
		<dc:creator>Keith Brown</dc:creator>
				<category><![CDATA[Modeling]]></category>

		<guid isPermaLink="false">http://keithbrown42.wordpress.com/?p=38</guid>
		<description><![CDATA[It&#8217;s tempting to use IEnumerable&#60;T&#62; liberally in public APIs as a &#8220;least common denominator&#8221; interface that can represent any collection of objects. Consider two very different things that could be lurking behind an IEnumerable&#60;T&#62;: A: An in-memory collection such as an array or list. B: A lazily evaluated fire hose that hides complex network logic [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=keithbrown42.wordpress.com&#038;blog=9514285&#038;post=38&#038;subd=keithbrown42&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>It&#8217;s tempting to use IEnumerable&lt;T&gt; liberally in public APIs as a &#8220;least common denominator&#8221; interface that can represent any collection of objects.</p>
<p>Consider two very different things that could be lurking behind an IEnumerable&lt;T&gt;:</p>
<p>A: An in-memory collection such as an array or list.</p>
<p>B: A lazily evaluated fire hose that hides complex network logic that makes batch requests and yields objects from those batches.</p>
<p>For (A) it&#8217;s safe to enumerate the collection multiple times, use the Count() extension, transform with ToList/ToArray, etc. while it could be disastrous to do the same with (B).</p>
<p>How are you supposed to know what you&#8217;re getting when someone hands you an IEnumerable&lt;T&gt;? In the vast majority of cases, you&#8217;ve probably got (A). Indeed, most programmers will assume this and program against it as an in-memory collection, and they&#8217;ll run into trouble (perf problems or worse) when they encounter (B).</p>
<p>Consider a method that takes an IEnumerable&lt;T&gt; as an input. Is it safe to pass a (B) to that method? It&#8217;s impossible to know without looking at the implementation.</p>
<p>You could take an IList&lt;T&gt; or an ICollection&lt;T&gt; instead, but these interfaces have mutators on them, which introduces additional ambiguity &#8211; does your method modify the collection being passed in?</p>
<p>I&#8217;m curious to know what conventions others are using to deal with this ambiguity.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/keithbrown42.wordpress.com/38/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/keithbrown42.wordpress.com/38/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=keithbrown42.wordpress.com&#038;blog=9514285&#038;post=38&#038;subd=keithbrown42&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://keithbrown42.wordpress.com/2011/08/03/ienumerable-considered-ambiguous/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/5116c31b42219bb646ba8ed67c04c7c3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">keithbrown42</media:title>
		</media:content>
	</item>
		<item>
		<title>Immutable objects in C#</title>
		<link>http://keithbrown42.wordpress.com/2011/07/01/immutable-objects-in-c/</link>
		<comments>http://keithbrown42.wordpress.com/2011/07/01/immutable-objects-in-c/#comments</comments>
		<pubDate>Fri, 01 Jul 2011 12:24:33 +0000</pubDate>
		<dc:creator>Keith Brown</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://keithbrown42.wordpress.com/?p=31</guid>
		<description><![CDATA[Recently I posted about how I use C# named parameters to clarify my intent when I call a method that takes arguments of the same type. Well, here&#8217;s an even better use for them: designing immutable objects. Sure you can hide an object&#8217;s state behind public methods and property getters, but if you really want [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=keithbrown42.wordpress.com&#038;blog=9514285&#038;post=31&#038;subd=keithbrown42&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Recently I posted about how I use <a href="http://keithbrown42.wordpress.com/2011/06/22/use-c-named-parameters/">C# named parameters</a> to clarify my intent when I call a method that takes arguments of the same type. Well, here&#8217;s an even better use for them: designing <a href="http://en.wikipedia.org/wiki/Immutable_object">immutable objects</a>.</p>
<p>Sure you can hide an object&#8217;s state behind public methods and property getters, but if you really want to encourage immutable objects, you should consider implementing the class&#8217;s internal state via readonly fields. Indeed it becomes as simple as this:</p>
<pre>public class Cooldown {
  public readonly string Ability;
  public readonly DateTime ExpiresOn;
  // ... several more fields

  public Cooldown(string ability, DateTime expiresOn, ...)
  {
    Ability = ability;
    ExpiresOn = expiresOn;
    // etc.
  }
}</pre>
<p>Prior to .NET 4.0 this wasn&#8217;t very easy to do. And that&#8217;s because objects in C# with readonly fields require that those fields be initialized by a constructor, and a constructor can get pretty big if all of the fields are readonly. But this awkwardness goes away with .NET 4.0. Now I can construct a readonly object and not loose any clarity around what data is going where:</p>
<pre>new Cooldown(
  ability: "Invisibility",
  expiresOn: DateTime.UtcNow.AddSeconds(30),
  ...);</pre>
<p>In his book, <a href="http://domaindrivendesign.org/books/evans_2003">Domain Driven Design</a> (DDD), Eric Evans encourages the use of <a href="http://domaindrivendesign.org/node/135">Value Objects</a> in domain models. Here at Pluralsight we are using the DDD approach to modeling, and we are taking his advice and using immutable objects to implement all of our Value Objects in the domain. What we&#8217;re finding is that we are programming in C# but our code is becoming more and more <a href="http://en.wikipedia.org/wiki/Functional_programming">functional</a> in nature, which feels like a good thing. Less mutable state tends to make things easier to test, and tends to reduce bugs.</p>
<p>The one gotcha to all of this is that until mainstream serializers and O/R mappers know how to use constructors to initialize Value Objects, we won&#8217;t be able to use them directly to persist our entities. Here at Pluralsight we think the sanctity of our domain layer deserves a corresponding set of serializer-friendly data transfer objects, and we&#8217;re taking the time to completely isolate our domain from our persistence logic. Not everyone is willing to go to that extreme, in which case they won&#8217;t be able to benefit from this today in their domain model. I&#8217;m hopeful in the future we&#8217;ll have serializers and O/R mappers that recognize the importance of readonly fields and add support for constructor-based deserialization.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/keithbrown42.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/keithbrown42.wordpress.com/31/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=keithbrown42.wordpress.com&#038;blog=9514285&#038;post=31&#038;subd=keithbrown42&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://keithbrown42.wordpress.com/2011/07/01/immutable-objects-in-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/5116c31b42219bb646ba8ed67c04c7c3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">keithbrown42</media:title>
		</media:content>
	</item>
		<item>
		<title>Taking executable specs to the next level: Executable Documentation</title>
		<link>http://keithbrown42.wordpress.com/2011/06/26/taking-executable-specs-to-the-next-level-executable-documentation/</link>
		<comments>http://keithbrown42.wordpress.com/2011/06/26/taking-executable-specs-to-the-next-level-executable-documentation/#comments</comments>
		<pubDate>Sun, 26 Jun 2011 15:54:40 +0000</pubDate>
		<dc:creator>Keith Brown</dc:creator>
				<category><![CDATA[Modeling]]></category>

		<guid isPermaLink="false">http://keithbrown42.wordpress.com/?p=23</guid>
		<description><![CDATA[Here at Pluralsight, we&#8217;ve been using Machine.Specifications (mspec) for a little over a year now to implement our unit tests. Given how quickly formal documentation goes out of sync with code, many people smarter than me have advocated that unit tests can be used as documentation for a class. And this might work, if a) The [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=keithbrown42.wordpress.com&#038;blog=9514285&#038;post=23&#038;subd=keithbrown42&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Here at Pluralsight, we&#8217;ve been using Machine.Specifications (mspec) for a little over a year now to implement our unit tests. Given how quickly formal documentation goes out of sync with code, many people smarter than me have advocated that unit tests can be used as documentation for a class. And this might work, if</p>
<p>a) The question you have is very specific (e.g. you can do a FindUsages on a method/property and quickly see the tests that exercise it), and</p>
<p>b) A test exists that exercises the method/property you&#8217;re trying to understand.</p>
<p>This morning I had a look at the specs for one of our <a href="http://lostechies.com/jimmybogard/2008/05/21/entities-value-objects-aggregates-and-roots/">aggregate roots</a> that resulted from its TDD to see if it was adequately documenting its public API, lifecycle semantics, etc. What I saw was a jumbled mess of specs that weren&#8217;t designed at all to focus on what a user of that class cares about. Don&#8217;t get me wrong &#8211; the specs we had in place were all very helpful, but they were focused on testing little bits of functionality, much of which was internal to the package. And even if I could filter out the internal stuff and just leave the specs covering the public APIs, there was no order to any of it. I couldn&#8217;t look at my specs and figure out how the class should be used, from its creation through its various states, until it&#8217;s archival. Its lifecycle wasn&#8217;t clear.</p>
<p>Plus, the language of the spec wasn&#8217;t focused on being readable for an end user. When I look at a typical specification that I wrote during TDD, I saw something like this:</p>
<p>When making an invoice</p>
<ul>
<li>Should have a date of Now</li>
<li>Should have the customers name</li>
<li>Should have no items</li>
</ul>
<p>This is perfectly fine as a unit test, but isn&#8217;t quite what I want for documentation. Here&#8217;s language that I think would be more helpful as documentation. Note how I use the actual names from the public API:</p>
<p>When you invoke MakeInvoice on an InvoiceFactory the new Invoice</p>
<ul>
<li>Has todays date</li>
<li>Has the customers name</li>
<li>Does not have any items</li>
</ul>
<p>Heck, I can write specs like that. So I figured I&#8217;d give it a try this morning. The exercise was very enlightening.</p>
<p>Leaving all of my existing unit testing specs in place, I added a new folder, InvoiceDocs, and I wrote additional specs to act as &#8220;executable documentation&#8221; for the Invoice class. Here&#8217;s what I did in InvoiceDocs:</p>
<ul>
<li>I added specs covering the entire public API of the Invoice class, omitting anything that wasn&#8217;t useful to a client of the class</li>
<li>I *ordered* the specs so they showed the lifecycle of the Invoice class, from creation to archival, documenting the exact API names for a newcomer</li>
<li>I used language that would be approachable for a newcomer</li>
</ul>
<p>And in the process, I learned some things. I now know how to create executable documentation for my public API as I develop the class using TDD. Next time I will write specs for my public API in a separate *Docs folder using these conventions as I TDD. As I wrote my documentation specs, I found some things that were awkward to document. This led me to refactor my domain model to make it easier to document, which naturally made it easier to use. I found the executable documentation driving me to <a href="http://www.togsblom.com/2009/10/refactoring-toward-deeper-insight.html">refactor toward deeper insight</a>. Very cool &#8211; as if we don&#8217;t have enough ways to &#8220;drive&#8221; design, now we have &#8220;documentation driven design&#8221; <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>When all was said and done, I ended up with executable documentation that will fail the build if it&#8217;s not correct. Kind of. There&#8217;s still one flaw that we should think about fixing together. In MSpec the &#8220;When&#8221; statement is driven by a class name. Embedding API names in the class name isn&#8217;t something that will lend itself well to refactoring, and this will get out of date unless I am vigilant. So the solution is far from perfect. It&#8217;d be very cool if we could have the option of putting the When statement into an expression of some sort so that the names of APIs would be part of an expression that can be refactored. One step at a time, I guess.</p>
<p>It took me a few iterations to figure out how to get my specs to show up in a nice, ordered fashion in the test runner. After a few initial attempts at adding numbers to the class/file names, I realized I could simply use the Subject attribute of each specification to order my tests appropriately. The namespace was already stating the subject, so this didn&#8217;t seem to hurt anything, but I&#8217;d like to start a conversation around better ways of ordering tests/specs in runners so that we can start accomplishing this more naturally. Here&#8217;s what one of these &#8220;ordered&#8221; specs look like:</p>
<pre>    [Subject("01")]
    public class When_you_invoke_MakeInvoice_on_an_InvoiceFactory_the_new_Invoice
    {
        // ...
    }</pre>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/keithbrown42.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/keithbrown42.wordpress.com/23/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=keithbrown42.wordpress.com&#038;blog=9514285&#038;post=23&#038;subd=keithbrown42&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://keithbrown42.wordpress.com/2011/06/26/taking-executable-specs-to-the-next-level-executable-documentation/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/5116c31b42219bb646ba8ed67c04c7c3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">keithbrown42</media:title>
		</media:content>
	</item>
		<item>
		<title>Use C# named parameters</title>
		<link>http://keithbrown42.wordpress.com/2011/06/22/use-c-named-parameters/</link>
		<comments>http://keithbrown42.wordpress.com/2011/06/22/use-c-named-parameters/#comments</comments>
		<pubDate>Wed, 22 Jun 2011 13:03:33 +0000</pubDate>
		<dc:creator>Keith Brown</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://keithbrown42.wordpress.com/?p=21</guid>
		<description><![CDATA[As of .NET version 4.0, C# supports named and optional arguments. This comes in really handy for distinguishing method parameters that have the same type. For example: public interface IGenerator&#60;T&#62; { T Generate(T min, T max); } It would be really easy to accidentally pass arguments to Generate in the wrong order, since they have the [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=keithbrown42.wordpress.com&#038;blog=9514285&#038;post=21&#038;subd=keithbrown42&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>As of .NET version 4.0, C# supports <a href="http://msdn.microsoft.com/en-us/library/dd264739.aspx">named and optional arguments</a>. This comes in really handy for distinguishing method parameters that have the same type. For example:</p>
<pre>public interface IGenerator&lt;T&gt;
{
    T Generate(T min, T max);
}</pre>
<p>It would be really easy to accidentally pass arguments to Generate in the wrong order, since they have the same type. But using named arguments, you can be a little bit more explicit, which helps reduce the chance you&#8217;ll screw up:</p>
<p>var n = generator.Generate(min: 0, max: 42);</p>
<p>I try to follow the rule that no method should take more than two arguments, so I end up using this technique most often with constructors, which often need to take a lot of parameters. But more on that in another post&#8230;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/keithbrown42.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/keithbrown42.wordpress.com/21/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=keithbrown42.wordpress.com&#038;blog=9514285&#038;post=21&#038;subd=keithbrown42&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://keithbrown42.wordpress.com/2011/06/22/use-c-named-parameters/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/5116c31b42219bb646ba8ed67c04c7c3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">keithbrown42</media:title>
		</media:content>
	</item>
		<item>
		<title>Managing .SLN files</title>
		<link>http://keithbrown42.wordpress.com/2011/06/18/managing-sln-files/</link>
		<comments>http://keithbrown42.wordpress.com/2011/06/18/managing-sln-files/#comments</comments>
		<pubDate>Sat, 18 Jun 2011 16:58:34 +0000</pubDate>
		<dc:creator>Keith Brown</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://keithbrown42.wordpress.com/?p=18</guid>
		<description><![CDATA[At Pluralsight, we&#8217;ve got one large .SLN file that we use to build all of our artifacts, but on a daily basis, assuming I&#8217;m not doing any major refactoring, I want to work in a smaller solution that only pulls in the projects that are necessary for the story I&#8217;m working on that moment. I [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=keithbrown42.wordpress.com&#038;blog=9514285&#038;post=18&#038;subd=keithbrown42&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>At Pluralsight, we&#8217;ve got one large .SLN file that we use to build all of our artifacts, but on a daily basis, assuming I&#8217;m not doing any major refactoring, I want to work in a smaller solution that only pulls in the projects that are necessary for the story I&#8217;m working on that moment.</p>
<p>I used to check in those smaller .SLN files, which became quite a headache to manage when I wanted to rename/move a project, especially one in our core domain model, because I&#8217;d need to go update all of those little .SLN files that depend on the renamed/moved project. Ugh.</p>
<p>Today I was going to sit down and write a tool to help me manage this. So I started by looking to see if anyone else has done this already, and voilà! I came across a CodePlex project, <a href="http://slntools.codeplex.com/">Tools for SLN file (Visual Studio Solution file)</a>. With this tool, I can create little filter files that describe the &#8220;filtered&#8221; views I&#8217;d like to use on my big .SLN file. There&#8217;s a nifty dialog that lets me pull in projects (it automatically pulls in dependencies as well, which is exactly what I needed). I end up with a double-clickable &#8220;.slnfilter&#8221; file that creates a .SLN file on the fly with just the bits you need from the original .SLN file. Perfect!</p>
<p>I&#8217;m going to be deleting all of those little .SLN files I have checked into source control and start checking in .slnfilter files instead, which are tiny XML files that are really easy to manage.</p>
<p>Kudos to Christian Warren for sharing this tool with the community!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/keithbrown42.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/keithbrown42.wordpress.com/18/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=keithbrown42.wordpress.com&#038;blog=9514285&#038;post=18&#038;subd=keithbrown42&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://keithbrown42.wordpress.com/2011/06/18/managing-sln-files/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/5116c31b42219bb646ba8ed67c04c7c3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">keithbrown42</media:title>
		</media:content>
	</item>
		<item>
		<title>Domain Driven Design &#8211; Not Quickly, Please.</title>
		<link>http://keithbrown42.wordpress.com/2011/06/16/domain-driven-design-not-quickly-please/</link>
		<comments>http://keithbrown42.wordpress.com/2011/06/16/domain-driven-design-not-quickly-please/#comments</comments>
		<pubDate>Thu, 16 Jun 2011 13:56:31 +0000</pubDate>
		<dc:creator>Keith Brown</dc:creator>
				<category><![CDATA[Modeling]]></category>

		<guid isPermaLink="false">http://keithbrown42.wordpress.com/?p=15</guid>
		<description><![CDATA[In an attempt to learn the technique of Domain-Driven Design (book by Eric Evans), I took a shortcut about a year ago and read Domain Driven Design Quickly. Why? Primarily because I believed the reviewers on Amazon who said the Evans book was verbose, redundant, etc. and like anyone on a tight time schedule, I wanted [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=keithbrown42.wordpress.com&#038;blog=9514285&#038;post=15&#038;subd=keithbrown42&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>In an attempt to learn the technique of <a href="http://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215">Domain-Driven Design</a> (book by <a href="http://domaindrivendesign.org/about">Eric Evans</a>), I took a shortcut about a year ago and read <a href="http://www.infoq.com/minibooks/domain-driven-design-quickly">Domain Driven Design Quickly</a>. Why? Primarily because I believed the reviewers on Amazon who said the Evans book was verbose, redundant, etc. and like anyone on a tight time schedule, I wanted a quick fix.</p>
<p>And indeed I got what I paid for (the<a href="http://www.infoq.com/minibooks/domain-driven-design-quickly"> &#8220;quickly&#8221; PDF</a> is free). I learned just enough to be dangerous.</p>
<p>Don&#8217;t believe the reviews on Amazon who diss the <a href="http://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215">Evans book</a>. I&#8217;m almost finished reading it, and I can say unequivocally that this book is the culmination of knowledge from many sources, pulling together patterns into a very comprehensible design framework for building complex software systems that last using object oriented techniques.</p>
<p>The <a href="http://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215">Evans book</a> is not a trivial read by any stretch, but it&#8217;s well worth it. It&#8217;s practical, well rooted in reality, and doesn&#8217;t try to sell you some framework or other silver bullet that will solve all your problems. It gives you techniques to organize your code and strategies on where to focus your efforts in order to build lasting object-oriented systems.</p>
<p>If you&#8217;re using a domain model, it&#8217;s by far the most important asset of your project. You&#8217;d be crazy to skimp on it. So why skimp on learning how to design it? If you want to learn Domain-Driven Design, don&#8217;t try to do it quickly. Take the time and read the <a href="http://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215">Evans book</a> from cover to cover.</p>
<p>It&#8217;s now required reading for my team at Pluralsight.</p>
<p>Kudos, Eric!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/keithbrown42.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/keithbrown42.wordpress.com/15/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=keithbrown42.wordpress.com&#038;blog=9514285&#038;post=15&#038;subd=keithbrown42&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://keithbrown42.wordpress.com/2011/06/16/domain-driven-design-not-quickly-please/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/5116c31b42219bb646ba8ed67c04c7c3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">keithbrown42</media:title>
		</media:content>
	</item>
		<item>
		<title>ASP.NET MVC Model Binding and Complex Types</title>
		<link>http://keithbrown42.wordpress.com/2011/03/25/asp-net-mvc-model-binding-and-complex-types-2/</link>
		<comments>http://keithbrown42.wordpress.com/2011/03/25/asp-net-mvc-model-binding-and-complex-types-2/#comments</comments>
		<pubDate>Fri, 25 Mar 2011 19:07:05 +0000</pubDate>
		<dc:creator>Keith Brown</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">https://keithbrown42.wordpress.com/2011/03/25/asp-net-mvc-model-binding-and-complex-types-2/</guid>
		<description><![CDATA[The other day I ran into a weird model binding issue that took me awhile to debug. We identify our modules by an author name and a module name: public class ModuleRef { public string AuthorName; public string ModuleName; } I had a controller action that took this as an argument: public class MyController { [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=keithbrown42.wordpress.com&#038;blog=9514285&#038;post=10&#038;subd=keithbrown42&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>The other day I ran into a weird model binding issue that took me awhile to debug. We identify our modules by an author name and a module name:</p>
<pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">class</span> ModuleRef
{
    <span class="kwrd">public</span> <span class="kwrd">string</span> AuthorName;
    <span class="kwrd">public</span> <span class="kwrd">string</span> ModuleName;
}</pre>
<p>I had a controller action that took this as an argument:</p>
<pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">class</span> MyController
{
    ActionResult MyAction(ModuleRef moduleRef) {...}
}</pre>
<p>Everything was working great until at some point I added a type converter to ModuleRef that allowed it to be converted from a string. This allowed me to serialize it back and forth as a dictionary key in RavenDB (our NOSQL database):</p>
<pre class="csharpcode">[TypeConverter(<span class="kwrd">typeof</span>(ModuleRefTypeConverter))]
<span class="kwrd">public</span> <span class="kwrd">class</span> ModuleRef
{
    <span class="kwrd">public</span> <span class="kwrd">string</span> AuthorName;
    <span class="kwrd">public</span> <span class="kwrd">string</span> ModuleName;
}</pre>
<p>Not long after this change went live, requests to MyAction started failing. The ModuleRef argument was arriving as null &#8211; the default model binder was no longer able to bind it.</p>
<p>In order to debug the problem, I <a href="http://blog.stevensanderson.com/2009/02/03/using-the-aspnet-mvc-source-code-to-debug-your-app/">added the MVC source code as a project so that I could debug the default model binder</a>. I noticed right away that the ModelMetadata being pulled up for ModuleRef was treating it like a simple type. I looked at the value providers, and they correctly had the parts of the model (prefixes AuthorName and ModuleName), and it should have bound just fine except for the fact that ModelMetadata.IsComplexType was answering false. This was causing the default model binder to look for a single string value with a prefix of &quot;moduleRef&quot;, which didn&#8217;t exist in the request.</p>
<p>Here&#8217;s the implementation of ModelMetadata.IsComplexType:</p>
<pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">virtual</span> <span class="kwrd">bool</span> IsComplexType {
    get {
        <span class="kwrd">return</span> !(TypeDescriptor.GetConverter(ModelType)
            .CanConvertFrom(<span class="kwrd">typeof</span>(<span class="kwrd">string</span>)));
    }
}</pre>
<p>&#8230;and all of a sudden I remembered the type converter I&#8217;d added the other day. Clearly this wasn&#8217;t going to work &#8211; the request I was binding did not have a single value that could be converted into a ModuleRef &#8211; it needed to be bound the normal way.</p>
<p>I first tried solving the problem by deriving a class from ModuleRef, hoping that TypeConverterAttribute didn&#8217;t propagate via inheritance. But alas it does. So that attempt failed, and I ended up created a new model to use with binding (same properties, just a different class). This solved the problem.</p>
<p>Very strange, but I hope this helps if someone else runs into this problem.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/keithbrown42.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/keithbrown42.wordpress.com/10/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=keithbrown42.wordpress.com&#038;blog=9514285&#038;post=10&#038;subd=keithbrown42&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://keithbrown42.wordpress.com/2011/03/25/asp-net-mvc-model-binding-and-complex-types-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/5116c31b42219bb646ba8ed67c04c7c3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">keithbrown42</media:title>
		</media:content>
	</item>
	</channel>
</rss>
