<?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>Christopher Keslin</title>
	<atom:link href="http://www.ktsc.com/blogs/ChristopherKeslin/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ktsc.com/blogs/ChristopherKeslin</link>
	<description>Managing Excellence in Information Technology</description>
	<lastBuildDate>Tue, 12 Jan 2010 03:19:35 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>A new home&#8230;</title>
		<link>http://www.ktsc.com/blogs/ChristopherKeslin/2010/01/11/a-new-home/</link>
		<comments>http://www.ktsc.com/blogs/ChristopherKeslin/2010/01/11/a-new-home/#comments</comments>
		<pubDate>Tue, 12 Jan 2010 03:18:28 +0000</pubDate>
		<dc:creator>Christopher Keslin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.ktsc.com/blogs/ChristopherKeslin/?p=32</guid>
		<description><![CDATA[As part of the transition into my new role as an Associate Partner at Capax Global I&#8217;m moving my blog over to the company system.  New posts can be found here.  Hope to see you there!
]]></description>
			<content:encoded><![CDATA[<p>As part of the transition into my new role as an Associate Partner at <a title="Capax Global" href="http://www.CapaxGlobal.com" target="_blank">Capax Global</a> I&#8217;m moving my blog over to the company system.  New posts can be found <a title="here" href="http://blogs.CapaxGlobal.com/ChristopherKeslin">here</a>.  Hope to see you there!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ktsc.com/blogs/ChristopherKeslin/2010/01/11/a-new-home/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Amazing upgrade &#8211; Samsung Solid State 64GB Drive</title>
		<link>http://www.ktsc.com/blogs/ChristopherKeslin/2008/09/25/amazing-upgrade-samsung-solid-state-64gb-drive/</link>
		<comments>http://www.ktsc.com/blogs/ChristopherKeslin/2008/09/25/amazing-upgrade-samsung-solid-state-64gb-drive/#comments</comments>
		<pubDate>Thu, 25 Sep 2008 16:30:16 +0000</pubDate>
		<dc:creator>Christopher Keslin</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://www.ktsc.com/blogs/ChristopherKeslin/?p=20</guid>
		<description><![CDATA[All I have to say is WOW.  If you want to breath new life into laptop or even workstation read on&#8230;
I have to stick with Vista as my primary work horse because the majority of my time is spent developing applications that require IIS7 (WAS).  While VMs are an option and I use them for many different [...]]]></description>
			<content:encoded><![CDATA[<p>All I have to say is WOW.  If you want to breath new life into laptop or even workstation read on&#8230;</p>
<p>I have to stick with Vista as my primary work horse because the majority of my time is spent developing applications that require IIS7 (WAS).  While VMs are an option and I use them for many different development tasks, they are quite a bit slower and I&#8217;m not working on a lot of different projects these days. </p>
<p>My primary development machine is a lenovo (IBM) T60 Thinkpad w/ 4GB RAM and two 100GB 7200RPM SATA internal drives w/ Vista x64 Business installed.  A fairly beefy laptop and I&#8217;ve been really happy with its performance, but once it starts swapping it can get rather SLOW&#8230;  Some digging revealed it was disk I/O I was waiting on most the time, enter the SDD to the rescue.</p>
<p>After getting everything reinstalled and working with the new configuration I noticed some improvement but it just didn&#8217;t jump out at me.  Boot time was the most notable change going from 4 minutes from power to usable down to approximately 90 seconds from power to usable.  A boost to say the least but not the productivity enhancer I was hoping for.</p>
<p>Then it happened, I ran into an issue that would be faster to just plug in my old hard drive to take care of than going through the process of configuring my laptop to work on the problem at hand.  After going through the painful boot up and loading visual studio I couldn&#8217;t believe how slow the computer was.  Visual Studio was constantly performing disk I/O (most likely resharper&#8217;s cache) and everything just seemed to crawl once I had three instances of VS 2008 up and running.</p>
<p>All in all I&#8217;m extremely happy with the purchase and realize that I just can&#8217;t go back to 7200 RPM laptop drives *sigh*&#8230;  Hopefully the prices on the SDD&#8217;s will keep coming down, and soon <img src='http://www.ktsc.com/blogs/ChristopherKeslin/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.ktsc.com/blogs/ChristopherKeslin/2008/09/25/amazing-upgrade-samsung-solid-state-64gb-drive/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>WPF running under IIS no more&#8230;</title>
		<link>http://www.ktsc.com/blogs/ChristopherKeslin/2008/08/13/wpf-running-under-iis-no-more/</link>
		<comments>http://www.ktsc.com/blogs/ChristopherKeslin/2008/08/13/wpf-running-under-iis-no-more/#comments</comments>
		<pubDate>Thu, 14 Aug 2008 02:34:41 +0000</pubDate>
		<dc:creator>Christopher Keslin</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[.NET 3.5 SP1]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[IIS 7.0]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://www.ktsc.com/blogs/ChristopherKeslin/?p=12</guid>
		<description><![CDATA[About a year and a half ago I began work on an application that has a WPF client deployed through click once and a public Web interface.  The two apps share many reports and we really wanted to have a common report library that would provide fixed page documents through both.  After evaluating some very [...]]]></description>
			<content:encoded><![CDATA[<p>About a year and a half ago I began work on an application that has a WPF client deployed through click once and a public Web interface.  The two apps share many reports and we really wanted to have a common report library that would provide fixed page documents through both.  After evaluating some very expensive PDF generation tools and a few not so great inexpensive ones we settled on leveraging FlowDocuments as the templates and then converting the flow documents to XPS documents on the fly.  The solution worked great for both the WPF app and the ASP.NET application, but there was this nagging feeling in the back of my mind because Microsoft did make it clear they did not support using WPF within a service.</p>
<p>Well, with Monday&#8217;s release of Service Pack 1 for the .NET 3.5 Framework our reporting solution came crashing down.  A quick search on Google showed quite a few others that where using WPF within ASP.NET were running into the same issue, and of course Microsoft&#8217;s response, which to be fair Microsoft said from the begining 2+ years ago, is that executing WPF in a service is not a tested or supported scenario. *SIGH*  The silver lining is that the SP1 enhancements do launch our client application MUCH MUCH faster. Great job on the cold start issue guys! In the mean time, we&#8217;ll be moving back to PDF as our standard for fixed documents until there is supported XPS creation hosted under the service model.</p>
<p>So back to the drawing board on searching for a reporting solution common to both.  So far <a href="http://www.PDFSharp.com">PDFSharp</a> is the front runner. It has an extremely open license enabling us to incorporate it into our commercial application, the source code is very clean and the object model is proving to be very intuitive. The library incorporates MigraDoc Lite for document management and they are actively adding native WPF support into the library. The GDI+ API works well for both our WPF client and ASP.NET app. Kudos to empira Software® for releasing a solid document creation API!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ktsc.com/blogs/ChristopherKeslin/2008/08/13/wpf-running-under-iis-no-more/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Code Generation and TDD</title>
		<link>http://www.ktsc.com/blogs/ChristopherKeslin/2008/08/07/code-generation-and-tdd/</link>
		<comments>http://www.ktsc.com/blogs/ChristopherKeslin/2008/08/07/code-generation-and-tdd/#comments</comments>
		<pubDate>Thu, 07 Aug 2008 21:34:03 +0000</pubDate>
		<dc:creator>Christopher Keslin</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[(TDD) Test Driven Development]]></category>
		<category><![CDATA[Code Generation]]></category>

		<guid isPermaLink="false">http://www.ktsc.com/blogs/ChristopherKeslin/?p=5</guid>
		<description><![CDATA[Code Generation and Test Driven Development share the same common goal; decrease development time while increasing quality.  However, each technique achieves their common goal by very different, and at first glance, opposing paradigms.  This post focuses on how development teams can increase their velocity significantly by understanding the strengths of each technique and laying out clear rules of [...]]]></description>
			<content:encoded><![CDATA[<p>Code Generation and Test Driven Development share the same common goal; decrease development time while increasing quality.  However, each technique achieves their common goal by very different, and at first glance, opposing paradigms.  This post focuses on how development teams can increase their velocity significantly by understanding the strengths of each technique and laying out clear rules of engagement upfront.</p>
<p>Code Generation starts with the recognition that many of the patterns used in enterprise development are repetitious.  Many tools have been created to tackle these repetitive tasks and generally come in two flavors.  The first flavor is code generated from a source that will never be hand modified.  If the source changes, the code is simply regenerated. The svcutil provided in the .NET 3.0 framework would fall into this category.  The second flavor generates code that is intended to save developers from a lot of copy and paste operations but will still require some manual editing by the developer.  In this case the code is generated once, but then is never regenerated if the source changes.  <em>(note:  Partial classes have done a lot to help seperate out what can be regenerated without breaking custom changes, but the gen once paradigm described is intended to jump start the manual coding process)</em></p>
<p>Test Driven Development (TDD) requires that a test be written and fail before any code can be written.  Once you have a failing test, on you go to fix the code so the test passes.  See <a href="http://www.agiledata.org/essays/tdd.html">Introduction to Test Driven Design</a> for more on the overall process.  Following this process results in a clean, minimalist API with extremely high automated test coverage.</p>
<p>Code Generation and TDD come into conflict when development teams implement strict test coverage requirements in their continuous integration environment.  Code Generation that will never be hand modified can skirt this issue through the use of attributes such as [System.CodeDom.Compiler.GeneratedCodeAttribute] which tell the coverage utility to exclude the following class, property, or method from the coverage metrics, however, we still need to address code that is generated to jump start manual coding.</p>
<p>We can still follow TDD using Code Generation to augment the process to get the best of both worlds.  The key is to create templates that generate the smallest unit of work possible instead of the typical &#8220;generate everything&#8221; paradigm.  Lets take the simple task of adding a data entry screen in a typical ASP.NET application following an MVP pattern <em>(note:  for a good succinct discussion of the difference between the MVC and MVP pattern see Daron Schall&#8217;s post titled <a href="http://www.darronschall.com/weblog/archives/000113.cfm">MVC vs. MVP</a>)</em>.</p>
<p>Story Tasks:</p>
<ol>
<li>Create the database table</li>
<li>Test the domain model representation of the information</li>
<li>Test the CRUD operations of the repository (for illustration purposes this story does not require the ability to update the entity)
<ol>
<li>Test Adding a new entity to the repository</li>
<li>Test Finding an entity within the repository</li>
<li>Test Removing an entity from within the repository</li>
</ol>
</li>
<li>Test the Business Processor responsible for manipulating the entity</li>
<li>Test the Service responsible for exposing the functionality to the UI</li>
<li>Test the Service agent responsible for communicating with the service</li>
<li>Test the Client Model</li>
<li>Test the Presenter responsible for executing user initiated actions</li>
<li>Create the page and wire up passing events to the presenter.</li>
</ol>
<p>Execute task one using your favorite database utility and add the resulting script to source control (hopefully in a <a href="https://sourceforge.net/project/showfiles.php?group_id=195036&amp;abmode=1">dbDeploy.NET</a> script)</p>
<p>To execute task two, write the unit test asserting the expected properties are present and functional, then use your favorite code generation tool (<a href="http://www.codesmithtools.com/">Code Smith</a> is my personal favorite) to generate the class from either the table or preferably the select stored procedure. Run the unit test and validate it passes.</p>
<p>To execute task three, write the unit test for the first sub task, develop the required stored procedure, generate the Add methods code from the stored procedure, verify the test works, rinse and repeat for each task.</p>
<p>For task 4 I break with TDD slightly in that I right all of the tests for each method the business processor exposes (and in the 90% case simply delegates) to the repository.  After all three tests are written I generate the complete processor from the associated compiled repository class.  If you use Code Smith for generation custom property <a href="http://community.codesmithtools.com/forums/p/8701/32161.aspx">Assembly and Type / Class Selector</a> is invaluable for using .NET types as source objects for generation.  By generating the processor from the repository and not the database you do not end up with an Update method the story doesn&#8217;t require.</p>
<p>The rest of the tasks follow a similar pattern of writing the test, and then using a template to generate the stub code to satisfy the test.</p>
<p>Following this process has greatly increased my velocity and still results in the clean, minimalist API obtained through TDD with a high level of test coverage while virtually eliminating the copy, paste, massage routine for tasks that follow the 90% rule thanks to the judicious use of Code Generation.  Leveraging templates through <a href="http://www.codesmithtools.com/">Code Smith&#8217;s</a> Active Snippet feature in VS 2008 is the icing on the cake!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ktsc.com/blogs/ChristopherKeslin/2008/08/07/code-generation-and-tdd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
