<?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>Offroad Coder</title>
	<atom:link href="http://offroadcoder.com/index.php/feed/" rel="self" type="application/rss+xml" />
	<link>http://offroadcoder.com</link>
	<description></description>
	<lastBuildDate>Thu, 03 May 2012 18:58:42 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Extending Enterprise Library 5 Data Access Part 2: Extensions</title>
		<link>http://offroadcoder.com/index.php/2012/02/extending-enterprise-library-5-data-access-part-2-extensions/</link>
		<comments>http://offroadcoder.com/index.php/2012/02/extending-enterprise-library-5-data-access-part-2-extensions/#comments</comments>
		<pubDate>Fri, 03 Feb 2012 02:34:13 +0000</pubDate>
		<dc:creator>Scott Klueppel</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[Enterprise Library]]></category>
		<category><![CDATA[Extensions]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[EntLib]]></category>

		<guid isPermaLink="false">http://offroadcoder.com/?p=169</guid>
		<description><![CDATA[In Part 1: Out-of-the-box Features, I went through some of the great new features with Enterprise Library 5 Data Access including accessors and mappers. Before version 5, most of my EntLib extensions code was in place to perform these new features (not as eloquently, of course). I have become attached to a few of the <a href='http://offroadcoder.com/index.php/2012/02/extending-enterprise-library-5-data-access-part-2-extensions/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>In <a href="http://offroadcoder.com/index.php/2010/12/extending-enterprise-library-5-data-access-part-1-out-of-the-box-features/">Part 1: Out-of-the-box Features</a>, I went through some of the great new features with Enterprise Library 5 Data Access including accessors and mappers. Before version 5, most of my EntLib extensions code was in place to perform these new features (not as eloquently, of course). I have become attached to a few of the extensions I had put in place over the years. I will keep my extensions around now for only a few reasons. 1) Customized database exceptions 2) IDataReader usability enhancements 3) Reduced mapping footprint.</p>
<h2>Extensions</h2>
<p>I typically have a Utils.dll that I import in every project. For data/resource access projects, I also include my Utils.Data.dll. Utils.Data started its career as a data access application block similar to SqlHelper from the pre-EntLib days. Today, Utils.Data is a set of extensions that merely makes Enterprise Library more fun to be with.</p>
<h3></h3>
<h5>IDataReaderExtensions</h5>
<p>Out of the box, System.Data.IDataRecord only gives you the ability to access fields by their integer index value. As an architect that does not have supervisory control over the database or the objects within, this scares me. Any additions or re-ordering of the output fields will surely cause your index-based mapping to blow up. You could solve this with a call to .GetOrdinal(fieldName) first to get the index, but that is twice the code (not to mention boring plumbing code). My extensions do nothing novel. They simply provide string-based extensions like .GetInt32(string name) that do the retrieval and casting for you. I also added a few frequently-used new extensions like .GetNullableInt(string name) to keep my result mapping as clean as concise as possible.</p>
<p>Reader use with built-in features:</p>
<pre class="brush: csharp; first-line: 95;">jeep = new Jeep()
{
	ID = row.GetInt32(0),
	Name = row.GetString(1),
	Description = row.GetString(2),
	Status = row.GetBoolean(3)
};</pre>
<p>Reader use with extensions:</p>
<pre class="brush: csharp; first-line: 68;">jeep = new Jeep()
{
	ID = reader.GetInt32(“JeepID”),
	Name = reader.GetString(“Name”),
	Description = reader.GetString(“Description”),
	Status = reader.GetBoolean(“Status”),
};</pre>
<p>I advise that you never use string literals in data access code. Data access code is hit hard, so take your performance improvements when you can. I prefer having const strings locally in my data access class or having an internal static class with const strings to share with all classes in my data access project. The attached solution has examples.</p>
<h5>Parameter and Result/Row Mapping</h5>
<p>The now built-in ParameterMapper, RowMapper, and ResultSetMapper are beautiful. Sometimes you need a little sumpin’ special to make your code easier to read and work consistently when getting one or ten entities in a database call. Similar to how ExecuteSprocAccessor works with row and result set mappers, CreateObject and CreateCollection support generics and build an object or collection of the specified type. Instead of deriving a new class from a base mapper class, I chose to have one delegate method that generates a single object from a reader. This delegate is used by both CreateObject and CreateCollection. Let’s look at the differences with code.</p>
<p>Creating an object with EntLib5 features:</p>
<pre class="brush: csharp; first-line: 56; highlight: [61];">public Jeep GetJeepByID(int id)
{
	Database db = DatabaseFactory.CreateDatabase();
	IParameterMapper jeepParameterMapper = new JeepParameterMapper();
	IRowMapper<Jeep> jeepRowMapper = new JeepRowMapper();
	IEnumerable<Jeep> jeeps = db.ExecuteSprocAccessor<Jeep>(StoredProcedures.GetJeepByID, jeepParameterMapper, jeepRowMapper, id);
	return jeeps.First();
}

internal class JeepRowMapper : IRowMapper<jeep>
{
	public Jeep MapRow(System.Data.IDataRecord row)
	{
		return new Jeep()
		{
			ID = row.GetInt32(0),
			Name = row.GetString(1),
			Description = row.GetString(2),
			Status = row.GetBoolean(3)
		};
	}
}</pre>
<p>Creating an object with extensions:</p>
<pre class="brush: csharp; first-line: 35; highlight: [39];">public Jeep GetJeepByID(int id)
{
	Database db = DatabaseFactory.CreateDatabase();
	DbCommand cmd = db.GetStoredProcCommand(StoredProcedures.GetJeepByID, id);
	Jeep jeep = db.CreateObject(cmd, GenerateJeepFromReader);
	return jeep;
}

private Jeep GenerateJeepFromReader(IDataReader reader)
{
	Jeep jeep = null;
	if (reader.Read())
	{
		jeep = new Jeep()
		{
			ID = reader.GetInt32(Fields.JeepID),
			Name = reader.GetString(Fields.JeepName),
			Description = reader.GetString(Fields.JeepDescription),
			Status = reader.GetBoolean(Fields.JeepStatus),
		};
	}
	return jeep;
}</pre>
<p>One more thing to note is that my CreateObject, CreateCollection, and their GetAccessor equivalents have my customized exception handling logic that makes use of the StoredProcedureException. We’ll go through that now.</p>
<h5>Customized and Standardized Exceptions</h5>
<p>The only value in logging exceptions is if your entire system logs exceptions and other messages in a consistent and meaningful manner. If error messages are logged as “ERROR!” or “All bets are off!!!” then you shouldn’t bother logging. In the real world, few developers, architects, or support staff have access to production databases. Having meaningful and detailed error messages is key to troubleshooting an issue and meeting your SLAs. I created a simple StoredProcedureException that provides the executed (or attempted) command as part of the stack trace. </p>
<table style="background-color: #d5d8ab" border="0" cellspacing="0" cellpadding="0" width="60%" align="center">
<tbody>
<tr>
<td style="border-bottom: #000 1px solid; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; color: #ff0000; border-top: #000 1px solid; font-weight: bold; padding-top: 10px" valign="top">WARNING:</td>
<td style="border-bottom: #000 1px solid; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; border-top: #000 1px solid; padding-top: 10px" valign="top" width="100%">You should never, ever, ever show the stack trace in your application or let your users see the real error messages.<br />Log the real message and stack trace, then show “Data access exception” to your users. Please!</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>In the attached code samples, you’ll see two data access methods that call “ExceptionStoredProcedure” that does nothing other than RAISERROR(&#8216;This is an exception&#8217;, 16, 1). With the built-in features, you can expect a SqlException and a stack trace that looks like this:</p>
<blockquote><pre>at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   at System.Data.SqlClient.SqlDataReader.ConsumeMetaData() at System.Data.SqlClient.SqlDataReader.get_MetaData()
   at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
   at System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior)
   at Microsoft.Practices.EnterpriseLibrary.Data.Database.DoExecuteReader(DbCommand command, CommandBehavior cmdBehavior)
      in e:\Builds\EntLib\Latest\Source\Blocks\Data\Src\Data\Database.cs:line 460
   at Microsoft.Practices.EnterpriseLibrary.Data.Database.ExecuteReader(DbCommand command)
      in e:\Builds\EntLib\Latest\Source\Blocks\Data\Src\Data\Database.cs:line 846
   at Microsoft.Practices.EnterpriseLibrary.Data.CommandAccessor`1.<execute>d__0.MoveNext()
      in e:\Builds\EntLib\Latest\Source\Blocks\Data\Src\Data\CommandAccessor.cs:line 68 at System.Linq.Enumerable.First[TSource](IEnumerable`1 source)
   at DataAccess.JeepDataAccess.GetJeepByIDShowingException(Int32 id)
      in C:\Dev\Cookbook\Utilities\EntLibExtensions\5.0\EntLibExtensions\DataAccess\JeepDataAccess.cs:line 58
   at Client.Program.TestExceptionGetWithEntLib5Only()
      in C:\Dev\Cookbook\Utilities\EntLibExtensions\5.0\EntLibExtensions\Client\Program.cs:line 58
   at Client.Program.Main(String[] args)
      in C:\Dev\Cookbook\Utilities\EntLibExtensions\5.0\EntLibExtensions\Client\Program.cs:line 22
</pre>
</blockquote>
<p>With my extensions, you can expect a StoredProcedureException that includes the text of the full stored procedure being executed at the time. This has saved me countless times as my log table stores the full stack trace and I can reproduce exactly what happened without guessing. The InnerException of the StoredProcedureException will be the same SqlException seen above. The customized stack trace will look like this:</p>
<blockquote><pre>[Stored procedure executed: ExceptionStoredProcedure @RETURN_VALUE=-6, @JeepID=1]
   at Soalutions.Utilities.Data.DatabaseExtensions.CreateObject[T](Database db, DbCommand cmd, GenerateObjectFromReader`1 gofr)
      in C:\Dev\Cookbook\Utilities\EntLibExtensions\5.0\EntLibExtensions\EntLibExtensions\DatabaseExtensions.cs:line 49
   at DataAccess.JeepDataAccess.GetJeepByIDShowingExceptionWithExtensions(Int32 id)
      in C:\Dev\Cookbook\Utilities\EntLibExtensions\5.0\EntLibExtensions\DataAccess\JeepDataAccess.cs:line 65
   at Client.Program.TestExceptionGetWithExtensions()
      in C:\Dev\Cookbook\Utilities\EntLibExtensions\5.0\EntLibExtensions\Client\Program.cs:line 66
   at Client.Program.Main(String[] args)
      in C:\Dev\Cookbook\Utilities\EntLibExtensions\5.0\EntLibExtensions\Client\Program.cs:line 23
</pre>
</blockquote>
<p>So that’s really it. There is some other hidden goodness in there, but it’s not really worth talking about in this post. </p>
<p>Download sample solution: <a href="http://offroadcoder.com/content/binary/EntLibExtensions.zip">EntLibExtensions.zip &#8211; 140 KB (143,360 bytes)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://offroadcoder.com/index.php/2012/02/extending-enterprise-library-5-data-access-part-2-extensions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The issuer of the security token was not recognized by the IssuerNameRegistry</title>
		<link>http://offroadcoder.com/index.php/2011/08/the-issuer-of-the-security-token-was-not-recognized-by-the-issuernameregistry/</link>
		<comments>http://offroadcoder.com/index.php/2011/08/the-issuer-of-the-security-token-was-not-recognized-by-the-issuernameregistry/#comments</comments>
		<pubDate>Tue, 30 Aug 2011 16:59:15 +0000</pubDate>
		<dc:creator>Scott Klueppel</dc:creator>
				<category><![CDATA[WIF]]></category>
		<category><![CDATA[Configuration]]></category>
		<category><![CDATA[ErrorMessages]]></category>

		<guid isPermaLink="false">http://offroadcoder.com/?p=147</guid>
		<description><![CDATA[For the federated folks out there, you may encounter an error message like the following: System.IdentityModel.Tokens.SecurityTokenException, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ID4175: The issuer of the security token was not recognized by the IssuerNameRegistry. To accept security tokens from this issuer, configure the IssuerNameRegistry to return a valid name for this issuer. at Microsoft.IdentityModel.Tokens.Saml11.Saml11SecurityTokenHandler.CreateClaims(SamlSecurityToken samlSecurityToken) at <a href='http://offroadcoder.com/index.php/2011/08/the-issuer-of-the-security-token-was-not-recognized-by-the-issuernameregistry/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>For the federated folks out there, you may encounter an error message like the following:</p>
<pre class="brush: xml; first-line: 28; width: 400px;"><Exception>
<ExceptionType>System.IdentityModel.Tokens.SecurityTokenException, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType>
<Message>ID4175: The issuer of the security token was not recognized by the IssuerNameRegistry. To accept security tokens from this issuer, configure the IssuerNameRegistry to return a valid name for this issuer.</Message>
<StackTrace>
at Microsoft.IdentityModel.Tokens.Saml11.Saml11SecurityTokenHandler.CreateClaims(SamlSecurityToken samlSecurityToken)
at Microsoft.IdentityModel.Tokens.Saml11.Saml11SecurityTokenHandler.ValidateToken(SecurityToken token)
at Microsoft.IdentityModel.Tokens.SecurityTokenHandlerCollection.ValidateToken(SecurityToken token)
at Microsoft.IdentityModel.Web.TokenReceiver.AuthenticateToken(SecurityToken token, Boolean ensureBearerToken, String endpointUri)
at Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.SignInWithResponseMessage(HttpRequest request)
at Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.OnAuthenticateRequest(Object sender, EventArgs args)
at System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean&amp; completedSynchronously)
at System.Web.HttpApplication.PipelineStepManager.ResumeSteps(Exception error)
at System.Web.HttpApplication.BeginProcessRequestNotification(HttpContext context, AsyncCallback cb)
at System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context)
at System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(IntPtr managedHttpContext, IntPtr nativeRequestContext, IntPtr moduleData, Int32 flags)
at System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(IntPtr managedHttpContext, IntPtr nativeRequestContext, IntPtr moduleData, Int32 flags)
at System.Web.Hosting.UnsafeIISMethods.MgdIndicateCompletion(IntPtr pHandler, RequestNotificationStatus&amp; notificationStatus)
at System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(IntPtr managedHttpContext, IntPtr nativeRequestContext, IntPtr moduleData, Int32 flags)
at System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(IntPtr managedHttpContext, IntPtr nativeRequestContext, IntPtr moduleData, Int32 flags)
</StackTrace>
<ExceptionString>System.IdentityModel.Tokens.SecurityTokenException: ID4175: The issuer of the security token was not recognized by the IssuerNameRegistry. To accept security tokens from this issuer, configure the IssuerNameRegistry to return a valid name for this issuer.</ExceptionString>
</Exception></pre>
<p>If you see this, it is likely one of two things:</p>
<ol>
<li>The thumbprint for your trusted issuer is not capitalized.</li>
<li>You pasted the thumbprint from the certificates MMC plugin which added some invisible unicode characters to your thumbprint.</li>
</ol>
<p>In both cases, type the thumbprint instead of pasting it and the error will go away.</p>
<pre class="brush: xml; first-line: 28; width: 400px;">
<issuerNameRegistry type="Microsoft.IdentityModel.Tokens.ConfigurationBasedIssuerNameRegistry, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
<trustedIssuers>
	<add thumbprint="DE0B1E63EC97C3001F3B53C90D1A9F714C2292D3" name="http://sts.mydomain.com/trust" />
</trustedIssuers>
</issuerNameRegistry></pre>
]]></content:encoded>
			<wfw:commentRss>http://offroadcoder.com/index.php/2011/08/the-issuer-of-the-security-token-was-not-recognized-by-the-issuernameregistry/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Unit Testing ASP.NET MVC HTML Helpers with Simple Fakes</title>
		<link>http://offroadcoder.com/index.php/2011/08/unit-testing-asp-net-html-helpers-with-simple-fakes/</link>
		<comments>http://offroadcoder.com/index.php/2011/08/unit-testing-asp-net-html-helpers-with-simple-fakes/#comments</comments>
		<pubDate>Mon, 29 Aug 2011 03:19:24 +0000</pubDate>
		<dc:creator>Scott Klueppel</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[ASP.NET MVC]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[Helpers]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Unit Testing]]></category>

		<guid isPermaLink="false">http://offroadcoder.com/?p=139</guid>
		<description><![CDATA[You will find countless blog posts, forum posts, and Stack Overflow questions concerning the topic of unit testing a ASP.NET MVC HTML Helpers. Unit testing is an art, and I am still a novice. I played around with NUnit between 2004 and 2006. I really enjoyed practicing TDD but couldn’t make it work in my <a href='http://offroadcoder.com/index.php/2011/08/unit-testing-asp-net-html-helpers-with-simple-fakes/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>You will find countless blog posts, forum posts, and Stack Overflow questions concerning the topic of unit testing a ASP.NET MVC HTML Helpers. Unit testing is an art, and I am still a novice. I played around with NUnit between 2004 and 2006. I really enjoyed practicing TDD but couldn’t make it work in my 9-5 job. Finding people that are trained TDD’ers is near impossible in .NET (or maybe just in Jacksonville). Finding people that want to learn/love TDD is just as hard. It is especially difficult to convince management to move toward TDD when they see a huge upfront cost with no perceived benefit to the business/client/users. If your shop is cranking out low-defect code already, it’s a really hard sell.</p>
<p>In 2008, I changed jobs and started at a company that seemed to value TDD as much as I did. A new greenfield project was starting up, and everyone was tasked with learning the tools and trade of TDD. Sadly, I was not on this project. The team spent weeks, many weeks, downloading mocking frameworks and experimenting with other unit testing frameworks. They tried Moq, Rhino Mocks, Moles, TypeMock, and others. They tried NUnit, TypeMock, and MSTest. Without a TDD expert, the team spent way too much time trying to figure out the right way to test and lost track of the project’s goal… to write code to fulfill a contract. All unit testing was soon forbidden in the interest of time and money.</p>
<p>In my opinion, a single bad test is still better than no tests. Since that event I have tried to avoid using other frameworks and mocking libraries, etc. Sure it makes it easier, but only if you have the time to get up to speed on it and learn to love it. My primary goal on every piece of software I write is to one day be able to walk away and never get a phone call. If I lock a development team into using version 1.2.34.5678 of Crazy Mocks, they are going to 1) hate me 2) remove the test project 3) call me. I don’t want any of that to happen. I want easy-to-read code that looks like code that is versioned with the rest of the code and uses a built-in testing framework like MSTest.</p>
<p>So, what am I saying here and what does it have to do with MVC and fakes? I want to unit test all my code, and testing MVC HTML helpers is hard because there are lots and lots of MVC framework stuff going on that we don’t see. Simply calling your HTML helper’s methods without building the Controller, ControllerContext, HttpContext, ViewContext, ViewDataContainer, RouteData, and ViewEngine needed to support that call will give you mixed results. If your HTML helper is simple enough, you may never need to fake the view engine and context objects. If your helper is a container of built-in System.Web.Mvc.Html helpers, you are in for a tough battle. You will find many solutions to unit test HTML helpers that use Moq or Rhino Mocks. I find that developers generally accept unit tests as being worthy of the effort. They know the benefits and the costs, and try their best. When you get into a sticky situation as with MVC helpers, many give up and the code ends up having no unit tests.</p>
<p>A typical error message you will see is:</p>
<blockquote><p><span style="color: #993300;font-size: 0.9em;"><strong>System.NotImplementedException &#8211; The method or operation is not implemented.</strong></p>
<pre>   at System.Web.HttpContextBase.get_Items()
   at System.Web.Mvc.Html.TemplateHelpers.GetActionCache(HtmlHelper html)
   at System.Web.Mvc.Html.TemplateHelpers.ExecuteTemplate(HtmlHelper html,
      ViewDataDictionary viewData, String templateName, DataBoundControlMode mode,
      GetViewNamesDelegate getViewNames, GetDefaultActionsDelegate getDefaultActions)
   at System.Web.Mvc.Html.TemplateHelpers.TemplateHelper(HtmlHelper html,
      ModelMetadata metadata, String htmlFieldName, String templateName,
      DataBoundControlMode mode, Object additionalViewData, ExecuteTemplateDelegate executeTemplate)
   at System.Web.Mvc.Html.TemplateHelpers.TemplateHelper(HtmlHelper html,
      ModelMetadata metadata, String htmlFieldName, String templateName,
      DataBoundControlMode mode, Object additionalViewData)
   at System.Web.Mvc.Html.TemplateHelpers.TemplateFor[TContainer,TValue](HtmlHelper`1 html,
      Expression`1 expression, String templateName, String htmlFieldName,
      DataBoundControlMode mode, Object additionalViewData, TemplateHelperDelegate templateHelper)
   at System.Web.Mvc.Html.TemplateHelpers.TemplateFor[TContainer,TValue](HtmlHelper`1 html,
      Expression`1 expression, String templateName, String htmlFieldName, DataBoundControlMode mode,
      Object additionalViewData)
   at System.Web.Mvc.Html.DisplayExtensions.DisplayFor[TModel,TValue](HtmlHelper`1 html,
      Expression`1 expression)
   at Utils.Web.Tests.DisplayFormRowHelperTest.DisplayFormRow_StringField()
   in C:\Dev\MvcUnitTesting\Utils.Web.Tests\DisplayFormRowHelperTest.cs:line 99</pre>
<p>The ActionCacheItems are stored as a dictionary in the HttpContext.Items. If you have successfully used Moq and NSubstitute correctly and mocked away a good part of the framework, you may still see this error because the HttpContext hasn&#8217;t been built up correctly. </span></p></blockquote>
<p>What can you do? Find or write some fakes. Then create your HTML helper with a method that builds up the view engine and context objects as seen in the code below:</p>
<pre class="brush: csharp; first-line: 1; width: 400px;">using System.Web.Mvc;
using System.Web.Routing;
using UnitTesting.Web.Mvc;

namespace Utils.Web.Tests
{
	public class HtmlHelperBuilder
	{
		public static HtmlHelper&lt;TModel&gt; GetHtmlHelper&lt;TModel&gt;(TModel model, bool clientValidationEnabled)
		{
			ViewEngines.Engines.Clear();
			ViewEngines.Engines.Add(new FakeViewEngine());

			var controller = new MyTestController();
			var httpContext = new FakeHttpContext();

			var viewData = new FakeViewDataContainer { ViewData = new ViewDataDictionary&lt;TModel&gt;(model) };

			var routeData = new RouteData();
			routeData.Values["controller"] = "home";
			routeData.Values["action"] = "index";

			ControllerContext controllerContext = new FakeControllerContext(controller);

			var viewContext = new FakeViewContext(controllerContext, "MyView", routeData);
			viewContext.HttpContext = httpContext;
			viewContext.ClientValidationEnabled = clientValidationEnabled;
			viewContext.UnobtrusiveJavaScriptEnabled = clientValidationEnabled;
			viewContext.FormContext = new FakeFormContext();

			HtmlHelper&lt;TModel&gt; htmlHelper = new HtmlHelper&lt;TModel&gt;(viewContext, viewData);
			return htmlHelper;
		}
	}
}</pre>
<p>Then your unit tests will work, and not look so obnoxious. If you compare the code below, dear blog reader with a head on your shoulders, to the Moq solutions out there, you will notice two things. 1) This looks like a lot of code, but it’s still less than Moq 2) You, and a lot of other people, can actually read this code. Moq is great, but not for most developer’s consumption.</p>
<pre class="brush: csharp; first-line: 64; width: 400px;">[TestMethod]
public void DisplayFormRow_StringField()
{
	// Arrange
	var model = new MyModel { MyString = "Test" };
	string expected = "Test";
	HtmlHelper&lt;MyModel&gt; html = HtmlHelperBuilder.GetHtmlHelper(model, true);

	// Act
	MvcHtmlString actual = html.DisplayFor(m =&gt; m.MyString);

	// Assert
	Assert.AreEqual(expected, actual.ToHtmlString());
}</pre>
<p>This should be enough fake action to get someone going down the right path. Feel free to use the fakes library I have linked below. No guarantees. IWOMB</p>
<blockquote><p><span style="color: #339900; font-size: 1.2em;">Code hard!<br />
Test lightly!</span></p></blockquote>
<p>Links:</p>
<ul>
<li><a title="http://msdn.microsoft.com/en-us/magazine/dd942838.aspx#id0420044" href="http://msdn.microsoft.com/en-us/magazine/dd942838.aspx#id0420044">Building Testable ASP.NET MVC Applications</a><br />
(Justin Etheredge &#8211; MSDN Magazine &#8211; July 2009)</li>
</ul>
<p>Download library of fakes – <a title="Download Fakes Library" href="http://offroadcoder.com/content/binary/UnitTesting.Web.Mvc.zip">UnitTesting.Web.Mvc.zip (8.42 KB)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://offroadcoder.com/index.php/2011/08/unit-testing-asp-net-html-helpers-with-simple-fakes/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>.NET Framework Launch Condition Warning</title>
		<link>http://offroadcoder.com/index.php/2011/06/net-framework-launch-condition-warning/</link>
		<comments>http://offroadcoder.com/index.php/2011/06/net-framework-launch-condition-warning/#comments</comments>
		<pubDate>Thu, 23 Jun 2011 20:14:36 +0000</pubDate>
		<dc:creator>Scott Klueppel</dc:creator>
				<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://scott.klueppel.net/Wordpress/?p=129</guid>
		<description><![CDATA[ While it all makes sense now, it didn&#8217;t make sense when I first saw this warning message: Warning 304 The version of the .NET Framework launch condition &#8216;.NET Framework 4 Client Profile&#8217; does not match the selected .NET Framework bootstrapper package. Update the .NET Framework launch condition to match the version of the .NET Framework selected in <a href='http://offroadcoder.com/index.php/2011/06/net-framework-launch-condition-warning/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p> While it all makes sense now, it didn&#8217;t make sense when I first saw this warning message:</p>
<blockquote><p><span style="color: #993300;">Warning 304 The version of the .NET Framework launch condition &#8216;.NET Framework 4 Client Profile&#8217; does not match the selected .NET Framework bootstrapper package. Update the .NET Framework launch condition to match the version of the .NET Framework selected in the Prerequisites Dialog Box.</span></p></blockquote>
<p> While building a Setup project, which hosts a Windows Service that requires the full .NET Framework 4 profile, this warning message appears. I do not accept warnings or error messages in my code, so naturally I must seek and destroy the cause of this message. Before you do the following, make sure that the client profile selected matches between your project properties and the .NET framework profile on the prerequisites screen from the setup project&#8217;s properties screen.</p>
<p><img class=" alignnone" title="Setup Project Prerequisites" src="http://offroadcoder.com/content/binary/setup-proj-prerequisites.png" alt="" width="496" height="385" /></p>
<p>After the setup project&#8217;s prerequisites match your project&#8217;s client profile, change the profile for your setup project&#8217;s installer Launch Conditions.</p>
<ol>
<li>Right-click on the setup project, select <strong>View</strong> and then <strong>Launch Conditions</strong>.</li>
<li>Click on <strong>.NET Framework</strong> under Launch Conditions.</li>
<li>Change the <strong>Version</strong> in the properties window to match the client profile selected in the project properties and setup project prerequisites.</li>
</ol>
<div class="wp-caption alignnone" style="width: 628px"><img title="Launch Conditions" src="http://offroadcoder.com/content/binary/launch-conditions.png" alt="Launch Conditions in Visual Studio" width="618" height="172" /><p class="wp-caption-text">Launch Conditions Settings in Visual Studio</p></div>
]]></content:encoded>
			<wfw:commentRss>http://offroadcoder.com/index.php/2011/06/net-framework-launch-condition-warning/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>2011 Orlando Code Camp: Slides and Code</title>
		<link>http://offroadcoder.com/index.php/2011/03/2011-orlando-code-camp-slides-and-code/</link>
		<comments>http://offroadcoder.com/index.php/2011/03/2011-orlando-code-camp-slides-and-code/#comments</comments>
		<pubDate>Mon, 28 Mar 2011 02:02:25 +0000</pubDate>
		<dc:creator>Scott Klueppel</dc:creator>
				<category><![CDATA[Dev Community]]></category>
		<category><![CDATA[Parallel]]></category>
		<category><![CDATA[Presentations]]></category>

		<guid isPermaLink="false">http://offroadcoder.com/2011/03/28/2011OrlandoCodeCampSlidesAndCode.aspx</guid>
		<description><![CDATA[#OrlandoCC was great despite a few technical difficulties with projectors. Many thanks to Esteban and everyone else that made it happen. Below is the link to the slides and code from my presentation. Download ParallelPresentation.zip &#8211; 1.21 MB (1,276,111 bytes)]]></description>
			<content:encoded><![CDATA[<p>#OrlandoCC was great despite a few technical difficulties with projectors. Many thanks to Esteban and everyone else that made it happen. Below is the link to the slides and code from my presentation.</p>
<p><a href="http://www.offroadcoder.com/content/binary/ParallelPresentation.zip">Download ParallelPresentation.zip</a> &#8211; 1.21 MB (1,276,111 bytes)</p>
]]></content:encoded>
			<wfw:commentRss>http://offroadcoder.com/index.php/2011/03/2011-orlando-code-camp-slides-and-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Async and Parallel</title>
		<link>http://offroadcoder.com/index.php/2011/03/async-and-parallel/</link>
		<comments>http://offroadcoder.com/index.php/2011/03/async-and-parallel/#comments</comments>
		<pubDate>Mon, 28 Mar 2011 01:59:32 +0000</pubDate>
		<dc:creator>Scott Klueppel</dc:creator>
				<category><![CDATA[Async]]></category>
		<category><![CDATA[Parallel]]></category>

		<guid isPermaLink="false">http://offroadcoder.com/2011/03/28/AsyncAndParallel.aspx</guid>
		<description><![CDATA[I was asked a few questions this weekend at Orlando Code Camp about Async and how it relates to TPL. It&#8217;s best to hear the it from the PM of the Parallel team at Microsoft, Stephen Toub. The Parallel team is responsible for TPL and Async. Check out this Channel 9 video from October 2010 <a href='http://offroadcoder.com/index.php/2011/03/async-and-parallel/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>I was asked a few questions this weekend at Orlando Code Camp about Async and how it relates to TPL. It&#8217;s best to hear the it from the PM of the Parallel team at Microsoft, Stephen Toub. The Parallel team is responsible for TPL and Async. Check out this Channel 9 video from October 2010 (when Async CTP came out):</p>
<p><a title="http://channel9.msdn.com/Shows/Going+Deep/Stephen-Toub-Task-Based-Asynchrony-with-Async" href="http://channel9.msdn.com/Shows/Going+Deep/Stephen-Toub-Task-Based-Asynchrony-with-Async">http://channel9.msdn.com/Shows/Going+Deep/Stephen-Toub-Task-Based-Asynchrony-with-Async</a></p>
]]></content:encoded>
			<wfw:commentRss>http://offroadcoder.com/index.php/2011/03/async-and-parallel/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Visual Studio has come a long way</title>
		<link>http://offroadcoder.com/index.php/2011/03/visual-studio-has-come-a-long-way/</link>
		<comments>http://offroadcoder.com/index.php/2011/03/visual-studio-has-come-a-long-way/#comments</comments>
		<pubDate>Tue, 15 Mar 2011 03:57:00 +0000</pubDate>
		<dc:creator>Scott Klueppel</dc:creator>
				<category><![CDATA[Dev Tools]]></category>
		<category><![CDATA[History]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://scott.klueppel.net/Wordpress/?p=86</guid>
		<description><![CDATA[I ran across a presentation I gave in 2002 about the then-upcoming release of Visual Studio .NET. Here are some awesome screenshots from the PPT. My favorite feature is the method wizard. It was funny then, but hilarious now. Thank you, Microsoft, for working to make our lives better.]]></description>
			<content:encoded><![CDATA[<p>I ran across a presentation I gave in 2002 about the then-upcoming release of Visual Studio .NET. Here are some awesome screenshots from the PPT. My favorite feature is the method wizard. It was funny then, but hilarious now.</p>
<p><a href="http://offroadcoder.com/wp-content/uploads/2011/06/image.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://offroadcoder.com/wp-content/uploads/2011/06/image_thumb.png" alt="image" width="646" height="486" border="0" /></a></p>
<p><a href="http://offroadcoder.com/wp-content/uploads/2011/06/image1.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://offroadcoder.com/wp-content/uploads/2011/06/image_thumb1.png" alt="image" width="646" height="486" border="0" /></a></p>
<p>Thank you, Microsoft, for working to make our lives better.</p>
]]></content:encoded>
			<wfw:commentRss>http://offroadcoder.com/index.php/2011/03/visual-studio-has-come-a-long-way/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instance Correlation in WF4</title>
		<link>http://offroadcoder.com/index.php/2011/03/instance-correlation-in-wf4/</link>
		<comments>http://offroadcoder.com/index.php/2011/03/instance-correlation-in-wf4/#comments</comments>
		<pubDate>Wed, 02 Mar 2011 05:45:13 +0000</pubDate>
		<dc:creator>Scott Klueppel</dc:creator>
				<category><![CDATA[AppFabric]]></category>
		<category><![CDATA[WCF]]></category>
		<category><![CDATA[WF]]></category>

		<guid isPermaLink="false">http://offroadcoder.com/2011/03/02/InstanceCorrelationInWF4.aspx</guid>
		<description><![CDATA[Correlation is a priceless feature of WF4 that allows you to correlate WCF messages of your workflow based on some unique data in a subsequent message. From a calling client&#8217;s perspective, the need for correlation looks would look like this: Client creates workflow instance with WCF message Workflow (service) responds indicating that the workflow instance <a href='http://offroadcoder.com/index.php/2011/03/instance-correlation-in-wf4/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Correlation is a priceless feature of WF4 that allows you to correlate WCF messages of your workflow based on some unique data in a subsequent message. From a calling client&#8217;s perspective, the need for correlation looks would look like this:</p>
<ol>
<li>Client creates workflow instance with WCF message</li>
<li>Workflow (service) responds indicating that the workflow instance is running</li>
<li>At some point in the future, client wants to resume the same, now waiting, workflow instance with another WCF message</li>
</ol>
<p>To implement the resumption of the same workflow instance requires that the client have some sort of identifier to get back to the same instance they left earlier. WF4 uses CorrelationHandles to accomplish this. Using the CorrelationHandle class and some send/receive message properties, clients can share some unique ID to get back to the same instance. From a calling client&#8217;s perspective, the same scenario as before with correlation looks like this:</p>
<ol>
<li>Client creates workflow instance with WCF message</li>
<li>Workflow creates a correlation handle on some unique ID</li>
<li>Workflow (service) responds with the unique ID, for later correlation use, also indicating that the workflow instance is running</li>
<li>At some point in the future, client wants to resume the same, now waiting, workflow instance with another WCF message</li>
<li>Client sends another WCF message, including the unique ID in the message</li>
<li>Workflow responds to the incoming message, reads the unique ID from the message, and looks up the correct instance by the correlation handle corresponding to that unique ID</li>
<li>The same instance created earlier resumes</li>
</ol>
<p>You may be asking yourself, &#8220;So how do I do all this correlation stuff?&#8221; The following procedure will detail the necessary steps. The download link at the bottom of this post contains a sample project that has this sample already implemented.</p>
<p>Procedure:</p>
<ol>
<li>Start with a workflow with two separate <strong>ReceiveAndSendReply</strong> sequences.</li>
<li>If a unique ID is not available for correlation in your workflow already, you can use the <strong>WorkflowInstanceId. </strong>Put the following code in a new activity, and add the activity between the <strong>Receive</strong> and <strong>SendReply</strong> activities in your workflow.
<pre class="brush: csharp; first-line: 16; width: 400px;">public sealed class GetWorkflowInstanceId : CodeActivity
{
    public OutArgument&lt;Guid&gt; WorkflowInstanceId { get; set; }

    protected override void Execute(CodeActivityContext context)
    {
        context.SetValue&lt;Guid&gt;(this.WorkflowInstanceId, context.WorkflowInstanceId);
    }
}</pre>
</li>
<li>Create a new variable named <strong>WorkflowInstanceId</strong> of type <strong>System.Guid</strong>. <a href="http://www.offroadcoder.com/content/binary/CorrelationWF4_14EC7/image.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; float: right; padding-top: 0px; border: 0px;" title="image" src="http://www.offroadcoder.com/content/binary/CorrelationWF4_14EC7/image_thumb.png" border="0" alt="image" width="241" height="793" align="right" /></a></li>
<li>Create a new variable named <strong>WorkflowInstanceCorrelationHandle</strong> of type <strong>CorrelationHandle</strong>.</li>
<li>Set the <strong>WorkflowInstanceId </strong>out argument on the <strong>GetWorkflowInstanceId</strong> activity to the newly created variable <strong>WorkflowInstanceId</strong>.</li>
<li>Modify the <strong>SendReply</strong> activity <strong>Content</strong> to include the <strong>WorkflowInstanceId</strong> guid. This will give the client the unique ID to use in subsequent messages.</li>
<li>Open the <strong>SendReply</strong> activity <strong>CorrelationInitializers</strong> with the ellipsis button.</li>
<li>Click <strong>Add initializer</strong> in the left pane of the <strong>Add Correlation Initializers</strong> window. Type the name of the newly created variable <strong>WorkflowInstanceCorrectionHandle</strong>.</li>
<li>Verify that <strong>Query correlation initializer</strong> is selected in the combo box. Double-click to add a key under <strong>XPath Queries</strong>. Choose the <strong>WorkflowInstanceId</strong> item from the outbound message/parameters. In the attached example, this appears after the double-click as &#8220;Content : Guid&#8221; and appears as &#8220;sm:body()/xg0:guid&#8221; as an XPath query.<br />
<a href="http://www.offroadcoder.com/content/binary/CorrelationWF4_14EC7/image_3.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://www.offroadcoder.com/content/binary/CorrelationWF4_14EC7/image_thumb_3.png" border="0" alt="image" width="391" height="218" /></a></li>
<li>Click <strong>OK</strong> to close the <strong>Add Correlation Initializers</strong> window.</li>
<li>For the subsequent <strong>Receive</strong> activities, modify the <strong>Content</strong> to include the <strong>WorkflowInstanceId</strong> guid as either a message or parameter. This will make it possible to lookup the correct workflow instance.</li>
<li>On the same <strong>Receive</strong> activities, open <strong>CorrelatesOn</strong> with the ellipsis button.</li>
<li>Type the name of the variable <strong>WorkflowInstanceCorrelationHandle</strong> in the <strong>CorrelatesWith</strong> field.</li>
<li>Double-click to add a key under <strong>XPath Queries</strong>. Choose the <strong>WorkflowInstanceId</strong> item from the outbound message/parameters. In the attached example, this appears after the double-click as &#8220;Content : Guid&#8221; and appears as &#8220;sm:body()/xg0:guid&#8221; as an XPath query.<br />
<a href="http://www.offroadcoder.com/content/binary/CorrelationWF4_14EC7/image_4.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://www.offroadcoder.com/content/binary/CorrelationWF4_14EC7/image_thumb_4.png" border="0" alt="image" width="388" height="217" /></a></li>
<li>Test the interaction by creating a test client (included in the download below) that creates 2 or more instances and resumes them in a different order.</li>
<li>The final workflow should look like the image to the right.</li>
</ol>
<p><a href="http://www.offroadcoder.com/content/binary/WfCorrelation.zip">Download WfCorrelation.zip &#8211; 25.1 KB (25,727 bytes)</a><br />
<em>(Build the solution before opening the workflow to avoid activity errors)</em></p>
]]></content:encoded>
			<wfw:commentRss>http://offroadcoder.com/index.php/2011/03/instance-correlation-in-wf4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>I found my ASP.NET Web Matrix installer from 2003</title>
		<link>http://offroadcoder.com/index.php/2011/03/i-found-my-asp-net-web-matrix-installer-from-2003/</link>
		<comments>http://offroadcoder.com/index.php/2011/03/i-found-my-asp-net-web-matrix-installer-from-2003/#comments</comments>
		<pubDate>Wed, 02 Mar 2011 01:21:00 +0000</pubDate>
		<dc:creator>Scott Klueppel</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Dev Tools]]></category>
		<category><![CDATA[History]]></category>

		<guid isPermaLink="false">http://offroadcoder.com/2011/03/02/IFoundMyASPNETWebMatrixInstallerFrom2003.aspx</guid>
		<description><![CDATA[I didn&#8217;t think I was this much of a packrat. It&#8217;s amazing how far the ASP.NET tools have come. Give it a whirl; it installs on Windows 7 just fine. Download WebMatrix.zip &#8211; 969 KB (992,595 bytes)]]></description>
			<content:encoded><![CDATA[<p>I didn&#8217;t think I was this much of a packrat. It&#8217;s amazing how far the ASP.NET tools have come. Give it a whirl; it installs on Windows 7 just fine.</p>
<p><a href="http://offroadcoder.com/content/binary/WebMatrix.zip">Download WebMatrix.zip &#8211; 969 KB (992,595 bytes)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://offroadcoder.com/index.php/2011/03/i-found-my-asp-net-web-matrix-installer-from-2003/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>2011 South Florida Code Camp: Slides and Code</title>
		<link>http://offroadcoder.com/index.php/2011/02/2011-south-florida-code-camp-slides-and-code/</link>
		<comments>http://offroadcoder.com/index.php/2011/02/2011-south-florida-code-camp-slides-and-code/#comments</comments>
		<pubDate>Sun, 13 Feb 2011 08:49:00 +0000</pubDate>
		<dc:creator>Scott Klueppel</dc:creator>
				<category><![CDATA[Dev Community]]></category>
		<category><![CDATA[Parallel]]></category>
		<category><![CDATA[Presentations]]></category>

		<guid isPermaLink="false">http://offroadcoder.com/2011/02/13/2011SouthFloridaCodeCampSlidesAndCode.aspx</guid>
		<description><![CDATA[#SFLCC was an awesome event. It was the largest code camp I&#8217;ve ever attended, and I was extremely proud to be a part of it. Dave and Rainer did a fabulous job, and made putting on a huge event like this look really easy. My session had many interested, interesting, and enthusiastic developers in attendance. <a href='http://offroadcoder.com/index.php/2011/02/2011-south-florida-code-camp-slides-and-code/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>#SFLCC was an awesome event. It was the largest code camp I&#8217;ve ever attended, and I was extremely proud to be a part of it. Dave and Rainer did a fabulous job, and made putting on a huge event like this look really easy. My session had many interested, interesting, and enthusiastic developers in attendance. 70 minutes simply isn&#8217;t enough time to have gotten into the distributed computing example. The download below contains the Digipede grid computing example. If you would like to get started with Digipede, you can <a href="https://www.digipede.net/store/p-17-digipede-network-developer-edition.aspx">request a Developer Edition license</a>. Feel free to email me if you have any questions about Digipede, distributed computing, or .NET parallel extensions.</p>
<p><a href="http://www.offroadcoder.com/content/binary/ParallelPresentation.zip">Download ParallelPresentation.zip</a> &#8211; 1.21 MB (1,276,111 bytes)</p>
]]></content:encoded>
			<wfw:commentRss>http://offroadcoder.com/index.php/2011/02/2011-south-florida-code-camp-slides-and-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

