<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DUIER3o9eyp7ImA9WhRbEE8.&quot;"><id>tag:blogger.com,1999:blog-1081905209486048806</id><updated>2012-01-31T11:31:46.463-05:00</updated><category term="Visual Studio" /><category term="ILMerge" /><category term="Windows Server 2008" /><category term="Csla" /><category term="NumberFormatInfo" /><category term="Rss Feed" /><category term="Ektron 8.0.2" /><category term="ASP.NET" /><category term="RedGate Smart Assembly" /><category term="JSon" /><category term="Visual Studio 2008" /><category term="JsRender" /><category term="Feed" /><category term="Formatter" /><category term="MSDTC" /><category term="MOSS" /><category term="Sql Reporting Services" /><category term="DTC" /><category term="Aws" /><category term="ILSpy" /><category term="Presentation Formatter" /><category term="Sql Server Management Studio" /><category term="dnrTV" /><category term="BgInfo" /><category term="SQL Server 2005" /><category term="Team in Training" /><category term="Design" /><category term="TFS Power Tools" /><category term="Ektron 8.02" /><category term="Blogger" /><category term="IIS" /><category term="In Person Event" /><category term="Best Practices" /><category term="Development" /><category term="PowerCommands" /><category term="Ektron Version" /><category term="Rss Url" /><category term="Leukemia and Lymphoma Society" /><category term="SSRS" /><category term="CMS" /><category term="Code Snippet Manager" /><category term="WSS 4.0" /><category term="Atlanta Code Camp" /><category term="IIS7" /><category term="Crawled Content" /><category term="JavaScript" /><category term="OUTPUT" /><category term="Event" /><category term="Blog" /><category term="Serialization" /><category term=".NET" /><category term="Meeting" /><category term="SmartForm" /><category term="Globalization" /><category term="Vista" /><category term="Twitter" /><category term="Sql Server Management Studio 2008" /><category term="Microsoft" /><category term="MVC" /><category term="MOSS 2007" /><category term="Architecture" /><category term="Dependency Injection" /><category term="SQL Server" /><category term="IT" /><category term="Sandcastle" /><category term="Sarcasm" /><category term="TwitterSpy" /><category term="Silverlight 2" /><category term="Management" /><category term="Security" /><category term="Firewall" /><category term="HtmlHelper" /><category term="Business Intelligence" /><category term="AVG" /><category term="Visual Studio 2010" /><category term="Ektron" /><category term="Lhotka" /><category term="Node.js" /><category term="Leadership" /><category term="Donation" /><category term="DynamoDB" /><category term="Chrome" /><category term="TF10121" /><category term="COM+" /><category term="Software" /><category term="ASP.NET TextBox validate date" /><category term="StructureMap" /><category term="VTech" /><category term="Silverlight 3" /><category term="MobiGo" /><category term="Xml Comments" /><category term="Unit Testing" /><category term="PowerCommands 1.1" /><category term="Cloud" /><category term="Code Snippets" /><category term="Mobile" /><category term="SQL Server 2008" /><category term="MVC Preview 3" /><category term=".NET Reflector" /><category term="Tfpt" /><category term="TFS" /><category term="Csla 3.6" /><category term="Csla 3.8.1" /><category term="SharePoint" /><category term="Search" /><category term="VirtualServer" /><category term=".NET 3.5 SP1" /><category term="NoSQL" /><category term="Google" /><category term="WSS 3.0" /><category term="TSQL" /><category term="Open Source" /><category term="C#" /><category term="Reflection" /><category term="VirtualPC" /><category term="Learning Lodge Navigator" /><category term="Firebug" /><category term="Content Management" /><category term="BgInfo v4.16" /><category term="Validation" /><category term="DataAnnotations" /><category term="log4net" /><category term="SSRS 2008" /><category term="developer community" /><category term="Silverlight" /><title>Developer / Architect and not the other way around</title><subtitle type="html">Developer / Architect and not the other way around is a blog about software development.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://chrisghardwick.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://chrisghardwick.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Christopher Hardwick</name><uri>https://profiles.google.com/116172115963583202334</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>105</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/Developer/ArchitectAndNotTheOtherWayAround" /><feedburner:info uri="developer/architectandnottheotherwayaround" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;A0IMRXczcSp7ImA9WhRUGU4.&quot;"><id>tag:blogger.com,1999:blog-1081905209486048806.post-6182221969929548707</id><published>2012-01-30T11:06:00.000-05:00</published><updated>2012-01-30T11:06:24.989-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-30T11:06:24.989-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term=".NET" /><category scheme="http://www.blogger.com/atom/ns#" term="RedGate Smart Assembly" /><category scheme="http://www.blogger.com/atom/ns#" term="Microsoft" /><category scheme="http://www.blogger.com/atom/ns#" term="ILMerge" /><title>ILMerge: Getting Started, Merging, and Alternatives (to ILMerge).</title><content type="html">&lt;u&gt;What is ILMerge?&lt;/u&gt;&lt;br /&gt;
ILMerge is a Microsoft produced assembly merge utility. It merges more-than-one .NET assembly (or executables) into a single assembly.&lt;br /&gt;
&lt;br /&gt;
ILMerge is a command-line utility.&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;Installation:&lt;/u&gt;&lt;br /&gt;
To begin you will need to install ILMerge on your machine (or the machine where you are planning on merging assemblies). You can download ILMerge directly from Microsoft in the Download center at:&amp;nbsp;&lt;a href="http://www.microsoft.com/download/en/confirmation.aspx?id=17630"&gt;http://www.microsoft.com/download/en/confirmation.aspx?id=17630&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
The installation itself is a Microsoft Installer (MSI) file named&amp;nbsp;ILMerge.msi. Click on the file, and follow the pretty typical installation path:&amp;nbsp;Welcome -&amp;gt; License Agreement (EULA) -&amp;gt; Install Folder &amp;gt; Confirm&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Note: You will want to remember the installation folder, since you will have to run ILMerge from this location (or at a minimum add this file location into the windows path). My install location was&amp;nbsp;&lt;b&gt;C:\Program Files (x86)\Microsoft\ILMerge&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;Best Practices:&lt;/u&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Script the merge process&lt;/li&gt;
&lt;li&gt;Incorporate the assembly merge into your build process&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;u&gt;Examples:&lt;/u&gt;&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
Merge:&lt;br /&gt;
ilmerge /out:Merged.dll Primary.dll Secondary1.dll Secondary2.dll&amp;nbsp;&lt;/blockquote&gt;
&lt;blockquote class="tr_bq"&gt;
Merge with Wildcard:&lt;br /&gt;
ilmerge /wildcards /out:Merged.dll Primary.dll Secondary*.dll&amp;nbsp;&lt;/blockquote&gt;
&lt;blockquote class="tr_bq"&gt;
Merge with Log:&lt;br /&gt;
ilmerge /log /out:Merged.dll Primary.dll Secondary1.dll Secondary2.dll&lt;br /&gt;
ilmerge /log:log.txt /out:Merged.dll Primary.dll Secondary1.dll Secondary2.dll&lt;/blockquote&gt;
&lt;br /&gt;
&lt;u&gt;IL Merge with .NET 4.0:&lt;/u&gt;&lt;br /&gt;
... when using ILMerge with .NET 4.0 assemblies you have to set the target platform to .NET 4.0 (command line parameter: &lt;i&gt;/targetplatform:v4&lt;/i&gt;).&lt;br /&gt;
&lt;br /&gt;
... Microsoft Research (via Mike Barnett) provides an example configuration file for using ILMerge with .NET 4.0 at:&amp;nbsp;&lt;a href="http://research.microsoft.com/en-us/people/mbarnett/ilmerge-40-exe-config.aspx"&gt;http://research.microsoft.com/en-us/people/mbarnett/ilmerge-40-exe-config.aspx&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
This is the example:&lt;br /&gt;
&lt;pre style="background-image: URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"&gt;&lt;code style="color: black; word-wrap: normal;"&gt;&amp;lt;?xml version ="1.0"?&amp;gt;
&amp;lt;configuration&amp;gt;
&amp;lt;startup useLegacyV2RuntimeActivationPolicy="true"&amp;gt;
&amp;lt;requiredRuntime safemode="true" imageVersion="v4.0.30319" version="v4.0.30319"/&amp;gt;
&amp;lt;/startup&amp;gt;
&amp;lt;/configuration&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;span style="font-size: xx-small;"&gt;Source:&amp;nbsp;&lt;a href="http://research.microsoft.com/en-us/people/mbarnett/ilmerge-40-exe-config.aspx"&gt;http://research.microsoft.com/en-us/people/mbarnett/ilmerge-40-exe-config.aspx&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;u&gt;Are there alternatives to ILMerge (that will accomplish the same relative goal)?&lt;/u&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;Assemblies as Resources&lt;/b&gt;&lt;br /&gt;
Jeffrey Richter on the&amp;nbsp;Microsoft Press blog proposed&amp;nbsp;&lt;i&gt;adding assemblies as resources&lt;/i&gt;, and loading them via reflection. You can read more about this approach here:&amp;nbsp;&lt;a href="http://blogs.msdn.com/b/microsoft_press/archive/2010/02/03/jeffrey-richter-excerpt-2-from-clr-via-c-third-edition.aspx"&gt;http://blogs.msdn.com/b/microsoft_press/archive/2010/02/03/jeffrey-richter-excerpt-2-from-clr-via-c-third-edition.aspx&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Using this approach, you "hook" into the assembly resolve for the AppDomain, and then load the assemblies via reflection.&lt;br /&gt;
&lt;pre style="background-attachment: initial; background-clip: initial; background-color: #f0f0f0; background-image: initial; background-origin: initial; border-bottom-color: rgb(204, 204, 204); border-bottom-style: dashed; border-bottom-width: 1px; border-image: initial; border-left-color: rgb(204, 204, 204); border-left-style: dashed; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: dashed; border-right-width: 1px; border-top-color: rgb(204, 204, 204); border-top-style: dashed; border-top-width: 1px; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow-x: auto; overflow-y: auto; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 644px;"&gt;&lt;code style="word-wrap: normal;"&gt;AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =&amp;gt; {
   String resourceName = "AssemblyLoadingAndReflection." + new AssemblyName(args.Name).Name + ".dll";

   using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) {
      Byte[] assemblyData = new Byte[stream.Length];
      stream.Read(assemblyData, 0, assemblyData.Length);
      return Assembly.Load(assemblyData);
   }
};&lt;/code&gt;&lt;/pre&gt;
&lt;span style="font-size: xx-small;"&gt;Source:&amp;nbsp;&lt;a href="http://blogs.msdn.com/b/microsoft_press/archive/2010/02/03/jeffrey-richter-excerpt-2-from-clr-via-c-third-edition.aspx"&gt;http://blogs.msdn.com/b/microsoft_press/archive/2010/02/03/jeffrey-richter-excerpt-2-from-clr-via-c-third-edition.aspx&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
This blog post (&lt;a href="http://www.digitallycreated.net/Blog/61/combining-multiple-assemblies-into-a-single-exe-for-a-wpf-application"&gt;Combining multiple assemblies into a single EXE for a WPF application&lt;/a&gt;) contains a more comprehensive approach, and includes a way to incorporate this strategy into your build process via a AfterResolveReferences target:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-attachment: initial; background-clip: initial; background-color: #f0f0f0; background-image: initial; background-origin: initial; border-bottom-color: rgb(204, 204, 204); border-bottom-style: dashed; border-bottom-width: 1px; border-image: initial; border-left-color: rgb(204, 204, 204); border-left-style: dashed; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: dashed; border-right-width: 1px; border-top-color: rgb(204, 204, 204); border-top-style: dashed; border-top-width: 1px; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow-x: auto; overflow-y: auto; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 644px;"&gt;&lt;code style="word-wrap: normal;"&gt;&amp;lt;Target Name="AfterResolveReferences"&amp;gt;
  &amp;lt;ItemGroup&amp;gt;
    &amp;lt;EmbeddedResource Include="@(ReferenceCopyLocalPaths)" Condition="'%(ReferenceCopyLocalPaths.Extension)' == '.dll'"&amp;gt;
      &amp;lt;LogicalName&amp;gt;%(ReferenceCopyLocalPaths.DestinationSubDirectory)%(ReferenceCopyLocalPaths.Filename)%(ReferenceCopyLocalPaths.Extension)&amp;lt;/LogicalName&amp;gt;
    &amp;lt;/EmbeddedResource&amp;gt;
  &amp;lt;/ItemGroup&amp;gt;
&amp;lt;/Target&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;u&gt;&lt;a href="http://www.red-gate.com/products/dotnet-development/smartassembly/"&gt;RedGate Smart Assembly&lt;/a&gt;&lt;/u&gt;&lt;br /&gt;
Smart Assembly from Red Gate's &lt;a href="http://www.red-gate.com/products/dotnet-development/smartassembly/"&gt;description &lt;/a&gt;is "&lt;i&gt;an obfuscator that helps protect your .NET code against reverse-engineering, cracking, and modification&lt;/i&gt;".&lt;br /&gt;
&lt;br /&gt;
Smart Assembly also has the ability to combine multiple assemblies into a single one. &amp;nbsp;They describe this feature as &lt;i&gt;"Simplify the deployment of your application by packaging it in one file (Dependency Embedding with compression and encryption, and Dependency Merging)."&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;Notes:&lt;/u&gt;&lt;br /&gt;
...&amp;nbsp;ILMerge can not merge WPF assemblies (from a couple of sources). According to&amp;nbsp;&lt;a href="http://research.microsoft.com/en-us/people/mbarnett/ilmerge.aspx"&gt;Mike Barnett&lt;/a&gt;&amp;nbsp;the reason&amp;nbsp;is "&lt;i&gt;[WPF assemblies] contain resources with encoded assembly identities. ILMerge is unable to deserialize the resources, modify the assembly identities, and then re-serialize them.&lt;/i&gt;&amp;nbsp;". See &lt;b&gt;Assemblies as Resources&lt;/b&gt; above for an alternative.&lt;br /&gt;
&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;ILMerge cannot merge C++ assemblies containing native code&lt;br /&gt;
&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;br /&gt;
... Make sure you have accounted for assembly references before attempting to merge, or you will get an exception:&lt;br /&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-O2ZwNsfAvHw/TyLuQYLMJEI/AAAAAAAAHe0/N76oPKfguNw/s1600/UnresolvedAssemblyReference.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="92" src="http://3.bp.blogspot.com/-O2ZwNsfAvHw/TyLuQYLMJEI/AAAAAAAAHe0/N76oPKfguNw/s320/UnresolvedAssemblyReference.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Missing Reference Assembly Screenshot&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;span style="font-size: xx-small;"&gt;An exception occurred during merging:&lt;/span&gt;&lt;span style="font-size: xx-small;"&gt;Unresolved assembly reference not allowed: System.Data.Entity.&lt;/span&gt;&lt;span style="font-size: xx-small;"&gt;&amp;nbsp; &amp;nbsp;at System.Compiler.Ir2md.GetAssemblyRefIndex(AssemblyNode assembly)&lt;/span&gt;&lt;span style="font-size: xx-small;"&gt;&amp;nbsp; &amp;nbsp;at System.Compiler.Ir2md.GetTypeRefIndex(TypeNode type)&lt;/span&gt;&lt;span style="font-size: xx-small;"&gt;&amp;nbsp; &amp;nbsp;at System.Compiler.Ir2md.VisitReferencedType(TypeNode type)&lt;/span&gt;&lt;span style="font-size: xx-small;"&gt;&amp;nbsp; &amp;nbsp;at System.Compiler.Ir2md.VisitClass(Class Class)&lt;/span&gt;&lt;span style="font-size: xx-small;"&gt;&amp;nbsp; &amp;nbsp;at System.Compiler.Ir2md.VisitModule(Module module)&lt;/span&gt;&lt;span style="font-size: xx-small;"&gt;&amp;nbsp; &amp;nbsp;at System.Compiler.Ir2md.SetupMetadataWriter(String debugSymbolsLocation)&lt;/span&gt;&lt;span style="font-size: xx-small;"&gt;&amp;nbsp; &amp;nbsp;at System.Compiler.Ir2md.WritePE(Module module, String debugSymbolsLocation,&lt;/span&gt;&lt;span style="font-size: xx-small;"&gt;BinaryWriter writer)&lt;/span&gt;&lt;span style="font-size: xx-small;"&gt;&amp;nbsp; &amp;nbsp;at System.Compiler.Writer.WritePE(String location, Boolean writeDebugSymbols,&lt;/span&gt;&lt;span style="font-size: xx-small;"&gt;&amp;nbsp;Module module, Boolean delaySign, String keyFileName, String keyName)&lt;/span&gt;&lt;span style="font-size: xx-small;"&gt;&amp;nbsp; &amp;nbsp;at System.Compiler.Writer.WritePE(CompilerParameters compilerParameters, Modu&lt;/span&gt;&lt;span style="font-size: xx-small;"&gt;le module)&lt;/span&gt;&lt;span style="font-size: xx-small;"&gt;&amp;nbsp; &amp;nbsp;at ILMerging.ILMerge.Merge()&lt;/span&gt;&lt;span style="font-size: xx-small;"&gt;&amp;nbsp; &amp;nbsp;at ILMerging.ILMerge.Main(String[] args)&lt;/span&gt;&lt;/blockquote&gt;
&lt;br /&gt;
... A few comments says it removes&amp;nbsp;&amp;nbsp;XML Comments from the assembly.&lt;br /&gt;
&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;br /&gt;
&lt;u&gt;Resources:&lt;/u&gt;&lt;br /&gt;
&lt;a href="http://www.microsoft.com/download/en/confirmation.aspx?id=17630"&gt;ILMerge Download&lt;/a&gt;&amp;nbsp;- The Microsoft download center web page that provides the download link to install ILMerge. The actual installation is &lt;i&gt;ILMerge.msi&lt;/i&gt;.&lt;br /&gt;
&lt;a href="http://research.microsoft.com/en-us/people/mbarnett/ilmerge.aspx"&gt;Mike Barnett ILMerge&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://research.microsoft.com/en-us/people/mbarnett/ilmerge-40-exe-config.aspx"&gt;ILMerge config file for executing within the CLR v4.0 runtime&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://blogs.msdn.com/b/microsoft_press/archive/2010/02/03/jeffrey-richter-excerpt-2-from-clr-via-c-third-edition.aspx"&gt;Jeffrey Richter: Excerpt #2 from CLR via C#, Third Edition&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.digitallycreated.net/Blog/61/combining-multiple-assemblies-into-a-single-exe-for-a-wpf-application"&gt;Combining multiple assemblies into a single EXE for a WPF application&lt;/a&gt;
&lt;br /&gt;
&lt;u&gt;&lt;a href="http://www.red-gate.com/products/dotnet-development/smartassembly/"&gt;RedGate Smart Assembly&lt;/a&gt;&lt;/u&gt;
&lt;br /&gt;
&lt;a href="http://msdn.microsoft.com/en-us/netframework/aa569269"&gt;Tools &amp;amp; Utilities&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-3564483643582350";
/* 728x90, created 12/26/08 */
google_ad_slot = "8029697074";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1081905209486048806-6182221969929548707?l=chrisghardwick.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/AUR3llIc1Nh7zaN_j3YvkS65Ndc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/AUR3llIc1Nh7zaN_j3YvkS65Ndc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/AUR3llIc1Nh7zaN_j3YvkS65Ndc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/AUR3llIc1Nh7zaN_j3YvkS65Ndc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~4/AcC7zLEOAhg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://chrisghardwick.blogspot.com/feeds/6182221969929548707/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1081905209486048806&amp;postID=6182221969929548707" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/6182221969929548707?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/6182221969929548707?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~3/AcC7zLEOAhg/ilmerge-getting-started-merging-and.html" title="ILMerge: Getting Started, Merging, and Alternatives (to ILMerge)." /><author><name>Christopher Hardwick</name><uri>https://profiles.google.com/116172115963583202334</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-O2ZwNsfAvHw/TyLuQYLMJEI/AAAAAAAAHe0/N76oPKfguNw/s72-c/UnresolvedAssemblyReference.png" height="72" width="72" /><thr:total>0</thr:total><georss:featurename>Marietta, GA, USA</georss:featurename><georss:point>33.952602 -84.5499327</georss:point><georss:box>33.899958999999996 -84.6288967 34.005245 -84.4709687</georss:box><feedburner:origLink>http://chrisghardwick.blogspot.com/2012/01/ilmerge-getting-started-merging-and.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0ICQHc9eip7ImA9WhRUFU0.&quot;"><id>tag:blogger.com,1999:blog-1081905209486048806.post-1598326247858007466</id><published>2012-01-25T09:00:00.000-05:00</published><updated>2012-01-25T09:26:01.962-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-25T09:26:01.962-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term=".NET" /><category scheme="http://www.blogger.com/atom/ns#" term="log4net" /><title>log4Net: RollingFileAppender Class</title><content type="html">&lt;u&gt;What is&amp;nbsp;log4net?&lt;/u&gt;&lt;br /&gt;
Apache log4net from their website: "The Apache log4net library is a tool to help the programmer output log statements to a variety of output targets. log4net is a port of the excellent Apache log4j™ framework to the Microsoft® .NET runtime."&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;What is the&amp;nbsp;RollingFileAppender?&lt;/u&gt;&lt;br /&gt;
RollingFileAppender exists within the log4net in the log4net.Appender namespace. According to the &lt;a href="http://logging.apache.org/log4net/release/sdk/log4net.Appender.RollingFileAppender.html"&gt;website &lt;/a&gt;it's designed to append "&lt;i&gt;log files based on size or date or both&lt;/i&gt;.". A pretty basic description, but it does describe what this logging type does: it appends we log messages to an existing log (or creates a new one if none exists), and when it reaches the roll condition it creates a new file.&lt;br /&gt;
&lt;br /&gt;
The conditions under which a roll condition are reached are configured via the &lt;a href="http://logging.apache.org/log4net/release/sdk/log4net.Appender.RollingFileAppender.RollingStyle.html"&gt;RollingStyle &lt;/a&gt;&amp;nbsp;property. You can set the log to role based upon a date, file size, or a combination of the two (known as a composite in the documentation).&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;Configuration for the RollingFileAppender:&lt;/u&gt;&lt;br /&gt;
Configuration for the RollingFileAppender is primarily done in an xml configuration file, or your application configuration file.&lt;br /&gt;
&lt;br /&gt;
The good part of a configuration based approach is the ability to customize your logging based upon your&amp;nbsp;life-cycle&amp;nbsp;environment (think QA logging and production logging), or client your individual customer or client's needs.&lt;br /&gt;
&lt;br /&gt;
Log4net also supports&amp;nbsp;run time&amp;nbsp;(or in-code) configuration as well. If your interested in this type of configuration, you can get started here:&amp;nbsp;&lt;a href="http://logging.apache.org/log4net/release/manual/configuration.html"&gt;http://logging.apache.org/log4net/release/manual/configuration.html&lt;/a&gt;&lt;br /&gt;
&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;br /&gt;
In this &lt;a href="http://logging.apache.org/log4net/release/config-examples.html"&gt;example&lt;/a&gt;, the RollingFileAppender is configured to write the a file named log.txt, with the rolling condition of size, and specifies the&amp;nbsp;maximum&amp;nbsp;file&amp;nbsp;size. One important thing to note is the&amp;nbsp;&lt;span style="font-size: 13px;"&gt;&lt;staticlogfilename value="true"&gt; &amp;nbsp;&lt;/staticlogfilename&gt;&lt;/span&gt;in the example below. This will cause log4net to append a count number to the end of the log file as it creates new ones (Example: log.txt.1, log.txt.2, log.txt.3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&amp;lt;appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"&amp;gt;&amp;lt;/appender&amp;gt;&amp;lt;br /&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;lt;file value="log.txt"&amp;gt;&amp;lt;/file&amp;gt;&amp;lt;br /&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;lt;appendtofile value="true"&amp;gt;&amp;lt;/appendtofile&amp;gt;&amp;lt;br /&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;lt;rollingstyle value="Size"&amp;gt;&amp;lt;/rollingstyle&amp;gt;&amp;lt;br /&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;lt;maxsizerollbackups value="10"&amp;gt;&amp;lt;/maxsizerollbackups&amp;gt;&amp;lt;br /&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;lt;maximumfilesize value="100KB"&amp;gt;&amp;lt;/maximumfilesize&amp;gt;&amp;lt;br /&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;lt;staticlogfilename value="true"&amp;gt;&amp;lt;/staticlogfilename&amp;gt;&amp;lt;br /&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;lt;layout type="log4net.Layout.PatternLayout"&amp;gt;&amp;lt;/layout&amp;gt;&amp;lt;br /&amp;gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;conversionpattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"&amp;gt;&amp;lt;/conversionpattern&amp;gt;
&lt;/pre&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&lt;pre style="font-size: 13px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;/pre&gt;
This example is a little different. It's rolling is determined by the date setting. Note the datePattern used to control the format of the date for file names:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&amp;lt;appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"&amp;gt;
    &amp;lt;file value="logfile"&amp;gt;
    &amp;lt;appendtofile value="true"&amp;gt;
    &amp;lt;rollingstyle value="Composite"&amp;gt;
    &amp;lt;datepattern value="yyyyMMdd"&amp;gt;
    &amp;lt;maxsizerollbackups value="10"&amp;gt;
    &amp;lt;maximumfilesize value="1MB"&amp;gt;
    &amp;lt;layout type="log4net.Layout.PatternLayout"&amp;gt;
        &amp;lt;conversionpattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"&amp;gt;
    &amp;lt;/conversionpattern&amp;gt;&amp;lt;/layout&amp;gt;
&amp;lt;/maximumfilesize&amp;gt;&amp;lt;/maxsizerollbackups&amp;gt;&amp;lt;/datepattern&amp;gt;&amp;lt;/rollingstyle&amp;gt;&amp;lt;/appendtofile&amp;gt;&amp;lt;/file&amp;gt;&amp;lt;/appender&amp;gt;

&lt;/pre&gt;
&lt;br /&gt;
This represents a typical rolling date configuration section for log4net (&lt;a href="http://stackoverflow.com/questions/734963/log4net-rollingfileappender-with-composite-rolling-style-is-overwritting-data"&gt;thanks to dommer&lt;/a&gt;):&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&amp;lt;log4net&amp;gt;
    &amp;lt;appender name="RollingFile" type="log4net.Appender.RollingFileAppender"&amp;gt;
        &amp;lt;file value="c:\Logs\Today.log"/&amp;gt;
        &amp;lt;rollingStyle value="Date"/&amp;gt;
        &amp;lt;datePattern value="yyyyMMdd"/&amp;gt;
        &amp;lt;appendToFile value="true"/&amp;gt;
        &amp;lt;layout type="log4net.Layout.PatternLayout"&amp;gt;
            &amp;lt;conversionPattern value="%level %logger %date{ISO8601} - %message%newline"/&amp;gt;
        &amp;lt;/layout&amp;gt;
    &amp;lt;/appender&amp;gt;
    &amp;lt;root&amp;gt;
        &amp;lt;!-- Options are "ALL", "DEBUG", "INFO", "WARN", "ERROR", "FATAL" and "OFF". --&amp;gt;
        &amp;lt;level value="ERROR"/&amp;gt;
        &amp;lt;appender-ref ref="RollingFile"/&amp;gt;
    &amp;lt;/root&amp;gt;
&amp;lt;/log4net&amp;gt;
&lt;/pre&gt;
&lt;br /&gt;
&lt;u&gt;Consider your larger logging strategy with RollingFileAppender&lt;/u&gt;&lt;br /&gt;
Every single application should generate log entries. The world is an imperfect place, and the log at a minimum should tell you about those&amp;nbsp;imperfections. However, depending on your logging "enthusiasm" and logging level you are going to write messages. Even a small application can generate a&amp;nbsp;tremendous&amp;nbsp;amount of logging data.&lt;br /&gt;
&lt;br /&gt;
RollingFileAppender can help with that by:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Naturally&amp;nbsp;segmenting your data into smaller files (making a potential search later on) easier&lt;/li&gt;
&lt;li&gt;If you use the date&amp;nbsp;&lt;a href="http://logging.apache.org/log4net/release/sdk/log4net.Appender.RollingFileAppender.RollingStyle.html"&gt;RollingStyle&lt;/a&gt;&amp;nbsp;then you will have files seperated by day&lt;/li&gt;
&lt;li&gt;RollingFileAppender can also manage the destruction of older log files with the&amp;nbsp;maxSizeRollBackups. This will allow you to set the number of archive files to keep online.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
If you combine these features with a strategy to potentially compress, and store files (or destroy them with&amp;nbsp;maxSizeRollBackups) then you can have a self-managed and effective strategy to track messages.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;u&gt;Notes:&lt;/u&gt;&lt;br /&gt;
... RollingFileAppender full name is &lt;i&gt;log4net.Appender.RollingFileAppender&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
... Build this into a larger logging and archiving strategy.&lt;br /&gt;
&lt;br /&gt;
... Is log4Net's RollingFileAppender class any better than any other logging libraries rolling file appender? Just is still out.&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;Resources:&lt;/u&gt;&lt;br /&gt;
&lt;a href="http://logging.apache.org/log4net/"&gt;log4net&lt;/a&gt;
&lt;br /&gt;
&lt;a href="http://logging.apache.org/log4net/release/sdk/log4net.Appender.RollingFileAppender.html"&gt;RollingFileAppender Class&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://logging.apache.org/log4net/release/manual/configuration.html"&gt;log4net Manual Configuration&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.codeproject.com/Articles/140911/log4net-Tutorial"&gt;log4net Tutorial&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-3564483643582350";
/* 728x90, created 12/26/08 */
google_ad_slot = "8029697074";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1081905209486048806-1598326247858007466?l=chrisghardwick.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ukHouvub9a0MabzFd-AfCkXgGuM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ukHouvub9a0MabzFd-AfCkXgGuM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ukHouvub9a0MabzFd-AfCkXgGuM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ukHouvub9a0MabzFd-AfCkXgGuM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~4/cZLj66JgfhE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://chrisghardwick.blogspot.com/feeds/1598326247858007466/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1081905209486048806&amp;postID=1598326247858007466" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/1598326247858007466?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/1598326247858007466?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~3/cZLj66JgfhE/log4net-rollingfileappender-class.html" title="log4Net: RollingFileAppender Class" /><author><name>Christopher Hardwick</name><uri>https://profiles.google.com/116172115963583202334</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><georss:featurename>Marietta, GA, USA</georss:featurename><georss:point>33.952602 -84.5499327</georss:point><georss:box>33.899916499999996 -84.6288967 34.0052875 -84.4709687</georss:box><feedburner:origLink>http://chrisghardwick.blogspot.com/2012/01/log4net-rollingfileappender-class.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8GRnkzfSp7ImA9WhRUFEw.&quot;"><id>tag:blogger.com,1999:blog-1081905209486048806.post-2414644260480163754</id><published>2012-01-24T09:00:00.000-05:00</published><updated>2012-01-24T09:20:27.785-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-24T09:20:27.785-05:00</app:edited><title>Adding CDATA - (Unparsed) Character Data to XElement</title><content type="html">When working with the System.Linq.Xml namespace, and creating an XDocument you may need to create create document data that &amp;nbsp;that should not be parsed by the XML parser. For example: data with XML reserved characters, xml content, html content (or really anything you do not want to be parsed).&lt;br /&gt;
&lt;br /&gt;
Creating data within a CDATA tag is simple, simply wrap the content within the XElement in an additional object called &lt;a href="http://msdn.microsoft.com/en-us/library/system.xml.linq.xcdata.aspx"&gt;XCData&lt;/a&gt;.&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;pre style="font-family: Consolas, Courier, monospace; font-size: 13px; overflow-x: auto; overflow-y: auto; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px; text-align: left; word-break: break-all; word-wrap: break-word;"&gt;XDocument contactsDoc =
   new XDocument(
      new XDeclaration("1.0", "utf-8", "yes"),
      new XComment("LINQ to XML Contacts XML Example"),
      new XProcessingInstruction("MyApp", "123-44-4444"),
      new XElement("contacts",
         new XElement("contact",
            new XElement("name", "Patrick Hines"), 
            new XElement("comment", &lt;span style="color: #274e13;"&gt;&lt;b&gt;new XCData("ALERT! &lt;b&gt;Do not call!&lt;/b&gt;")&lt;/b&gt;&lt;/span&gt;),
            new XElement("address",
               new XElement("street1", "123 Main St"),
               new XElement("city", "Mercer Island"),
               new XElement("state", "WA"),
               new XElement("postal", "68042")
            )
         )
      )
   );&lt;/pre&gt;
&lt;span style="font-size: xx-small;"&gt;Sample adapted from&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/bb308960.aspx"&gt;.NET Language-Integrated Query for XML Data&lt;/a&gt;&lt;/span&gt;&lt;span style="font-family: Consolas, Courier, monospace; font-size: 13px; text-align: left;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;
References:&lt;br /&gt;
&lt;a href="http://www.w3schools.com/xml/xml_cdata.asp"&gt;CDATA&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://msdn.microsoft.com/en-us/library/bb308960.aspx"&gt;.NET Language-Integrated Query for XML Data&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://msdn.microsoft.com/en-us/library/system.xml.linq.xcdata.aspx"&gt;XCData Class&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-3564483643582350";
/* 728x90, created 12/26/08 */
google_ad_slot = "8029697074";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1081905209486048806-2414644260480163754?l=chrisghardwick.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/KCCByWAS82R23hpXWvWUK1Y1mVw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KCCByWAS82R23hpXWvWUK1Y1mVw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/KCCByWAS82R23hpXWvWUK1Y1mVw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KCCByWAS82R23hpXWvWUK1Y1mVw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~4/PGKNXgFOqUw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://chrisghardwick.blogspot.com/feeds/2414644260480163754/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1081905209486048806&amp;postID=2414644260480163754" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/2414644260480163754?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/2414644260480163754?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~3/PGKNXgFOqUw/adding-cdata-unparsed-character-data-to.html" title="Adding CDATA - (Unparsed) Character Data to XElement" /><author><name>Christopher Hardwick</name><uri>https://profiles.google.com/116172115963583202334</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><georss:featurename>Marietta, GA, USA</georss:featurename><georss:point>33.952602 -84.5499327</georss:point><georss:box>33.899958999999996 -84.6288967 34.005245 -84.4709687</georss:box><feedburner:origLink>http://chrisghardwick.blogspot.com/2012/01/adding-cdata-unparsed-character-data-to.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkYFRn47cSp7ImA9WhRUE04.&quot;"><id>tag:blogger.com,1999:blog-1081905209486048806.post-8059820444978856389</id><published>2012-01-23T09:48:00.002-05:00</published><updated>2012-01-23T09:48:37.009-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-23T09:48:37.009-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term=".NET" /><category scheme="http://www.blogger.com/atom/ns#" term="Best Practices" /><category scheme="http://www.blogger.com/atom/ns#" term="Open Source" /><category scheme="http://www.blogger.com/atom/ns#" term="Architecture" /><category scheme="http://www.blogger.com/atom/ns#" term="Validation" /><category scheme="http://www.blogger.com/atom/ns#" term="Design" /><title>Check -&gt; Argument -&gt; Condition: .NET 4.0 Code Contract,  CuttingEdge.Conditions, Shrinkr Check</title><content type="html">&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
An early part of designing an effective, maintainable system is consistency. The more consistent your applications responses, the better it will be in the long term. One place that breeds inconsistency in parameter validation, and exception throwing.&lt;br /&gt;
&lt;br /&gt;
So I set out to find a condition checking library capable of&amp;nbsp;accomplishing&amp;nbsp;a few simple goals:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Must provide a simple interface for validating conditions (object and state)&lt;/li&gt;
&lt;li&gt;Must have a consistent response algorithm&amp;nbsp;or&amp;nbsp;structure&lt;/li&gt;
&lt;li&gt;Must be written in .NET&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Must be open-source&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
With the additional side-goals (or bonus points):&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;A fluent interface&lt;/li&gt;
&lt;li&gt;Documentation or code samples&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nuget.org/"&gt;NuGet &lt;/a&gt;package&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
There are plenty of libraries and source-code examples out there that accomplish these goals:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd264808.aspx"&gt;.NET 4.0 Code Contracts&amp;nbsp;&lt;/a&gt;- Code Contracts provide a language-agnostic way to express coding assumptions in .NET programs.. The Common Language Runtime (CLR) team is introducing a library to allow programming with contracts in the Microsoft .NET Framework 4.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://shrinkr.codeplex.com/releases/view/43879"&gt;Shrinkr's Check&lt;/a&gt;&amp;nbsp;-&amp;nbsp;&amp;nbsp;"&lt;i&gt;a Url Shortening Service which demonstrates some of the best practices in developing real life web applications.&lt;/i&gt;" and contains a fluent checking class structure.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://conditions.codeplex.com/"&gt;CuttingEdge.Conditions&lt;/a&gt;&amp;nbsp;-&amp;nbsp;CuttingEdge.Conditions is a library that helps developers to write pre- and postcondition validations in their C# 3.0 and VB.NET 9.0 code base.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://weblogs.manas.com.ar/bcardiff/2007/12/guardq-guard-class-meets-linq/"&gt;GuardQ&amp;nbsp;&lt;/a&gt;- validating function arguments.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentvalidation.codeplex.com/"&gt;Fluent Validation&lt;/a&gt;&amp;nbsp;- "A small validation library for .NET that uses a fluent interface and lambda expressions for building validation rules for your business objects."&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentvalidationnet2.codeplex.com/"&gt;FluentValidation for .NET 2.0&lt;/a&gt;&amp;nbsp;-&amp;nbsp;Rework of the popular FluentValidation library to work in .NET 2.0. There is one minor syntax change and the LinqBridge (lambda syntax for 2.0) library is required, so please read the docs. Namespaces and licenses are similar to FluentValidation.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
Here are a few:&lt;br /&gt;
&lt;a href="http://conditions.codeplex.com/"&gt;CuttingEdge.Conditions&lt;/a&gt;&lt;br /&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;br /&gt;
&lt;a href="http://1.bp.blogspot.com/-ihkUTCSzfdI/TxmZOApwWeI/AAAAAAAAHek/mHRpyUnXiQM/s1600/ValidatorExtensions.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="190" src="http://1.bp.blogspot.com/-ihkUTCSzfdI/TxmZOApwWeI/AAAAAAAAHek/mHRpyUnXiQM/s320/ValidatorExtensions.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;CuttingEdge.&amp;nbsp;Condition&amp;nbsp;Validation Extensions&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Conditions is an open-source project (available on &lt;a href="http://conditions.codeplex.com/"&gt;CodePlex&lt;/a&gt;) that "&lt;i&gt;CuttingEdge.Conditions is a library that helps developers to write pre- and postcondition validations&lt;/i&gt;". The library supports a wide-variety of conditions (including those great string based IsNotNullOrEmpty). On the right is a screenshot of the condition validation extensions if you want a quick look.&lt;br /&gt;
&lt;br /&gt;
The library provides a consist way to manage condition checking, and even provides a way to pass a formatted string for the exception message:&lt;br /&gt;
Condition.Requires(context, "id").IsNotNull("Parameter {0} cannot be a null reference");&lt;br /&gt;
&lt;br /&gt;
Another feature that this library provides is the&amp;nbsp;WithExceptionOnFailure (&lt;b&gt;AlternativeExceptionCondition WithExceptionOnFailure&lt;texception&gt;() where TException : Exception&lt;/texception&gt;&lt;/b&gt;) allowing you to define the exception to be raised when the condition fails. While this is not something you would generally want to do, the added flexibility is certainly appreciated.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://msdn.microsoft.com/en-us/library/dd264808.aspx"&gt;.NET 4.0 Code Contracts&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
.NET Code Contracts is part of the 4.0 version of the .NET framework. From&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/dd264808.aspx"&gt;MSDN&lt;/a&gt;: "&lt;i&gt;Code contracts provide a way to specify preconditions, postconditions, and object invariants in your code. Preconditions are requirements that must be met when entering a method or property. Postconditions describe expectations at the time the method or property code exits. Object invariants describe the expected state for a class that is in a good state.&lt;/i&gt;"&lt;br /&gt;
&lt;br /&gt;
It seems intuitive, and easy.&lt;br /&gt;
&lt;br /&gt;
The downside? It requires your application run on .NET 4.0. If your already ugpraded, this seems like a great choice. I mean, it's built into the Framework (no external dependencies ++), and generally offers a&amp;nbsp;comparable&amp;nbsp;offering to other open-source implementations designed to provide this functionality.&lt;br /&gt;
&lt;br /&gt;
Compared side-to-side with Conditions, the syntax and code appear very&amp;nbsp;similar:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: xx-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;b&gt;Contract &lt;/b&gt;-&amp;gt; Contract.Requires&lt;argumentnullexception&gt;(context != null, "Parameter context cannot be a null reference");&lt;/argumentnullexception&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: xx-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;b&gt;Condition&lt;/b&gt;-&amp;gt; Condition.Requires(context, "context").IsNotNull("Parameter {0} cannot be a null reference");&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
It's&amp;nbsp;slightly&amp;nbsp;more flexible in it's implementation than Condition. Most&amp;nbsp;notably&amp;nbsp;because Condition has a&amp;nbsp;default&amp;nbsp;set of validations, and exceptions, and Contract is wide open.&lt;br /&gt;
&lt;br /&gt;
As an additional bonus, Code Contracts offer&amp;nbsp;Legacy Requires Statements. From &lt;a href="http://msdn.microsoft.com/en-us/library/system.diagnostics.contracts.contract.endcontractblock.aspx"&gt;their description&lt;/a&gt; it is:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;i&gt;Most code already contains some parameter validation in the form of if-then-throw code. The contract tools recognize if-then-throw statements as preconditions when the statements appear first inside a method, and the entire set of such statements is followed by an explicit Contract method call, such as a Requires, Ensures, EnsuresOnThrow, or EndContractBlock.&lt;/i&gt;&lt;/blockquote&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;i&gt;When if-then-throw statements appear in this form, the contract tools recognize them as legacy-require statements. The EndContractBlock form is used only if no other contracts follow the if-then-throw sequences, but they should still be tagged as legacy-requires.&lt;/i&gt;&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;a href="http://shrinkr.codeplex.com/releases/view/43879"&gt;Shrinkr&lt;/a&gt;&lt;u&gt;'s&amp;nbsp;Check.Argument&lt;/u&gt;&lt;br /&gt;
&lt;a href="http://shrinkr.codeplex.com/releases/view/43879"&gt;Shrinkr&lt;/a&gt;&amp;nbsp;is "&lt;i&gt;a Url Shortening Service which demonstrates some of the best practices in developing real life web applications.&lt;/i&gt;" and contains a fluent checking class structure. It's simple, clean and provides a way to validate&amp;nbsp;arguments&amp;nbsp;and provide predicable exception handling.&lt;br /&gt;
&lt;br /&gt;
Here's an example of the Check class. I have also seen a version of this where the Check, Argument classes are not static (from another location):&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;pre class="lang-cs prettyprint" style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; line-height: 18px; margin-bottom: 10px; max-height: 600px; overflow-x: auto; overflow-y: auto; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px; text-align: left; vertical-align: baseline; width: auto;"&gt;&lt;code style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;public&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;static&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;class&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Check&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;
&lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;{&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;
&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;public&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;static&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;class&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Argument&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;
&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;{&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;public&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;static&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;void&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;IsNotNull&lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;(&lt;/span&gt;&lt;span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;object&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; parameter&lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;,&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;string&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; parameterName&lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;)&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;{&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;...&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;}&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;public&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;static&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;void&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;IsNotNullOrEmpty&lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;(&lt;/span&gt;&lt;span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;string&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; parameter&lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;,&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;string&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; parameterName&lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;)&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;{&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;...&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;}&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;

&amp;nbsp;&lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;....&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; etc &lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;....&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;
&lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
This provides the basic context that&amp;nbsp;&lt;a href="http://conditions.codeplex.com/"&gt;Conditions&lt;/a&gt;&amp;nbsp;provides, but is a far simpler&amp;nbsp;implementation. It's also more of a larger project and really out there as a stand-alone library. However, it does meet the goals above, and would be an easy addition to any enterprise's library.&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;End-Notes:&lt;/u&gt;&lt;br /&gt;
... I still like Conditions the best, but only slightly. Mostly it's the little things, like formatted messages (so I can extract it to a resource) or the validations already built and ready to go.&lt;br /&gt;
&lt;br /&gt;
... There are plenty of options to choose from. Pick one and start using it. Almost all of these will produce better, more consistent results than role-your-own. If your code does not validate add this and get started.&lt;br /&gt;
&lt;br /&gt;
... This is an easy upgrade to your library that will produce good results in the short, middle and long term.&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;Resources:&lt;/u&gt;&lt;br /&gt;
&lt;a href="http://shrinkr.codeplex.com/releases/view/43879"&gt;Shrinkr&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://conditions.codeplex.com/"&gt;CuttingEdge.Conditions&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://nuget.org/packages/CuttingEdge.Conditions"&gt;CuttingEdge.Conditions (NuGet)&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://nuget.org/"&gt;NuGet&lt;/a&gt;
&lt;br /&gt;
&lt;a href="http://fluentvalidation.codeplex.com/"&gt;Fluent Validation&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://msdn.microsoft.com/en-us/magazine/ee236408.aspx"&gt;.NET 4.0 Code Contracts on MSDN Magazine&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://msdn.microsoft.com/en-us/devlabs/dd491992"&gt;DevLabs Code Contracts&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://fluentvalidation.codeplex.com/"&gt;Fluent Validation&lt;/a&gt;
&lt;br /&gt;
&lt;a href="http://fluentvalidationnet2.codeplex.com/"&gt;FluentValidation for .NET 2.0&lt;/a&gt;
&lt;br /&gt;
&lt;a href="http://weblogs.manas.com.ar/bcardiff/2007/12/guardq-guard-class-meets-linq/"&gt;GuardQ&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-3564483643582350";
/* 728x90, created 12/26/08 */
google_ad_slot = "8029697074";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1081905209486048806-8059820444978856389?l=chrisghardwick.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/P0Pa6PsWW_uMpADfx-52csHH5sY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/P0Pa6PsWW_uMpADfx-52csHH5sY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/P0Pa6PsWW_uMpADfx-52csHH5sY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/P0Pa6PsWW_uMpADfx-52csHH5sY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~4/YICNMO_Aqco" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://chrisghardwick.blogspot.com/feeds/8059820444978856389/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1081905209486048806&amp;postID=8059820444978856389" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/8059820444978856389?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/8059820444978856389?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~3/YICNMO_Aqco/check-argument-condition-net-40-code.html" title="Check -&gt; Argument -&gt; Condition: .NET 4.0 Code Contract,  CuttingEdge.Conditions, Shrinkr Check" /><author><name>Christopher Hardwick</name><uri>https://profiles.google.com/116172115963583202334</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-ihkUTCSzfdI/TxmZOApwWeI/AAAAAAAAHek/mHRpyUnXiQM/s72-c/ValidatorExtensions.png" height="72" width="72" /><thr:total>0</thr:total><georss:featurename>Marietta, GA, USA</georss:featurename><georss:point>33.952602 -84.5499327</georss:point><georss:box>33.899916499999996 -84.6288967 34.0052875 -84.4709687</georss:box><feedburner:origLink>http://chrisghardwick.blogspot.com/2012/01/check-argument-condition-net-40-code.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A04HRX0-eyp7ImA9WhRUEEs.&quot;"><id>tag:blogger.com,1999:blog-1081905209486048806.post-4569401648420920286</id><published>2012-01-20T09:00:00.000-05:00</published><updated>2012-01-20T09:32:14.353-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-20T09:32:14.353-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Development" /><category scheme="http://www.blogger.com/atom/ns#" term="Cloud" /><category scheme="http://www.blogger.com/atom/ns#" term="NoSQL" /><category scheme="http://www.blogger.com/atom/ns#" term="DynamoDB" /><category scheme="http://www.blogger.com/atom/ns#" term="Aws" /><title>Amazon DynamoDB: First Impressions</title><content type="html">An e-mail arrived this morning from Amazon Web Services (Aws):&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-WuXn4K2F5nE/TxhEqKtt5oI/AAAAAAAAHeM/lWcWXYZ5DsQ/s1600/AnnouncementEmail.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="162" src="http://3.bp.blogspot.com/-WuXn4K2F5nE/TxhEqKtt5oI/AAAAAAAAHeM/lWcWXYZ5DsQ/s200/AnnouncementEmail.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
It was a new feature announcement from Aws.&lt;br /&gt;
&lt;br /&gt;
The new product is DynamoDB... a new NoSQL database engine for Amazon Web Services (Aws)&lt;br /&gt;
&lt;br /&gt;
From the e-mail, it's described as "&lt;i&gt;Amazon DynamoDB, a fully managed NoSQL database service that provides fast and predictable performance with seamless scalability&lt;/i&gt;".&lt;br /&gt;
&lt;br /&gt;
It has some interesting key points:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Data on Solid State Drives (SSDs)&lt;/li&gt;&lt;li&gt;Replicated data synchronously across multiple zones.&lt;/li&gt;&lt;li&gt;&lt;span style="background-color: white; color: #151515; font-family: adelle-1, adelle-2, serif; font-size: 15px; line-height: 24px;"&gt;Supports two types of primary keys:&amp;nbsp;&lt;/span&gt;&lt;strong style="background-color: white; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: adelle-1, adelle-2, serif; font-size: 15px; font-weight: 700; line-height: 24px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Hash Type&lt;/strong&gt;&amp;nbsp;and&amp;nbsp;&lt;strong style="background-color: white; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: adelle-1, adelle-2, serif; font-size: 15px; font-weight: 700; line-height: 24px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Hash and Range Type&lt;/strong&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;span style="background-color: white; color: #151515; font-family: adelle-1, adelle-2, serif; font-size: 15px; line-height: 24px;"&gt;JSON for data transport&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;div&gt;This new product is a&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/NoSQL"&gt;NoSQL&lt;/a&gt;&amp;nbsp;database engine built into their cloud&amp;nbsp;infrastructure (similar to &lt;a href="http://aws.amazon.com/simpledb/"&gt;SimpleDB &lt;/a&gt;as a product, but with some notable changes and upgrades).&lt;br /&gt;
&lt;br /&gt;
From CTO Werner Vogels' &lt;a href="http://www.allthingsdistributed.com/2012/01/amazon-dynamodb.html"&gt;DynamoDB blog post&lt;/a&gt; he states the differences between SimpleDB and DynamoDB: "&lt;i&gt;While SimpleDB has been successful and powers the applications of many customers, it has some limitations that customers have consistently asked us to address.&lt;/i&gt;"&amp;nbsp;Listing: &lt;i&gt;Domain scaling limitations, Predictability of Performance, and SimpleDB's Pricing complexity&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
From the documentation, it appears to be similar to their existing&amp;nbsp;&amp;nbsp;&lt;a href="http://aws.amazon.com/simpledb/"&gt;SimpleDB&lt;/a&gt;&amp;nbsp;offering, but is designed for large scale needs (and predictable)&amp;nbsp;performance. Most&amp;nbsp;notably&amp;nbsp;no limits or restrictions on database size, and automatic management of scalability across multiple servers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;What is NoSQL?&amp;nbsp;&lt;/u&gt;&lt;br /&gt;
According to Wikipedia's&amp;nbsp;&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/NoSQL"&gt;NoSQL&lt;/a&gt;&amp;nbsp;article:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;&lt;span style="background-color: white; font-family: sans-serif; font-size: 13px; line-height: 19px;"&gt;In&amp;nbsp;&lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Computing" style="background-attachment: initial; background-clip: initial; background-color: white; background-image: none; background-origin: initial; color: #0b0080; font-family: sans-serif; font-size: 13px; line-height: 19px;" title="Computing"&gt;computing&lt;/a&gt;&lt;span style="background-color: white; font-family: sans-serif; font-size: 13px; line-height: 19px;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;b style="background-color: white; font-family: sans-serif; font-size: 13px; line-height: 19px;"&gt;NoSQL&lt;/b&gt;&lt;span style="background-color: white; font-family: sans-serif; font-size: 13px; line-height: 19px;"&gt;&amp;nbsp;(sometimes expanded to "not only SQL") is a broad class of&amp;nbsp;&lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Database_management_system" style="background-attachment: initial; background-clip: initial; background-color: white; background-image: none; background-origin: initial; color: #0b0080; font-family: sans-serif; font-size: 13px; line-height: 19px; text-decoration: none;" title="Database management system"&gt;database management systems&lt;/a&gt;&lt;span style="background-color: white; font-family: sans-serif; font-size: 13px; line-height: 19px;"&gt;&amp;nbsp;that differ from the classic model of the&amp;nbsp;&lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Relational_database_management_system" style="background-attachment: initial; background-clip: initial; background-color: white; background-image: none; background-origin: initial; color: #0b0080; font-family: sans-serif; font-size: 13px; line-height: 19px; text-decoration: none;" title="Relational database management system"&gt;relational database management system&lt;/a&gt;&lt;span style="background-color: white; font-family: sans-serif; font-size: 13px; line-height: 19px;"&gt;&amp;nbsp;(RDBMS) in some significant ways, most important being they do not use&amp;nbsp;&lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/SQL" style="background-attachment: initial; background-clip: initial; background-color: white; background-image: none; background-origin: initial; color: #0b0080; font-family: sans-serif; font-size: 13px; line-height: 19px; text-decoration: none;" title="SQL"&gt;SQL&lt;/a&gt;&lt;span style="background-color: white; font-family: sans-serif; font-size: 13px; line-height: 19px;"&gt;&amp;nbsp;as their query language.&lt;/span&gt;&lt;/blockquote&gt;&lt;u&gt;DynamoDB Storage Model (1000 ft view)&lt;/u&gt;&lt;br /&gt;
From their documentation, each object (or item) is stored within a table, with the&amp;nbsp;individual&amp;nbsp;values within the item stored as attributes:&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-ZeGr9xqcKeE/TxjhhifK6mI/AAAAAAAAHeU/gYt-yjHR2h4/s1600/dynamodb_schema_sample.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="181" src="http://4.bp.blogspot.com/-ZeGr9xqcKeE/TxjhhifK6mI/AAAAAAAAHeU/gYt-yjHR2h4/s320/dynamodb_schema_sample.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;From&amp;nbsp;&lt;a href="http://aws.amazon.com/dynamodb//180-0827430-2577003/#whentousedynamodb"&gt;Amazon DynamoDB (beta)&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;u&gt;Getting Started&lt;/u&gt;&lt;br /&gt;
In order to get started with DynamoDB, you have to make sure you have a couple of things:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Amazon Web Services developer account&lt;/li&gt;&lt;li&gt;Your AWS account has to be set up to use Amazon DynamoDB&lt;/li&gt;&lt;li&gt;Your AWS Access and Secret Key (in order to run the examples, or start your development project)&lt;/li&gt;&lt;/ul&gt;&lt;u&gt;DynamoDB and .NET&lt;/u&gt;&lt;br /&gt;
The&amp;nbsp;&lt;a href="http://aws.amazon.com/sdkfornet/"&gt;AWS SDK for .NET&lt;/a&gt; has been updated to contain samples for using DynamoDB with the .NET framework (&lt;i&gt;fair warning if you have a previous version of the SDK you may have to remove it to install this one&lt;/i&gt;).&lt;br /&gt;
&lt;br /&gt;
The SDK contains (basically) 4 samples:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-2aTdCEbQxL0/TxjpFJH4h9I/AAAAAAAAHec/EqdCFsBfiIQ/s1600/AmazonDynamoDB-Sample.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-2aTdCEbQxL0/TxjpFJH4h9I/AAAAAAAAHec/EqdCFsBfiIQ/s1600/AmazonDynamoDB-Sample.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;Data Model Sample&lt;/b&gt; - creation of a context, persistence of items using the context, and some queries against the context.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Data Model Schema&lt;/b&gt; - Samples of objects that can be stored within DynamoDB. Specific would be the use attributes:&amp;nbsp;DynamoDBTable that "&lt;i&gt;Specifies that this object can be stored in DynamoDB&lt;/i&gt;".&amp;nbsp;DynamoDBHashKey,&amp;nbsp;DynamoDBProperty, and&amp;nbsp;DynamoDBRangeKey to name a few.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Document Model Sample&lt;/b&gt; - Demonstrates the document model. Shows creation of a table, and adding documents to a table, persistence, and querying from the model.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Table Operations&lt;/b&gt; - Basic table operations: Contains, CreateTable, table status, table deletes.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;
These samples are available for VS 2008 and VS 2010. With my installation, the samples were located at&amp;nbsp;C:\Program Files (x86)\AWS SDK for .NET\Samples\AmazonDynamoDB_Sample.&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;Pricing&amp;nbsp;(as of 1/19/2012)&lt;/u&gt;&lt;br /&gt;
&lt;a href="http://nosql.mypopescu.com/post/16064274863/notes-about-amazon-dynamodb"&gt;Notes About Amazon DynamoDB&lt;/a&gt;&amp;nbsp;states it pretty well "pricing is based on actual write/read operations and not API calls (e.g. a query returning 100 results accounts for 100 ops and not 1 op)".&lt;br /&gt;
&lt;span style="color: #151515; font-family: adelle-1, adelle-2, serif;"&gt;&lt;span style="font-size: 15px; line-height: 24px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style="background-color: white; font-family: verdana, arial, helvetica, clean, sans-serif; font-size: 12px; line-height: 18px; margin-bottom: 1em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left;"&gt;You pay a flat, hourly rate based on the capacity you reserve:&lt;/div&gt;&lt;div style="background-color: white; font-family: verdana, arial, helvetica, clean, sans-serif; font-size: 12px; line-height: 18px; margin-bottom: 1em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left;"&gt;&lt;/div&gt;&lt;div style="background-color: #fdfdef; border-bottom-color: rgb(201, 205, 208); border-bottom-style: solid; border-bottom-width: 1px; border-image: initial; border-left-color: rgb(201, 205, 208); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(201, 205, 208); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(201, 205, 208); border-top-style: solid; border-top-width: 1px; font-family: verdana, arial, helvetica, clean, sans-serif; font-size: 12px; line-height: 18px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 12px; padding-left: 14px; padding-right: 14px; padding-top: 12px; text-align: left;"&gt;&lt;div style="color: #e47911; font-size: 15px; font-weight: bold; margin-bottom: 1em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Throughput Capacity&lt;/div&gt;&lt;div style="margin-bottom: 1em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Write Throughput: $0.01 per hour for every 10 units of Write Capacity&lt;/div&gt;&lt;/div&gt;&lt;span style="background-color: #fdfdef; font-family: verdana, arial, helvetica, clean, sans-serif; font-size: 12px; line-height: 18px; text-align: left;"&gt;Read Throughput: $0.01 per hour for every 50 units of Read Capacity&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
The listed pricing (as of 1/19/2012) offers a free-pricing tier as well:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;&lt;div style="background-color: #fdfdef; color: #e47911; font-family: verdana, arial, helvetica, clean, sans-serif; font-size: 15px; font-weight: bold; line-height: 18px; margin-bottom: 1em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left;"&gt;Free Tier*&lt;/div&gt;&lt;div style="background-color: #fdfdef; font-family: verdana, arial, helvetica, clean, sans-serif; font-size: 12px; line-height: 18px; margin-bottom: 1em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left;"&gt;As part of&amp;nbsp;&lt;a href="http://aws.amazon.com/free/" style="color: #996633;"&gt;AWS’s Free Usage Tier&lt;/a&gt;, AWS customers can get started with Amazon DynamoDB for free. DynamoDB customers get 100 MB of free storage, as well 5 writes/second and 10 reads/second of ongoing throughput capacity.&lt;/div&gt;&lt;/blockquote&gt;&lt;u&gt;Final Thoughts:&lt;/u&gt;&lt;br /&gt;
... What's missing: From&amp;nbsp;CTO Werner Vogels'&amp;nbsp;&lt;a href="http://www.allthingsdistributed.com/2012/01/amazon-dynamodb.html"&gt;DynamoDB blog post&lt;/a&gt;&amp;nbsp;one comment from Faraz points out one of the key components missing from DynamoDB's initial offering: "missing critical database pillar of snapshot backup and fast recovery system". Vogel's response: "we have a philosophy of launching with a minimal feature set and then quickly iterating while prioritizing based on customer feedback. Backup/Restore for DynamoDB will have high priority". While true, I'm still waiting for &lt;a href="https://forums.aws.amazon.com/thread.jspa?threadID=51373"&gt;micro in VPC&lt;/a&gt;!&lt;br /&gt;
&lt;br /&gt;
... "pure local emulation is not available". &amp;nbsp;However, there is an open-source project to provide this&amp;nbsp;emulation&amp;nbsp;for SimpleDB: &lt;a href="https://github.com/stephenh/fakesdb"&gt;fakesdb&lt;/a&gt;&amp;nbsp;(a fake version of Amazon's SimpleDB for local/integration testing).&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;... JSON is used for sending data and for responses, but it is not used as the native storage schema (from &lt;br /&gt;
&lt;a href="http://nosql.mypopescu.com/post/16064274863/notes-about-amazon-dynamodb"&gt;Notes About Amazon DynamoDB&lt;/a&gt;).&lt;br /&gt;
&lt;br /&gt;
... &lt;a href="http://www.datastax.com/dev/blog/amazon-dynamodb"&gt;DynamoDB vs. Cassandra&lt;/a&gt;&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;u&gt;Resources:&lt;/u&gt;&lt;br /&gt;
&lt;a href="http://aws.amazon.com/"&gt;Amazon Web Services&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://aws.amazon.com/dynamodb//180-0827430-2577003/"&gt;Amazon DynamoDB&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://en.wikipedia.org/wiki/NoSQL"&gt;NoSQL&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/Introduction.html?r=8189"&gt;What is Amazon DynamoDB?&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://aws.amazon.com/sdkfornet/"&gt;AWS SDK for .NET&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://aws.amazon.com/simpledb/"&gt;SimpleDB&lt;/a&gt;&lt;br /&gt;
&lt;a href="https://forums.aws.amazon.com/thread.jspa?threadID=51373"&gt;micro in VPC&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://nosql.mypopescu.com/post/16064274863/notes-about-amazon-dynamodb"&gt;Notes About Amazon DynamoDB&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.datastax.com/dev/blog/amazon-dynamodb"&gt;DynamoDB vs. Cassandra&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-3564483643582350";
/* 728x90, created 12/26/08 */
google_ad_slot = "8029697074";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1081905209486048806-4569401648420920286?l=chrisghardwick.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/2A-e-GQe8500n_9pc2eAPyj2e4A/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2A-e-GQe8500n_9pc2eAPyj2e4A/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/2A-e-GQe8500n_9pc2eAPyj2e4A/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2A-e-GQe8500n_9pc2eAPyj2e4A/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~4/YrkMNvYj88Q" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://chrisghardwick.blogspot.com/feeds/4569401648420920286/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1081905209486048806&amp;postID=4569401648420920286" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/4569401648420920286?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/4569401648420920286?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~3/YrkMNvYj88Q/amazon-dynamodb-first-impressions.html" title="Amazon DynamoDB: First Impressions" /><author><name>Christopher Hardwick</name><uri>https://profiles.google.com/116172115963583202334</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-WuXn4K2F5nE/TxhEqKtt5oI/AAAAAAAAHeM/lWcWXYZ5DsQ/s72-c/AnnouncementEmail.png" height="72" width="72" /><thr:total>0</thr:total><georss:featurename>Marietta, GA, USA</georss:featurename><georss:point>33.952602 -84.5499327</georss:point><georss:box>33.899916499999996 -84.6288967 34.0052875 -84.4709687</georss:box><feedburner:origLink>http://chrisghardwick.blogspot.com/2012/01/amazon-dynamodb-first-impressions.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0MBQnk5fSp7ImA9WhRVGUU.&quot;"><id>tag:blogger.com,1999:blog-1081905209486048806.post-6291262883339899997</id><published>2012-01-19T11:10:00.000-05:00</published><updated>2012-01-19T11:10:53.725-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-19T11:10:53.725-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Dependency Injection" /><category scheme="http://www.blogger.com/atom/ns#" term="StructureMap" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><title>StructureMap Initialize (or Configure) with ChannelFactory</title><content type="html">Trying to configure StructureMap to use the ServiceModel ChannelFactory should be pretty easy right? Unless.. it just isn't working.&lt;br /&gt;
&lt;br /&gt;
The channel factory creates proxies, which StructureMap has a problem with. For instance, if you tried to create an instance of the proxy, and build the mapping:&lt;br /&gt;
&lt;pre style="background-image: URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"&gt;&lt;code style="color: black; word-wrap: normal;"&gt;       StructureMap.ObjectFactory.Initialize  
         (  
           z =  
           {  
             //service  
             var basicHttpBinding = new BasicHttpBinding();  
             var endpointAddress = new EndpointAddress("http://localhost:62049/SendMessage.svc");  
             var channelFactory = new ChannelFactory&lt;isendmessage&gt;(basicHttpBinding, endpointAddress);  
             var proxy = channelFactory.CreateChannel();  
             z.For&lt;isendmessage&gt;().Use(proxy);  
           }  
         );  
&lt;/isendmessage&gt;&lt;/isendmessage&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
You would&amp;nbsp;receive&amp;nbsp;a StructureMapConfigurationException:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
StructureMap configuration failures:&lt;br /&gt;
Error: &amp;nbsp;104&lt;br /&gt;
Source: &amp;nbsp;Registry: &amp;nbsp;StructureMap.Configuration.DSL.Registry, StructureMap, Version=2.6.3.0, Culture=neutral, PublicKeyToken=e60ad81abae3c223&lt;br /&gt;
Type Instance 'edc26816-1ec5-4f0d-b401-b4504e8fb537' (Object: &amp;nbsp;Instawares.Correspondence.Contract.ServiceContract.ISendMessage) cannot be plugged into type Instawares.Correspondence.Contract.ServiceContract.ISendMessage, Instawares.Correspondence.Contract, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null&lt;br /&gt;
-----------------------------------------------------------------------------------------------&lt;/blockquote&gt;
The resolution is much simpler, and provides more flexibility which is to allow StructureMap to handle creation of the object using the LambdaInstance&lt;plugintype&gt; Use(Func&lt;plugintype&gt; func):&lt;/plugintype&gt;&lt;/plugintype&gt;&lt;br /&gt;
&lt;plugintype&gt;&lt;plugintype&gt;&lt;br /&gt;&lt;/plugintype&gt;&lt;/plugintype&gt;&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-WXCbC8FwNWE/TxhAUchRa3I/AAAAAAAAHeE/WalQ-l_6JvI/s1600/StructureMapUseFunc.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="107" src="http://3.bp.blogspot.com/-WXCbC8FwNWE/TxhAUchRa3I/AAAAAAAAHeE/WalQ-l_6JvI/s640/StructureMapUseFunc.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&amp;nbsp;StructureMap.Configuration.DSL.Expressions.CreatePluginFamilyExpression&lt;plugintype&gt;&lt;/plugintype&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
The function will handle the creation of the service proxy (and you can control the lifecycle of the object via the configuration as well).&lt;br /&gt;
&lt;br /&gt;
Here's an example:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-attachment: initial; background-clip: initial; background-color: #f0f0f0; background-image: initial; background-origin: initial; border-bottom-color: rgb(204, 204, 204); border-bottom-style: dashed; border-bottom-width: 1px; border-image: initial; border-left-color: rgb(204, 204, 204); border-left-style: dashed; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: dashed; border-right-width: 1px; border-top-color: rgb(204, 204, 204); border-top-style: dashed; border-top-width: 1px; height: auto; overflow-x: auto; overflow-y: auto; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 644px;"&gt;&lt;code style="word-wrap: normal;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: 12px; line-height: 20px;"&gt;               StructureMap.ObjectFactory.Initialize
                (
                    z =
                    {
                        //service
                        var basicHttpBinding = new BasicHttpBinding();
                        var endpointAddress = new EndpointAddress("http://localhost:62049/SendMessage.svc");
                        var channelFactory = new ChannelFactory&lt;isendmessage&gt;(basicHttpBinding, endpointAddress);
                        z.For&lt;isendmessage&gt;().Use(channelFactory.CreateChannel);
                    }
                );
&lt;/isendmessage&gt;&lt;/isendmessage&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
The object creation has been been&amp;nbsp;transferred&amp;nbsp;to the ChannelFactory, and StructureMap handles the creation of the proxy, and the&amp;nbsp;life cycle&amp;nbsp;of that proxy.&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;Resources&lt;/u&gt;&lt;br /&gt;
&lt;a href="http://structuremap.net/structuremap/"&gt;StructureMap&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://msdn.microsoft.com/en-us/library/ms576132.aspx"&gt;ChannelFactory(Of TChannel) Class&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-3564483643582350";
/* 728x90, created 12/26/08 */
google_ad_slot = "8029697074";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1081905209486048806-6291262883339899997?l=chrisghardwick.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/HEXR816W6cick9xJoj83nSEtO_U/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HEXR816W6cick9xJoj83nSEtO_U/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/HEXR816W6cick9xJoj83nSEtO_U/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HEXR816W6cick9xJoj83nSEtO_U/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~4/eLJ5n_gjWZQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://chrisghardwick.blogspot.com/feeds/6291262883339899997/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1081905209486048806&amp;postID=6291262883339899997" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/6291262883339899997?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/6291262883339899997?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~3/eLJ5n_gjWZQ/structuremap-initialize-or-configure.html" title="StructureMap Initialize (or Configure) with ChannelFactory" /><author><name>Christopher Hardwick</name><uri>https://profiles.google.com/116172115963583202334</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-WXCbC8FwNWE/TxhAUchRa3I/AAAAAAAAHeE/WalQ-l_6JvI/s72-c/StructureMapUseFunc.png" height="72" width="72" /><thr:total>0</thr:total><georss:featurename>Marietta, GA, USA</georss:featurename><georss:point>33.952602 -84.5499327</georss:point><georss:box>33.899958999999996 -84.6288967 34.005245 -84.4709687</georss:box><feedburner:origLink>http://chrisghardwick.blogspot.com/2012/01/structuremap-initialize-or-configure.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0QDRXw9fSp7ImA9WhRVGEw.&quot;"><id>tag:blogger.com,1999:blog-1081905209486048806.post-2711280784369025257</id><published>2012-01-17T09:42:00.000-05:00</published><updated>2012-01-17T09:42:54.265-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-17T09:42:54.265-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term=".NET" /><category scheme="http://www.blogger.com/atom/ns#" term="Best Practices" /><category scheme="http://www.blogger.com/atom/ns#" term="Ektron" /><title>Best Practices for a .NET Extension or Plug-In</title><content type="html">&lt;br /&gt;
These are best practices that I created for writing a .NET Extension or Plug-In so some of the&amp;nbsp;references&amp;nbsp;and nomenclature are .NET specific, but the principals and ideas can be extended to any programming language or application design.&lt;br /&gt;
&lt;br /&gt;
Best Practices for Writing a Good Extension or Plug-In:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Any extension should have&amp;nbsp;&lt;b&gt;logging features&lt;/b&gt;&amp;nbsp;(and ideally support verbose, error, warning messages). Most applications provide some sort of logging capabilities you can use or extend. This is preferred to designing your own simply because you would have to monitor two sets of logs not to mention the additional configuration, and maintenance of adding a second logging mechanism. If you do have to add your own logging, try to leverage an existing logging&amp;nbsp;infrastructure: &lt;a href="http://logging.apache.org/log4net/"&gt;log4net&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/library/cc467894.aspx"&gt;Microsoft Enterprise Library&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;If possible&amp;nbsp;&lt;b&gt;avoid any additional (and most importantly&amp;nbsp;external) database or service calls&lt;/b&gt;. Aside from the performance hit this can add, your introducing potentially&amp;nbsp;volatile&amp;nbsp;resources that will affect the host systems ability to work&amp;nbsp;properly.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Settle on a single purpose or function for your extension&lt;/b&gt;. Don't try to make it do several things, and work in several different functions. It's hard to understand, maintain, and a nightmare when 'something' inside the extension/plug in goes bad.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Limit external dependencies&lt;/b&gt;. If at all possible you want your extension/plug-in to be entirely self-sufficient. Any information or exchange should be provided by the host system via a state bag, or in the direct actionable items available.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Document as much of the plug-in as possible&lt;/b&gt;&amp;nbsp;within the code module. Include references, and be explicit. You should always document, but people tend to forget about extensions and plug-ins. You write them, they get deployed, and then days, months, years later... doom. The more that's in the code when you open it back up the quicker you can fix it.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Handle and dispatch exceptions&lt;/b&gt;&amp;nbsp;in almost all cases. If you can't handle the exception, and it needs to be raised to the host system, then make sure your logging (see #1 on this list) records the exception with as much information as possible. In my experience a host system most often reports very little useful information or (as in one case I remember) it reports absolutely nothing.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Design the functionality of the plug in&lt;/b&gt;! So many times, people try to write everything inline for a plug-in rather than following the same coding practices that they would in any other application or feature.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Favor&amp;nbsp;&lt;b&gt;robust naming if your plug-in and if possible the methods, functions, and variables within it.&lt;/b&gt;&amp;nbsp;Often when dealing with a plug-in it needs to be self explanitory to the infastructure dude, the end-user, and in almost all cases&amp;nbsp;&lt;i&gt;other people&lt;/i&gt;.&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;Here's a quick example:&amp;nbsp;&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;MyCompanyNamePlugIn -&amp;nbsp;&lt;i&gt;Seriously&lt;/i&gt;?&amp;nbsp;&lt;i&gt;That does that do?&amp;nbsp;&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;MyCompanyUpdateCreatedDateOnNewRecordPlugIn -&amp;nbsp;&lt;i&gt;Ok, really simple. Want to guess?&lt;/i&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/ol&gt;
&lt;li&gt;&lt;b&gt;Consider&amp;nbsp;interprocess&amp;nbsp;communication if execution is lengthy, intensive, or will impact the performance of the host system&lt;/b&gt;. If the action is lengthy or is going to impact the host system, then consider having your plug-in use a queue or call a service for executing the action. If performance is going to be impacted in an&amp;nbsp;extreme&amp;nbsp;negative, consider external executing with a service-bus or queuing system.&lt;/li&gt;
&lt;/ol&gt;
&lt;u&gt;References:&lt;/u&gt;&lt;br /&gt;
&lt;a href="http://chrisghardwick.blogspot.com/2012/01/best-practices-for-developing-your.html"&gt;Best Practices for Developing Your First Ektron Site&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.slideshare.net/andrewnacin/best-practices-in-plugin-development-wordcamp-seattle"&gt;Best Practices in Plugin Development (WordCamp Seattle)&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;Resources:&lt;/u&gt;&lt;br /&gt;
&lt;a href="http://logging.apache.org/log4net/"&gt;log4net&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://msdn.microsoft.com/library/cc467894.aspx"&gt;Microsoft Enterprise Library&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-3564483643582350";
/* 728x90, created 12/26/08 */
google_ad_slot = "8029697074";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1081905209486048806-2711280784369025257?l=chrisghardwick.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/DF-R51dgCST-92sToPQ0EOOHMOs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DF-R51dgCST-92sToPQ0EOOHMOs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/DF-R51dgCST-92sToPQ0EOOHMOs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DF-R51dgCST-92sToPQ0EOOHMOs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~4/9iq2vWKgiOI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://chrisghardwick.blogspot.com/feeds/2711280784369025257/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1081905209486048806&amp;postID=2711280784369025257" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/2711280784369025257?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/2711280784369025257?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~3/9iq2vWKgiOI/best-practices-for-net-extension-or.html" title="Best Practices for a .NET Extension or Plug-In" /><author><name>Christopher Hardwick</name><uri>https://profiles.google.com/116172115963583202334</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://chrisghardwick.blogspot.com/2012/01/best-practices-for-net-extension-or.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8ERXY7fSp7ImA9WhRVF08.&quot;"><id>tag:blogger.com,1999:blog-1081905209486048806.post-408635643153812830</id><published>2012-01-16T09:23:00.000-05:00</published><updated>2012-01-16T09:23:24.805-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-16T09:23:24.805-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="JsRender" /><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript" /><category scheme="http://www.blogger.com/atom/ns#" term="Ektron" /><title>JsRender: Javascript Templating. An Introduction.</title><content type="html">&lt;u&gt;What is JsRender?&lt;/u&gt;&lt;br /&gt;
&lt;span style="font-family: inherit;"&gt;According to the &lt;a href="http://borismoore.github.com/jsrender/demos/step-by-step/index.html"&gt;demos index page&lt;/a&gt; JsRender is&lt;/span&gt; "&lt;em style="font-family: Verdana; font-size: small;"&gt;Optimized for high-performance pure string-based rendering, without DOM or jQuery dependency".&lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: inherit;"&gt;In simple terms it's a way to apply templates to JSon data and render out content. &amp;nbsp;If you think about it, it's really a powerful feature, and valuable to anyone that is rendering content in a web browser.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
It seems that JsRender became the solution for client side templating with the discontinuation of JQuery's templates, however JsRender is something... better. Aside from having no DOM depedency, it does not even have a JQuery dependency. From Borris Moore's &lt;a href="http://www.slideshare.net/BorisMoore/jsviews-next-generation-jquery-templates"&gt;presentation&lt;/a&gt;, JsRender is "&lt;i&gt;~20 times faster than jquery.tmpl for simple templates&lt;/i&gt;".&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;At a high-level is supports:&lt;/u&gt;&lt;br /&gt;
Rendering templates and data into a string (as opposed to anything in the DOM)&lt;br /&gt;
Templates as strings, and within script tags&lt;br /&gt;
Template registration&lt;br /&gt;
Tags within templates, including conditional statements, loops&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;Here's a basic sample/example of JsRender in action:&lt;/u&gt;&lt;i&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-Ps-drIGMLtI/TxBphj2iCYI/AAAAAAAAHd4/BRgTjAGR0wU/s1600/JsRender.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="196" src="http://3.bp.blogspot.com/-Ps-drIGMLtI/TxBphj2iCYI/AAAAAAAAHd4/BRgTjAGR0wU/s320/JsRender.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;i style="font-size: medium; text-align: -webkit-auto;"&gt;&lt;span style="font-size: x-small;"&gt;From http://borismoore.github.com/jsrender/demos/step-by-step/01_inserting-data.html&lt;/span&gt;&lt;/i&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;span style="font-size: xx-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: xx-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: xx-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: xx-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: xx-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: xx-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: xx-small;"&gt;Requires Script references: jQuery, jsrender&lt;/span&gt;&lt;br /&gt;
Borris Moore offers a complete set of demos, which demonstrate much more:&amp;nbsp;&lt;a href="http://borismoore.github.com/jsrender/demos/index.html"&gt;jsrender Demos&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;What's JsRender's Future?&lt;/u&gt;&lt;br /&gt;
&lt;br /&gt;
As a product, Borris Moore offered the following road-map for JsRender/JsView on&amp;nbsp;OCTOBER 12, 2011 in this blog post: &lt;a href="http://www.borismoore.com/2011/10/jquery-templates-and-jsviews-roadmap.html"&gt;jQuery Templates and JsViews: The Roadmap&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;b&gt;Roadmap summary:&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;&lt;a href="https://github.com/jquery/jquery-tmpl" style="color: #5252ff; text-decoration: none;"&gt;jQuery templates&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
: Will remain at Beta1, and be superseded by JsRender templates, and JsViews.&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;&lt;a href="https://github.com/BorisMoore/jsrender" style="color: #5252ff; text-decoration: none;"&gt;JsRender&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
: Soon move to Beta – then on to V1&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;jQueryUI plan to use JsRender. (TBD whether it will migrate to jQuery project in GitHub...)&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;&lt;a href="https://github.com/BorisMoore/jsviews" style="color: #5252ff; text-decoration: none;"&gt;JsViews&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
: Move to Beta (after JsRender) and then on to V1 …&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;May also be used by jQueryUI&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;br /&gt;
&lt;u&gt;My Experiences&lt;/u&gt;&lt;br /&gt;
&lt;br /&gt;
Most recently I've been using JsRender to render content from Ektron after designing a series of templates that would render content as JSon (see&amp;nbsp;&lt;a href="http://chrisghardwick.blogspot.com/2012/01/designing-data-templates-for-content.html"&gt;Designing Data Templates for Content Extraction with Ektron (JSon, XML) (Ektron Designing Content Delivery: Part 2&lt;/a&gt;) for more information).&lt;br /&gt;
&lt;br /&gt;
In the past, I've also used it for rendering forms, pages, static content, large tables, dynamically loaded sections of my application. What can I say, it's easy, flexible and it works.&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;Resources:&lt;/u&gt;&lt;br /&gt;
&lt;a href="https://github.com/BorisMoore/jsrender"&gt;jsrender on GitHub &lt;/a&gt;&lt;br /&gt;
&lt;a href="http://borismoore.github.com/jsrender/demos/index.html"&gt;jsrender Demos&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://api.jquery.com/category/plugins/templates/"&gt;JQuery Templates&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.slideshare.net/BorisMoore/jsviews-next-generation-jquery-templates"&gt;Borris Moore "JsViews: Next-generation jQuery Templates and Data Link" Presentation&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://chrisghardwick.blogspot.com/2012/01/designing-data-templates-for-content.html"&gt;Designing Data Templates for Content Extraction with Ektron (JSon, XML) (Ektron Designing Content Delivery: Part 2&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-3564483643582350";
/* 728x90, created 12/26/08 */
google_ad_slot = "8029697074";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1081905209486048806-408635643153812830?l=chrisghardwick.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/gcWP1TQ0g0ygQAzEAjm3ZURTNZU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gcWP1TQ0g0ygQAzEAjm3ZURTNZU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/gcWP1TQ0g0ygQAzEAjm3ZURTNZU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gcWP1TQ0g0ygQAzEAjm3ZURTNZU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~4/Tu7tczV1K4Q" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://chrisghardwick.blogspot.com/feeds/408635643153812830/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1081905209486048806&amp;postID=408635643153812830" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/408635643153812830?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/408635643153812830?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~3/Tu7tczV1K4Q/jsrender-javascript-templating.html" title="JsRender: Javascript Templating. An Introduction." /><author><name>Christopher Hardwick</name><uri>https://profiles.google.com/116172115963583202334</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-Ps-drIGMLtI/TxBphj2iCYI/AAAAAAAAHd4/BRgTjAGR0wU/s72-c/JsRender.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://chrisghardwick.blogspot.com/2012/01/jsrender-javascript-templating.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUACQn09eSp7ImA9WhRVFEs.&quot;"><id>tag:blogger.com,1999:blog-1081905209486048806.post-3680760758277888665</id><published>2012-01-13T10:16:00.000-05:00</published><updated>2012-01-13T10:16:03.361-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-13T10:16:03.361-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Ektron Version" /><category scheme="http://www.blogger.com/atom/ns#" term="Ektron 8.0.2" /><category scheme="http://www.blogger.com/atom/ns#" term="Ektron" /><title>Determine your Ektron Version</title><content type="html">Determing your Ektron product version should be simple &lt;br /&gt;
&lt;br /&gt;
Within the website you can view a series of keys within the Web.config file that determines the product version:&lt;br /&gt;
&lt;table&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td&gt;&lt;blockquote&gt;
&lt;add key="ek_buildNumber" value="8.0.2.035"&gt;&lt;br /&gt;
&amp;lt;add key="ek_InstallBuild" value="8.0.2.035SP2.01"/&amp;gt;&lt;br /&gt;
&amp;lt;add key="ek_ServicePack" value="SP2"/&amp;gt;&lt;br /&gt;
&amp;lt;add key="ek_version" value="8.02"/&amp;gt;&lt;/add&gt;&lt;/blockquote&gt;
&lt;/td&gt; &lt;td&gt;&lt;br /&gt;
&lt;a href="http://3.bp.blogspot.com/-YtphrAMUx5c/TwsazZDIjrI/AAAAAAAAHcM/_IDaxoS3GAE/s1600/EktronVersion.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="63" src="http://3.bp.blogspot.com/-YtphrAMUx5c/TwsazZDIjrI/AAAAAAAAHcM/_IDaxoS3GAE/s400/EktronVersion.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
You should also note that the Ektron version is available for the end-user to view it within the Ektron work area in the top left hand-corner (see screenshot below):&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-zal2TdepVzs/Tw2qfqzHcuI/AAAAAAAAHc4/shHvtHxF7Rk/s1600/EktronVersionInWorkArea.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="34" src="http://4.bp.blogspot.com/-zal2TdepVzs/Tw2qfqzHcuI/AAAAAAAAHc4/shHvtHxF7Rk/s320/EktronVersionInWorkArea.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
After searching, it does not appear that the product version is stored within the database for Ektron. There are version columns but this appears to be for versioning data within the application and not for determining the database (or Ektron product) version. This article on the forum seems to back-up these findings: &lt;a href="http://dev.ektron.com/forum.aspx?g=posts&amp;amp;t=21374"&gt;Database Version(2)&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Resources:&lt;br /&gt;
&lt;a href="http://dev.ektron.com/forum.aspx?g=posts&amp;amp;t=21374"&gt;Database Version(2)&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-3564483643582350";
/* 728x90, created 12/26/08 */
google_ad_slot = "8029697074";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1081905209486048806-3680760758277888665?l=chrisghardwick.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/oNCPXJr-Y8s7AtAf7oULCoCOR00/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/oNCPXJr-Y8s7AtAf7oULCoCOR00/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/oNCPXJr-Y8s7AtAf7oULCoCOR00/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/oNCPXJr-Y8s7AtAf7oULCoCOR00/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~4/-Ws65hDBo_8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://chrisghardwick.blogspot.com/feeds/3680760758277888665/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1081905209486048806&amp;postID=3680760758277888665" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/3680760758277888665?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/3680760758277888665?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~3/-Ws65hDBo_8/determine-your-ektron-version.html" title="Determine your Ektron Version" /><author><name>Christopher Hardwick</name><uri>https://profiles.google.com/116172115963583202334</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-YtphrAMUx5c/TwsazZDIjrI/AAAAAAAAHcM/_IDaxoS3GAE/s72-c/EktronVersion.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://chrisghardwick.blogspot.com/2012/01/determine-your-ektron-version.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUEHRn8_eSp7ImA9WhRVF08.&quot;"><id>tag:blogger.com,1999:blog-1081905209486048806.post-810888433118058937</id><published>2012-01-13T09:31:00.000-05:00</published><updated>2012-01-16T09:20:37.141-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-16T09:20:37.141-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="JSon" /><category scheme="http://www.blogger.com/atom/ns#" term="Formatter" /><category scheme="http://www.blogger.com/atom/ns#" term="Presentation Formatter" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><title>C# JSon Pretty-Print (A simple C# JSon Presentation Formatter)</title><content type="html">When working on a recent project, I ran across a need to have the user paste into a textbox (in a WPF application) a snippet of&amp;nbsp;
unformatted&amp;nbsp;&amp;nbsp;JSon data. The data was then used with a template to render content for them to view. The hard part... the unformatted JSon data was almost impossible to read (let alone do anything with).&lt;br /&gt;
&lt;br /&gt;
A quick search around on Google, and I couldn't find what I thought was pretty basic function in C#. I mean, someone, somewhere else in the world needed to be able to do this. The Javascript serializer would work if I had an object to start with, but in my case, there wasn't an object just a string. So I wrote a basic formatter for presentation of JSon data. It's not all that impressive, but it works, and creates presentable data that the user can view and work with.&lt;br /&gt;
&lt;br /&gt;
I also added a quick method as well that would convert an object to a string, and then apply the same formatting algorithm in-case you have a need to present both and want to have the same presentation.&lt;br /&gt;
&lt;br /&gt;
So instead of this:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-V1ZS4MKdtoE/TxA_fz5CgnI/AAAAAAAAHdw/c2vPELqpnIo/s1600/UnFormattedJSon.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="32" src="http://3.bp.blogspot.com/-V1ZS4MKdtoE/TxA_fz5CgnI/AAAAAAAAHdw/c2vPELqpnIo/s400/UnFormattedJSon.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You get this:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-dBOe0ZCbcdc/TxA_IvFekGI/AAAAAAAAHdo/SCPo64XDZaU/s1600/FormattedJSon.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="208" src="http://3.bp.blogspot.com/-dBOe0ZCbcdc/TxA_IvFekGI/AAAAAAAAHdo/SCPo64XDZaU/s320/FormattedJSon.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Code:&lt;br /&gt;
&lt;blockquote&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code style="color: black; word-wrap: normal;"&gt;&lt;span style="font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace;"&gt;        &lt;/span&gt;public class JSonPresentationFormatter
        {
            public string Format(object obj)
            {
                var serializer = new JavaScriptSerializer();
                var text = serializer.Serialize(obj);

                return Format(text);
            }

            public string Format(string text)
            {
                if (string.IsNullOrEmpty(text)) return string.Empty;
                text = text.Replace(System.Environment.NewLine, string.Empty).Replace("\t", string.Empty);

                var offset = 0;
                var output = new StringBuilder();
                Action&lt;stringbuilder, int=""&gt; tabs = (sb, pos) =&amp;gt; { for (var i = 0; i &amp;amp;lt; pos; i++) { sb.Append("\t"); } };
                Func&lt;string, int,="" nullable&lt;char=""&gt;&amp;gt; previousNotEmpty = (s, i) =&amp;gt;
                {
                    if (string.IsNullOrEmpty(s) || i &amp;amp;lt;= 0) return null;

                    Nullable&lt;char&gt; prev = null;

                    while (i &amp;gt; 0 &amp;amp;&amp;amp; prev == null)
                    {
                        prev = s[i - 1];
                        if (prev.ToString() == " ") prev = null;
                        i--;
                    }

                    return prev;
                };
                Func&lt;string, int,="" nullable&lt;char=""&gt;&amp;gt; nextNotEmpty = (s, i) =&amp;gt;
                {
                    if (string.IsNullOrEmpty(s) || i &amp;gt;= (s.Length - 1)) return null;

                    Nullable&lt;char&gt; next = null;
                    i++;

                    while (i &amp;amp;lt; (s.Length - 1) &amp;amp;&amp;amp; next == null)
                    {
                        next = s[i++];
                        if (next.ToString() == " ") next = null;
                    }

                    return next;
                };

                for (var i = 0; i &amp;amp;lt; text.Length; i++)
                {
                    var chr = text[i];

                    if (chr.ToString() == "{")
                    {
                        offset++;
                        output.Append(chr);
                        output.Append(System.Environment.NewLine);
                        tabs(output, offset);
                    }
                    else if (chr.ToString() == "}")
                    {
                        offset--;
                        output.Append(System.Environment.NewLine);
                        tabs(output, offset);
                        output.Append(chr);

                    }
                    else if (chr.ToString() == ",")
                    {
                        output.Append(chr);
                        output.Append(System.Environment.NewLine);
                        tabs(output, offset);
                    }
                    else if (chr.ToString() == "[")
                    {
                        output.Append(chr);

                        var next = nextNotEmpty(text, i);

                        if (next != null &amp;amp;&amp;amp; next.ToString() != "]")
                        {
                            offset++;
                            output.Append(System.Environment.NewLine);
                            tabs(output, offset);
                        }
                    }
                    else if (chr.ToString() == "]")
                    {
                        var prev = previousNotEmpty(text, i);

                        if (prev != null &amp;amp;&amp;amp; prev.ToString() != "[")
                        {
                            offset--;
                            output.Append(System.Environment.NewLine);
                            tabs(output, offset);
                        }

                        output.Append(chr);
                    }
                    else
                        output.Append(chr);
                }

                return output.ToString().Trim();
            }
        }&lt;/char&gt;&lt;/string,&gt;&lt;/char&gt;&lt;/string,&gt;&lt;/stringbuilder,&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;blockquote class="tr_bq"&gt;
You can download a copy of the source here:&amp;nbsp;&lt;a href="http://dl.dropbox.com/u/52219470/Source/JSonPresentationFormatter.cs"&gt;JSonPresentationFormatter&lt;/a&gt;&lt;/blockquote&gt;
Example:&lt;br /&gt;
&lt;blockquote&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code style="color: black; word-wrap: normal;"&gt;            //From object
            var employees = new[]
            {
                 new {Name= "John Vansteen",ID="1", Age="35"}
                ,new {Name = "Joe Yankin", ID = "2", Age = "44" }
                ,new {Name = "Larry Yon", ID = "3", Age = "33" }
            };
            Console.Write(new JSonPresentationFormatter().Format(employees));

            //From string
            var jSonAsString = "{\"glossary\": {\"title\": \"example glossary\",\"GlossDiv\": {\"title\": \"S\",\"GlossList\": {\"GlossEntry\": {\"ID\": \"SGML\",\"SortAs\": \"SGML\",\"GlossTerm\": \"Standard Generalized Markup Language\",\"Acronym\": \"SGML\",\"Abbrev\": \"ISO 8879:1986\",\"GlossDef\": {\"para\": \"A meta-markup language, used to create markup languages such as DocBook.\",\"GlossSeeAlso\": [\"GML\", \"XML\"]},\"GlossSee\": \"markup\"}}}}}";
            Console.Write(new JSonPresentationFormatter().Format(jSonAsString));&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;u&gt;Key Words:&lt;/u&gt;&lt;br /&gt;
JSon C# Presentation Formatter&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;References:&lt;/u&gt;&lt;br /&gt;
&lt;a href="http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx"&gt;IFormatProvider Interface&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Source:&lt;br /&gt;
&lt;a href="http://dl.dropbox.com/u/52219470/Source/JSonPresentationFormatter.cs"&gt;JSonPresentationFormatter&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-3564483643582350";
/* 728x90, created 12/26/08 */
google_ad_slot = "8029697074";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1081905209486048806-810888433118058937?l=chrisghardwick.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/6LDc1yb4REpZ6AtsGIFgn1HexD8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6LDc1yb4REpZ6AtsGIFgn1HexD8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/6LDc1yb4REpZ6AtsGIFgn1HexD8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6LDc1yb4REpZ6AtsGIFgn1HexD8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~4/OiiqkQvoPnc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://chrisghardwick.blogspot.com/feeds/810888433118058937/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1081905209486048806&amp;postID=810888433118058937" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/810888433118058937?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/810888433118058937?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~3/OiiqkQvoPnc/c-json-pretty-print-simple-c-json.html" title="C# JSon Pretty-Print (A simple C# JSon Presentation Formatter)" /><author><name>Christopher Hardwick</name><uri>https://profiles.google.com/116172115963583202334</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-V1ZS4MKdtoE/TxA_fz5CgnI/AAAAAAAAHdw/c2vPELqpnIo/s72-c/UnFormattedJSon.png" height="72" width="72" /><thr:total>4</thr:total><feedburner:origLink>http://chrisghardwick.blogspot.com/2012/01/c-json-pretty-print-simple-c-json.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUEQnw6eCp7ImA9WhRVE0w.&quot;"><id>tag:blogger.com,1999:blog-1081905209486048806.post-7030417734607954854</id><published>2012-01-11T15:20:00.000-05:00</published><updated>2012-01-11T15:20:03.210-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-11T15:20:03.210-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Ektron 8.0.2" /><category scheme="http://www.blogger.com/atom/ns#" term="Ektron" /><category scheme="http://www.blogger.com/atom/ns#" term="CMS" /><title>Designing a Generic Meta-Data Driven Transformation Template (Ektron Designing Content Delivery: Part 3)</title><content type="html">In the previous Ektron Designing Content Delivery post (&lt;a href="http://chrisghardwick.blogspot.com/2012/01/designing-data-templates-for-content.html"&gt;Designing Data Templates for Content Extraction with Ektron (JSon, XML) (Ektron Designing Content Delivery: Part 2)&lt;/a&gt;), I outlined the basics of creating a series of templates for data extraction.&lt;br /&gt;
&lt;br /&gt;
While using Ektron content as data is useful (in particular SmartForm data), there is always a need to render transformed content (as Html, Text, Csv, or other formatted content). In this post, I will outline a method to create a simple Meta-Data driven Ektron template that can use used to transform your data for presentation.&lt;br /&gt;
&lt;br /&gt;
What this is useful for:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;SmartForm content that needs to be displayed as Html&lt;/li&gt;
&lt;li&gt;SmartForm content that needs to be transformed (to other Xml, Html, Text, Csv, etc)&lt;/li&gt;
&lt;li&gt;Any Ektron content that requires transformation before being rendered, and represents stand-alone content.&lt;/li&gt;
&lt;/ul&gt;
A high level overview of the rendering process:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-zRmGHEAqDic/Tw20W-nINKI/AAAAAAAAHdA/1K0ks8Bht5U/s1600/EktronMetaDataTransformation.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="114" src="http://2.bp.blogspot.com/-zRmGHEAqDic/Tw20W-nINKI/AAAAAAAAHdA/1K0ks8Bht5U/s320/EktronMetaDataTransformation.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Of note: &lt;i&gt;I've also created an Ektron Widget control that follows the same pattern, so that I can render out this content as part of a page-builder page without any additional work by the end user. It pretty much works the same way with the template being a page-builder widget, and the end consumption being a Page-builder page.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;Transformation Template:&lt;/u&gt;&lt;br /&gt;
System/Design Requirements:&lt;br /&gt;
1. Support Multiple Xsl/Xslt translations against the content set&lt;br /&gt;
2. When not configured properly then display a simple message back for the rendered content.&lt;br /&gt;
3. Support different&amp;nbsp;separators/delimiters&amp;nbsp;within the metadata in-case there is a conflict and it needs to be changed or updated.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;ASPX:&lt;/b&gt;&lt;br /&gt;
&lt;blockquote&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;       &lt;code style="color: black; word-wrap: normal;"&gt;
&amp;lt;%@ Page Language="C#" AutoEventWireup="true" CodeBehind="MetaDataTransformation.aspx.cs" Inherits="ContentManagement.Site.Shared.Template.Content.SmartForm.MetaDataTransformation" %&amp;gt;
&amp;lt;%@ Register Assembly="Ektron.Cms.Controls" Namespace="Ektron.Cms.Controls" TagPrefix="CMS" %&amp;gt;

&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;

&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;
&amp;lt;head id="Head1" runat="server"&amp;gt;
    &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;form id="form1" runat="server"&amp;gt;
    &amp;lt;div&amp;gt;
        &amp;lt;CMS:ContentBlock ID="ContentBlock1" runat="server" /&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;/form&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
       &lt;/code&gt;
 &lt;/pre&gt;
&lt;/blockquote&gt;
&lt;br /&gt;
&lt;b&gt;Code-Behind:&lt;/b&gt;&lt;br /&gt;
&lt;blockquote&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code style="color: black; word-wrap: normal;"&gt;using System;
using ContentManagement.Ektron.Content;
using ContentManagement.Ektron.Transformation.Xsl;
using ContentManagement.Site.Shared.Pages;
using MetaData = Ektron.Cms.API.Metadata;
using ContentManagement.Ektron.Transformation;

namespace ContentManagement.Site.Shared.Template.Content.SmartForm
{
    public partial class MetaDataTransformation : AbstractCmsPage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            this.ContentBlock1.SetDynamicParameterToIdAndFill(); //prep content block

            Response.Clear();

            WriteCmsDataToHeader(Response);
            Response.ContentType = ContentManagement.Web.ContentTypeDefinition.Html;

            var id = this.ContentBlock1.EkItem.Id; //retrieve the id from the item

&lt;/code&gt;&lt;div&gt;
&lt;code style="color: black; word-wrap: normal;"&gt;            var metaData = this.ContentBlock1.GetMetaData().GetItemByName("Transformation");

            //Note: This should be content/error content from Ektron.
            Action badRender = () =&amp;gt; Response.Write("Oppps. It looks like this content isn't ready yet. Try back again soon.");
            
            if (metaData == null)
                //meta data not located on this item, so we do not want it to render.
                badRender();
            else
            {
                var data = new MetaData();
                var metaDataType = data.GetMetadataType(long.Parse(metaData.ID));
                var xsltTransformationFromMetaData = this.ContentBlock1.GetMetaData().GetItemByName("Transformation").Value.ToString().Split(new string[1] { metaDataType.Separater }, StringSplitOptions.RemoveEmptyEntries);

                var transform = XslTransformFactory.Get();
                var input = this.ContentBlock1.EkItem.Html;

                if (xsltTransformationFromMetaData.Length &amp;lt;= 0)
                    //no content, write out a simple error message. 
                    badRender();
                else if (xsltTransformationFromMetaData.Length == 1)
                {
                    //apply single transformation, and output directly to response stream
                    transform.Transform(
                             new XmlStringInput(input)
                           , new XslFileInput(TransformationPath.MapPathAndValidate(this, xsltTransformationFromMetaData[0]))
                           , Response.OutputStream
                           , Response.Output.Encoding);
                }
                else
                {
                    //apply multiple translations
                    xsltTransformationFromMetaData.ForEach(trns =&amp;gt; input = transform.Transform(new XmlStringInput(input), new XslFileInput(TransformationPath.MapPathAndValidate(this, trns))));
                }                
            }

            Response.End();
        }
    }
}
       &lt;/code&gt;
 &lt;/div&gt;
&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;
The steps for setup and configuration are pretty simple:&lt;br /&gt;
&lt;u&gt;Ektron Configuration&lt;/u&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Creation of the Meta-Data within Ektron&lt;/li&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-rmnCsjFOMXo/Tw23Wm0twSI/AAAAAAAAHdI/0Bl4N_7r334/s1600/EktronMetaDataTransformationDefinition.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;img border="0" height="228" src="http://1.bp.blogspot.com/-rmnCsjFOMXo/Tw23Wm0twSI/AAAAAAAAHdI/0Bl4N_7r334/s320/EktronMetaDataTransformationDefinition.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Sample Metadata Transformation within Ektron 8.0.2&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;li&gt;Apply the Metadata to the Content Folder(s)&lt;/li&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-bhEtFkBqcw0/Tw3LWqvI9CI/AAAAAAAAHdg/wj9ogMCmJGc/s1600/EktronTransformationOnMetaDataTab.png" imageanchor="1" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;img border="0" height="109" src="http://4.bp.blogspot.com/-bhEtFkBqcw0/Tw3LWqvI9CI/AAAAAAAAHdg/wj9ogMCmJGc/s320/EktronTransformationOnMetaDataTab.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Metadata applied to the content folder&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;li&gt;Add Meta-Data Driven Transformation Template to your content&lt;/li&gt;
&lt;/ul&gt;
&lt;u&gt;Content Configuration&lt;/u&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Add the MetaData to the Content&lt;/li&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-Kw-0mvCYF64/Tw3KTotK4bI/AAAAAAAAHdQ/Mc8WxT7eXpE/s1600/EktronTwoTransformations.png" imageanchor="1" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;img border="0" height="108" src="http://4.bp.blogspot.com/-Kw-0mvCYF64/Tw3KTotK4bI/AAAAAAAAHdQ/Mc8WxT7eXpE/s400/EktronTwoTransformations.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Meta Data Transformation on Content (Note: This has two transformations)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;li&gt;Set the Template for the Content to the Transformation Template&lt;/li&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-oExnZsh8Dm8/Tw3Ktf2A4PI/AAAAAAAAHdY/pVxdB4Oeh4o/s1600/EktronTemplates.png" imageanchor="1" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;img border="0" height="66" src="http://4.bp.blogspot.com/-oExnZsh8Dm8/Tw3Ktf2A4PI/AAAAAAAAHdY/pVxdB4Oeh4o/s320/EktronTemplates.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Add the correct meta data transformation template.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/div&gt;
&lt;div&gt;
&lt;u&gt;Notes&lt;/u&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;i&gt;If your planning on using this with any type of volume you will want to cache the output of the transformation.&lt;/i&gt;&lt;/div&gt;
&lt;div&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div&gt;
&lt;i&gt;It's important to note that I am not referring to adding a custom&amp;nbsp;style sheet&amp;nbsp;to an Ektron web control (which you can do, and is&amp;nbsp;extremely&amp;nbsp;flexible) in particular this template will retrieve Ektron content, apply transformations&amp;nbsp;and then write the result of the transformation to the response output. The application (and usage) of this for consumption of Ektron content is quite different. If your developing pages within Ektron, and want to transform the output of the control, using Ektron's own transformation&amp;nbsp;infrastructure&amp;nbsp;is a much better option. Here, I am transforming, and then providing content via a push/pull to other sites for content presentation (and providing an option to present that content fully rendered).&lt;/i&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div&gt;
&lt;u&gt;Q &amp;amp; A&lt;/u&gt;&lt;/div&gt;
&lt;div&gt;
Q: How is this different than adding a Cms control to the page and selecting a transformation?&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
A: At the end of the day, it's not all that different, but I wanted a way to make this process completely configuration driven so I can set up additional content at will without having to create a page or a template for each set of content.&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;u&gt;In my next posts&lt;/u&gt;&lt;br /&gt;
1. Designing a wrapper-API for consumption, caching and rendering of Ektron data.&lt;br /&gt;
2. Now look what we can do: Render Ektron client-side with data templates and&amp;nbsp;&lt;a href="https://github.com/BorisMoore/jsrender"&gt;JsRender&lt;/a&gt;&amp;nbsp;(for smoking fast response times).&lt;br /&gt;
3. My Ektron page templates&lt;br /&gt;
&lt;br /&gt;
Resources:&lt;br /&gt;
&lt;a href="http://chrisghardwick.blogspot.com/2012/01/designing-ektron-content-delivery-and.html"&gt;Designing an Ektron Content Delivery and Provider Mechanism (Part 1)&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://chrisghardwick.blogspot.com/2012/01/designing-data-templates-for-content.html"&gt;Designing Data Templates for Content Extraction with Ektron (JSon, XML) (Ektron Designing Content Delivery: Part 2)&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.ektron.com/billcavablog/no-more-xslt/"&gt;Guest Blogger-Cameron Jordan: No More XSLT?!&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-3564483643582350";
/* 728x90, created 12/26/08 */
google_ad_slot = "8029697074";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1081905209486048806-7030417734607954854?l=chrisghardwick.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/JYAJ0at4coUpEOKUTzRX1zDHkDY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JYAJ0at4coUpEOKUTzRX1zDHkDY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/JYAJ0at4coUpEOKUTzRX1zDHkDY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JYAJ0at4coUpEOKUTzRX1zDHkDY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~4/tI6Un-BivZs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://chrisghardwick.blogspot.com/feeds/7030417734607954854/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1081905209486048806&amp;postID=7030417734607954854" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/7030417734607954854?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/7030417734607954854?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~3/tI6Un-BivZs/designing-generic-meta-data-driven.html" title="Designing a Generic Meta-Data Driven Transformation Template (Ektron Designing Content Delivery: Part 3)" /><author><name>Christopher Hardwick</name><uri>https://profiles.google.com/116172115963583202334</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-zRmGHEAqDic/Tw20W-nINKI/AAAAAAAAHdA/1K0ks8Bht5U/s72-c/EktronMetaDataTransformation.png" height="72" width="72" /><thr:total>1</thr:total><georss:featurename>Marietta, GA, USA</georss:featurename><georss:point>33.952602 -84.5499327</georss:point><georss:box>33.899958999999996 -84.6288967 34.005245 -84.4709687</georss:box><feedburner:origLink>http://chrisghardwick.blogspot.com/2012/01/designing-generic-meta-data-driven.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8HSHw7cSp7ImA9WhRVEk4.&quot;"><id>tag:blogger.com,1999:blog-1081905209486048806.post-2180050424831777116</id><published>2012-01-10T17:17:00.000-05:00</published><updated>2012-01-10T17:17:19.209-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-10T17:17:19.209-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Ektron 8.0.2" /><category scheme="http://www.blogger.com/atom/ns#" term="Ektron" /><title>Ektron: Using a SmartForm root element other than &lt;Root&gt;</title><content type="html">When creating an Ektron SmartForm you may want to have a root element other than the default&amp;nbsp;&amp;lt;Root&amp;gt; element.&lt;br /&gt;
&lt;br /&gt;
It's pretty easy to do, just follow these simple steps:&lt;br /&gt;
1. Select the Group Box option from the menu&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-he9CVwlMoBw/Twy3Xday7pI/AAAAAAAAHco/iQ2wLXNIvBQ/s1600/SelectGroupBox.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="234" src="http://1.bp.blogspot.com/-he9CVwlMoBw/Twy3Xday7pI/AAAAAAAAHco/iQ2wLXNIvBQ/s320/SelectGroupBox.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
2. Set the 'Field Name' on the 'General' tab to the name of the root element.&lt;br /&gt;
2. Select the 'Advanced' tab&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-HWlWO3ZkPcU/Twy3V6PninI/AAAAAAAAHcg/8cPUGGQYd_A/s1600/SelectAdvancedTab.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="233" src="http://2.bp.blogspot.com/-HWlWO3ZkPcU/Twy3V6PninI/AAAAAAAAHcg/8cPUGGQYd_A/s320/SelectAdvancedTab.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
3. Select 'Use this element as a root tag' from the 'Root Tag' section&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-OIGJrprr4Eo/Twy3Xr5S4BI/AAAAAAAAHcw/vsqvB92AE6s/s1600/SelectUseThisElementAsRootTag.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="232" src="http://1.bp.blogspot.com/-OIGJrprr4Eo/Twy3Xr5S4BI/AAAAAAAAHcw/vsqvB92AE6s/s320/SelectUseThisElementAsRootTag.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
4. Select 'OK'&lt;br /&gt;
&lt;br /&gt;
Additional Information:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;When you add the group box as designate it as the root tag, you cannot place anything outside of the group box. This makes a lot of sense, but know if your moving things around... everything has to be inside of the group box.&lt;/li&gt;
&lt;li&gt;If you have created this SmartForm previously, this change will cause the underlying data structure be to changed in a way that will remove any previous data. If your making this change on an existing SmartForm, I would recommend creating a new one (by copying and then making the change), and then migrating content from the old SmartForm to the new one.&lt;/li&gt;
&lt;li&gt;If your using version 8 then you might want to check out my post&amp;nbsp;&lt;a href="http://chrisghardwick.blogspot.com/2012/01/smart-form-with-custom-root-element.html"&gt;Smart Form with custom root element blank when editing (Version: 8.02)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
Resources:&lt;br /&gt;
&lt;a href="http://documentation.ektron.com/cms400/v801/mobile_help/Advanced/Content/Main_Import_file/smart_DD_field_types_ewe400.htm#smart_DD_field_types_ewe400_3543194847_1358548"&gt;Data Designer Field Types&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://chrisghardwick.blogspot.com/2012/01/smart-form-with-custom-root-element.html"&gt;Smart Form with custom root element blank when editing (Version: 8.02)&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-3564483643582350";
/* 728x90, created 12/26/08 */
google_ad_slot = "8029697074";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1081905209486048806-2180050424831777116?l=chrisghardwick.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/nHB2dGDghfvmRiDy2rZ_6dCucSY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/nHB2dGDghfvmRiDy2rZ_6dCucSY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/nHB2dGDghfvmRiDy2rZ_6dCucSY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/nHB2dGDghfvmRiDy2rZ_6dCucSY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~4/M4SF94UjMRs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://chrisghardwick.blogspot.com/feeds/2180050424831777116/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1081905209486048806&amp;postID=2180050424831777116" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/2180050424831777116?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/2180050424831777116?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~3/M4SF94UjMRs/ektron-using-smartform-root-element.html" title="Ektron: Using a SmartForm root element other than &amp;lt;Root&amp;gt;" /><author><name>Christopher Hardwick</name><uri>https://profiles.google.com/116172115963583202334</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-he9CVwlMoBw/Twy3Xday7pI/AAAAAAAAHco/iQ2wLXNIvBQ/s72-c/SelectGroupBox.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://chrisghardwick.blogspot.com/2012/01/ektron-using-smartform-root-element.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0AARX4_fCp7ImA9WhRVEk4.&quot;"><id>tag:blogger.com,1999:blog-1081905209486048806.post-3735430535931278347</id><published>2012-01-10T16:42:00.000-05:00</published><updated>2012-01-10T16:42:24.044-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-10T16:42:24.044-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Crawled Content" /><category scheme="http://www.blogger.com/atom/ns#" term="MOSS" /><category scheme="http://www.blogger.com/atom/ns#" term="MOSS 2007" /><title>Reset Crawled Content on MOSS 2007 Shared Services</title><content type="html">If you need to reset the Reset Crawled Content on MOSS 2007 Shared Services
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Open SharePoint Central Administration, select Application Management&lt;/li&gt;
&lt;li&gt;On the Application Management page, click Create or configure this farm’s shared services.&lt;a href="http://2.bp.blogspot.com/_8fK8UBWIUvA/SYyw3yg0RiI/AAAAAAAAHVw/yYL_fr1Q8vU/s1600-h/OfficeSharePointServerSharedServices.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5299805334006941218" src="http://2.bp.blogspot.com/_8fK8UBWIUvA/SYyw3yg0RiI/AAAAAAAAHVw/yYL_fr1Q8vU/s320/OfficeSharePointServerSharedServices.jpg" style="cursor: hand; cursor: pointer; height: 100px; width: 320px;" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;On the Manage this Farms Shared Services page, click the SSP to reset.&lt;/li&gt;
&lt;li&gt;Select Search settings in the Search section.&lt;/li&gt;
&lt;li&gt;On the Configure Search Settings page, click Reset all crawled content in the Crawl Settings section&lt;/li&gt;
&lt;li&gt;By default, the Deactivate search alerts during reset check box is selected on the Reset Crawled Content page. This option prevents users who have search alerts configured from being sent unnecessary e-mail messages when the crawled content is reset. Click to clear this check box if you do not want to disable alerts during the reset operation.&lt;/li&gt;
&lt;li&gt;Click Reset Now.&lt;/li&gt;
&lt;li&gt;In the message box, click OK to confirm that you want to reset the search content index.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;u&gt;Key words&lt;/u&gt;
&lt;br /&gt;
"Error The content index is corrupt. Unable to connect ..."
&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;Resources&lt;/u&gt;
&lt;br /&gt;
&lt;a href="http://blog.networkfoo.org/?p=345"&gt;MOSS Search. Error The content index is corrupt. Unable to connect to the Search Service&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-3564483643582350";
/* 728x90, created 12/26/08 */
google_ad_slot = "8029697074";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1081905209486048806-3735430535931278347?l=chrisghardwick.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/t8GJ6fmuJXZpSelHDPmfsMj_MW0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/t8GJ6fmuJXZpSelHDPmfsMj_MW0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/t8GJ6fmuJXZpSelHDPmfsMj_MW0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/t8GJ6fmuJXZpSelHDPmfsMj_MW0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~4/LBkpgW7Fjmc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://chrisghardwick.blogspot.com/feeds/3735430535931278347/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1081905209486048806&amp;postID=3735430535931278347" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/3735430535931278347?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/3735430535931278347?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~3/LBkpgW7Fjmc/reset-crawled-content-on-moss-2007.html" title="Reset Crawled Content on MOSS 2007 Shared Services" /><author><name>Christopher Hardwick</name><uri>https://profiles.google.com/116172115963583202334</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_8fK8UBWIUvA/SYyw3yg0RiI/AAAAAAAAHVw/yYL_fr1Q8vU/s72-c/OfficeSharePointServerSharedServices.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://chrisghardwick.blogspot.com/2012/01/reset-crawled-content-on-moss-2007.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEEHQXs7eSp7ImA9WhRVEk0.&quot;"><id>tag:blogger.com,1999:blog-1081905209486048806.post-4152614522853554800</id><published>2012-01-10T09:43:00.000-05:00</published><updated>2012-01-10T09:43:50.501-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-10T09:43:50.501-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="BgInfo" /><category scheme="http://www.blogger.com/atom/ns#" term="BgInfo v4.16" /><title>BgInfo... it still makes sense.</title><content type="html">BgInfo places machine, networking and configuration information on the desktop by creating a desktop (background) bitmap. This simple program is very useful for helping to keep track of what machine your using, and putting important information right in front of the user.&lt;br /&gt;
&lt;br /&gt;
Here's a simple screenshot of my desktop background:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-_NnzvHP6bQE/TwxMnVDNqNI/AAAAAAAAHcY/U2vopnG-lag/s1600/BgInfo-Background.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="225" width="400" src="http://1.bp.blogspot.com/-_NnzvHP6bQE/TwxMnVDNqNI/AAAAAAAAHcY/U2vopnG-lag/s400/BgInfo-Background.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
While it's useful for basic information, it becomes more useful when you start to think outside of the box on what information it can display. BgInfo can use a configuration file to display additional information for you, opening the application up to provide additional information. Really anything that you can see/discover/query or otherwise on the machine or from the machine.&lt;br /&gt;
&lt;br /&gt;
In an example: I've been working with Amazon Web Services (Aws), and create machines all the time. Keeping track of the machine, and it's relationship to the larger cloud was difficult. BgInfo can display not only machine information, but also information from the cloud. The blog post outlines a basic way to get Aws information onto the desktop within the cloud. It's quick, clean, effective... and most importantly reliable: &lt;a href="http://wishfulcode.com/2011/05/01/ec2-using-bginfo-to-display-instance-details-instance-id-ami-id-availability-zone/"&gt;EC2: Using BGINFO to display Instance Details (Instance-Id, AMI Id, Availability Zone)&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
The basics of BgInfo and a download can be found in this article: &lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb897557"&gt;BgInfo v4.16&lt;/a&gt;. Below I've included some additional resources that provide some additional information.&lt;br /&gt;
&lt;br /&gt;
This article actually outlines how to do the BgInfo configuration to a database: &lt;a href="http://www.howtogeek.com/51544/use-bginfo-to-build-a-database-of-system-information-of-your-network-computers/"&gt;Use BGInfo to Build a Database of System Information of Your Network Computers&lt;/a&gt;. This is pretty far from what I see as it's intended usage, but demonstrates some of the flexibility of the utility.&lt;br /&gt;
&lt;br /&gt;
For the record, BgInfo works on Windows XP, Windows Server 2003 (and higher). If your using a machine older than 2003 or XP, it's time to upgrade.&lt;br /&gt;
&lt;br /&gt;
Resources:&lt;br /&gt;
&lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb897557"&gt;BgInfo v4.16&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.windowsitpro.com/article/desktop-management/bginfo"&gt;BGInfo Keep an eye on system info&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://wishfulcode.com/2011/05/01/ec2-using-bginfo-to-display-instance-details-instance-id-ami-id-availability-zone/"&gt;EC2: Using BGINFO to display Instance Details (Instance-Id, AMI Id, Availability Zone)&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.howtogeek.com/51544/use-bginfo-to-build-a-database-of-system-information-of-your-network-computers/"&gt;Use BGInfo to Build a Database of System Information of Your Network Computers&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-3564483643582350";
/* 728x90, created 12/26/08 */
google_ad_slot = "8029697074";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1081905209486048806-4152614522853554800?l=chrisghardwick.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/A7aS-5Wtsbc9aAfrFcgweFLWegc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/A7aS-5Wtsbc9aAfrFcgweFLWegc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/A7aS-5Wtsbc9aAfrFcgweFLWegc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/A7aS-5Wtsbc9aAfrFcgweFLWegc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~4/Ua3cW2exiG4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://chrisghardwick.blogspot.com/feeds/4152614522853554800/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1081905209486048806&amp;postID=4152614522853554800" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/4152614522853554800?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/4152614522853554800?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~3/Ua3cW2exiG4/bginfo-it-still-makes-sense.html" title="BgInfo... it still makes sense." /><author><name>Christopher Hardwick</name><uri>https://profiles.google.com/116172115963583202334</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-_NnzvHP6bQE/TwxMnVDNqNI/AAAAAAAAHcY/U2vopnG-lag/s72-c/BgInfo-Background.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://chrisghardwick.blogspot.com/2012/01/bginfo-it-still-makes-sense.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0cER3gyfCp7ImA9WhRVEk0.&quot;"><id>tag:blogger.com,1999:blog-1081905209486048806.post-79868794495365238</id><published>2012-01-10T09:16:00.000-05:00</published><updated>2012-01-10T09:16:46.694-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-10T09:16:46.694-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SmartForm" /><category scheme="http://www.blogger.com/atom/ns#" term="Ektron" /><category scheme="http://www.blogger.com/atom/ns#" term="Ektron 8.02" /><title>Smart Form with custom root element blank when editing (Version: 8.02)</title><content type="html">When creating a SmartForm with a custom root element the SmartForm created correctly without a problem. When going to edit the SmartForm content it appears blank. However, the content is viewable (when not in edit mode), and renders properly.&lt;br /&gt;
&lt;br /&gt;
Investigating the problem, it appears the xml is correctly there, it just won't let you edit it.&lt;br /&gt;
&lt;br /&gt;
Credit for this solution goes entirely to &lt;a href="http://dev.ektron.com/forum.aspx?g=profile&amp;u=10654"&gt;EktronRashmi&lt;/a&gt; and was posted on the Ektron forum in his post &lt;a href="http://dev.ektron.com/forum.aspx?g=posts&amp;t=36624"&gt;Smart Form with Custom Root Element Doesn't Allow Editing&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
This forum post contained the solution (&lt;a href="http://dev.ektron.com/forum.aspx?g=posts&amp;t=36624"&gt;Smart Form with Custom Root Element Doesn't Allow Editing&lt;/a&gt;):&lt;br /&gt;
&lt;blockquote&gt;Here's a fix for this issue&lt;br /&gt;
edit sitetroot\workrarea\java\ektron.xml.js&lt;br /&gt;
go to line # 299 and comment out following IF statement block (5 lines)&lt;br /&gt;
if ("&lt;" == xml.substr(0, 1) &amp;&amp; xml.substr(xml.length - 7) != "&lt;/root&gt;") &lt;br /&gt;
{ &lt;br /&gt;
xml = "&lt;root&gt;" + xml + "&lt;/root&gt;"; &lt;br /&gt;
bRootTagAdded = true; &lt;br /&gt;
} &lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
He actually puts a nice screenshot in there as well:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://dev.ektron.com/uploadedImages/DevCenter/Ektron_Forums/62075.JPG" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="667" width="811" src="http://dev.ektron.com/uploadedImages/DevCenter/Ektron_Forums/62075.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Based upon this article, I completed the following steps to fix the problem:&lt;br /&gt;
1. Checked the file out of source control&lt;br /&gt;
2. Applied the fix listed in the forum post&lt;br /&gt;
3. Checked the file in&lt;br /&gt;
4. Deployed to site&lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
&lt;a href="http://dev.ektron.com/forum.aspx?g=posts&amp;t=36624"&gt;Smart Form with Custom Root Element Doesn't Allow Editing&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://dev.ektron.com/forum.aspx?g=profile&amp;u=10654"&gt;EktronRashmi Profile&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://documentation.ektron.com/cms400/v801/mobile_help/Advanced/Content/Main_Import_file/smart_DD_field_types_ewe400.htm#smart_DD_field_types_ewe400_3543194847_1358548"&gt;Using a Tag Other Than Root&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-3564483643582350";
/* 728x90, created 12/26/08 */
google_ad_slot = "8029697074";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1081905209486048806-79868794495365238?l=chrisghardwick.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/iOATq008gmk3K2G7Wj3BEHs3Eoo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iOATq008gmk3K2G7Wj3BEHs3Eoo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/iOATq008gmk3K2G7Wj3BEHs3Eoo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iOATq008gmk3K2G7Wj3BEHs3Eoo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~4/6iXsyN0a7vI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://chrisghardwick.blogspot.com/feeds/79868794495365238/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1081905209486048806&amp;postID=79868794495365238" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/79868794495365238?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/79868794495365238?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~3/6iXsyN0a7vI/smart-form-with-custom-root-element.html" title="Smart Form with custom root element blank when editing (Version: 8.02)" /><author><name>Christopher Hardwick</name><uri>https://profiles.google.com/116172115963583202334</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total><georss:featurename>Marietta, GA, USA</georss:featurename><georss:point>33.95260200000001 -84.5499327</georss:point><georss:box>33.89982250000001 -84.6243667 34.00538150000001 -84.4754987</georss:box><feedburner:origLink>http://chrisghardwick.blogspot.com/2012/01/smart-form-with-custom-root-element.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUYCRHo6fSp7ImA9WhRVEU8.&quot;"><id>tag:blogger.com,1999:blog-1081905209486048806.post-111034541783890858</id><published>2012-01-09T10:32:00.000-05:00</published><updated>2012-01-09T10:32:45.415-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-09T10:32:45.415-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Ektron" /><category scheme="http://www.blogger.com/atom/ns#" term="Content Management" /><title>Designing Data Templates for Content Extraction with Ektron (JSon, XML) (Ektron Designing Content Delivery: Part 2)</title><content type="html">In my first post &lt;a href="http://chrisghardwick.blogspot.com/2012/01/designing-ektron-content-delivery-and.html"&gt;Designing an Ektron Content Delivery and Provider Mechanism (Part 1)&lt;/a&gt; I outlined the basic steps for designing Ektron for management of the content, with the idea of pushing (or pulling) content from this system to be consumed by a host of other sites (and potentially applications).&lt;br /&gt;
&lt;br /&gt;
This post will focus on designing template for the extraction of information from Ektron so that it may be pushed or pulled for consumption by other systems.&lt;br /&gt;
&lt;br /&gt;
This started with basic research around how to retrieve information from Ektron. &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;1. API - The application itself supports a fairly extensive &lt;a href="http://www.ektron.com/Solutions/WCM-Technology/Platform/Open-API-and-Extensibility/"&gt;API&lt;/a&gt; which could certainly be used to interact with information. You can certainly get at your content and manipulate it. However investigation here was pretty easy. The  API itself is around retrieval and content management and not around manipulation. The proof of concept certainly worked, but was a lot of work and manual code.&lt;/li&gt;
&lt;li&gt;2. Database - Ektron maintains a SQL database, and you can see your content. You &lt;i&gt;could&lt;/i&gt; write your own access logic, and get the information you need. However, aside from violating the &lt;a href="http://chrisghardwick.blogspot.com/2012/01/best-practices-for-developing-your.html"&gt;best practices for Ektron&lt;/a&gt; (and making your new infrastructure completely Ektron version dependent), this is a tremendous amount of manual work for little or no benefit. This is possible, but so far beyond practical or reliable.&lt;/li&gt;
&lt;li&gt;3. Templates &lt;b&gt;[Selected Solution]&lt;/b&gt; - Out of the box Ektron supports templates. For the most part these templates are designed to render content out to the end-user... but... the design is also flexible. At the end of the day this is what Ektron is designed to do, just with a slightly different end-result or consumption. The proof of concept worked, and was easily integrated into the Ektron web-site. In other words: simplicity.&lt;/li&gt;
&lt;li&gt;4. Ektron Web-services - Ektron supports a host of web-services for interacting with the application. Designed in a very similar fashion to their API, it works, and is practical. Built on SOAP this is a very viable option. In similar to the API it's design around retrieval and content management and not around manipulation. The proof of concept certainly worked, but was a work to create the transitions from the content type to the rendered types.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
In the end the solution that worked best was to design a series of templates. Why? It was easy to do, worked well with Ektron's design and provided a tremendous amount of flexibility. This created some quick benefits to the project:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Content could be managed via a url so access via the wrapper API could be directly tied back to the content it represented. In the end, we selected manual alias names for content (as an example: [Group]/[Section]/[Content]/).&lt;/li&gt;
&lt;li&gt;The type of content to be generated when pulled could be set/managed inside of Ektron, simple by selecting a template (JSon/Xml/Html, etc.) reducing the amount of IT management and overhead.&lt;/li&gt;
&lt;li&gt;The templates at the end of the day are relatively simple ASPX pages, which require a small amount of development and can be managed as part of the Ektron website for lifecycle and delivery.&lt;/li&gt;
&lt;li&gt;The paring with Ektron SmartForms makes an extremely flexible offering with control over structure, content, security and delivery.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
In the end, I decided on a basic delivery set of Html, Text, Xml, JSon. In order to make the most compelling offering, these were arranged into a simple folder structure:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;  &lt;li&gt;Content&lt;br /&gt;
    &lt;ul&gt;      &lt;li&gt;SmartForm Translation with MetaData&lt;/li&gt;
      &lt;li&gt;AsJson&lt;/li&gt;
      &lt;li&gt;AsXml&lt;/li&gt;
    &lt;/ul&gt;  &lt;/li&gt;
  &lt;li&gt;Taxonomy&lt;br /&gt;
    &lt;ul&gt;      &lt;li&gt;SmartForm Translation with MetaData (planned)&lt;/li&gt;
      &lt;li&gt;AsJson&lt;/li&gt;
      &lt;li&gt;AsXml (planned)&lt;/li&gt;
    &lt;/ul&gt;    &lt;i&gt;Note: I could do a whole post on what I am doing with Taxonomy separate from rendering content. If anyone is interested let me know.&lt;/i&gt;&lt;br /&gt;
  &lt;/li&gt;
  &lt;li&gt;AsJson&lt;/li&gt;
  &lt;li&gt;AsXml&lt;/li&gt;
  &lt;li&gt;AsRaw&lt;/li&gt;
  &lt;li&gt;AsRawCollection&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
The content templates are exactly what you think: rendering out the actual content. The other base templates render out the entire Ektron content items. However, I built those because it was easy to do, the vast majority of the items built on top of this are around the content and taxonomy templates.&lt;br /&gt;
&lt;br /&gt;
Here's an example of the JSon template for content:&lt;br /&gt;
&lt;b&gt;ASPX:&lt;/b&gt;&lt;br /&gt;
&lt;blockquote&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; 
                color: #000000; background-color: #eee;
                font-size: 12px; border: 1px dashed #999999;
                line-height: 14px; padding: 5px; 
                overflow: auto; width: 100%"&gt;       &lt;code style="color:#000000;word-wrap:normal;"&gt;
&amp;lt;%@ Page Language="C#" AutoEventWireup="true" CodeFile="AsJSon.aspx.cs" Inherits="Shared_Template_Content_AsJSon" %&amp;gt;
&amp;lt;%@ Register Assembly="Ektron.Cms.Controls" Namespace="Ektron.Cms.Controls" TagPrefix="CMS" %&amp;gt;

&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;

&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;
&amp;lt;head runat="server"&amp;gt;
    &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;form id="form1" runat="server"&amp;gt;
    &amp;lt;div&amp;gt;
        &amp;lt;CMS:ContentBlock ID="ContentBlock1" runat="server" /&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;/form&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
       &lt;/code&gt;
 &lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;b&gt;Code-Behind:&lt;/b&gt;&lt;br /&gt;
&lt;blockquote&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; 
                color: #000000; background-color: #eee;
                font-size: 12px; border: 1px dashed #999999;
                line-height: 14px; padding: 5px; 
                overflow: auto; width: 100%"&gt;       &lt;code style="color:#000000;word-wrap:normal;"&gt;
public partial class Template_Content_AsJSon : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        this.ContentBlock1.SetDynamicParameterToIdAndFill();

        var document = new XmlDocument();
        document.LoadXml(this.ContentBlock1.EkItem.Html);

        Response.Clear();
        
        Response.ContentType = Web.ContentTypeDefinition.JSon;
        Response.Write(JsonConvert.SerializeXmlNode(document).Replace("@", string.Empty).Replace("#text", "text")); 

        Response.End();
    }
}
       &lt;/code&gt;
 &lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;
As you can see basic and effective. Content is available to be pulled (or pushed) via a url. Content (as data, html or any other delivery) is easily track able back as a url, rather than by an id or some other abstract storage identifier. Ektron manages the content, security, data storage definitions, and management of the content/delivery mechanism.&lt;br /&gt;
&lt;br /&gt;
In my next posts:&lt;br /&gt;
1. Designing a Generic Meta-Data Driven Transformation Template with Ektron&lt;br /&gt;
2. Designing a wrapper-API for consumption, caching and rendering of Ektron data&lt;br /&gt;
3. Now look what we can do: Render Ektron client-side with data templates and &lt;a href="https://github.com/BorisMoore/jsrender"&gt;JsRender&lt;/a&gt; (for smoking fast response times).&lt;br /&gt;
&lt;br /&gt;
Resources:&lt;br /&gt;
&lt;a href="http://www.ektron.com/Solutions/WCM-Technology/Platform/Open-API-and-Extensibility/"&gt;Ektron API&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://chrisghardwick.blogspot.com/2012/01/best-practices-for-developing-your.html"&gt;Ektron Best Practices&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://dev.ektron.com/articles.aspx?id=20352"&gt;Design without Borders, yet with Structure&lt;/a&gt;&lt;br /&gt;
&lt;a href="https://github.com/BorisMoore/jsrender"&gt;JsRender&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-3564483643582350";
/* 728x90, created 12/26/08 */
google_ad_slot = "8029697074";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1081905209486048806-111034541783890858?l=chrisghardwick.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/cTY8faraVMUtUHDN49YUOlSTRcU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cTY8faraVMUtUHDN49YUOlSTRcU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/cTY8faraVMUtUHDN49YUOlSTRcU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cTY8faraVMUtUHDN49YUOlSTRcU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~4/rz6gE3ixAgs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://chrisghardwick.blogspot.com/feeds/111034541783890858/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1081905209486048806&amp;postID=111034541783890858" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/111034541783890858?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/111034541783890858?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~3/rz6gE3ixAgs/designing-data-templates-for-content.html" title="Designing Data Templates for Content Extraction with Ektron (JSon, XML) (Ektron Designing Content Delivery: Part 2)" /><author><name>Christopher Hardwick</name><uri>https://profiles.google.com/116172115963583202334</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://chrisghardwick.blogspot.com/2012/01/designing-data-templates-for-content.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak8HR3o-eSp7ImA9WhRWGEo.&quot;"><id>tag:blogger.com,1999:blog-1081905209486048806.post-4624911510913751817</id><published>2012-01-06T14:40:00.000-05:00</published><updated>2012-01-06T14:40:36.451-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-06T14:40:36.451-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Ektron" /><title>Ektron: "System.Web.Services.Protocols.SoapException: Credentials must be specified"</title><content type="html">When using the Ektron.Services a feature works correctly, but when deployed to a remote machine, the content rendering fails with "System.Web.Services.Protocols.SoapException: Credentials must be specified".&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-OG9i9PRR96o/TwdKx6CVsZI/AAAAAAAAHcA/i4ZCTXOwtJw/s1600/EktronSoapException.png" imageanchor="1" style="clear:right; float:right; margin-left:1em; margin-bottom:1em"&gt;&lt;img border="0" height="88" width="400" src="http://2.bp.blogspot.com/-OG9i9PRR96o/TwdKx6CVsZI/AAAAAAAAHcA/i4ZCTXOwtJw/s400/EktronSoapException.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;blockquote&gt;Server Error in '/' Application.&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Credentials must be specified &lt;br /&gt;
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. &lt;br /&gt;
&lt;br /&gt;
Exception Details: System.Web.Services.Protocols.SoapException: Credentials must be specified&lt;br /&gt;
&lt;br /&gt;
Source Error: &lt;br /&gt;
&lt;br /&gt;
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.  &lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
Ouch. &lt;br /&gt;
&lt;br /&gt;
According to this post &lt;a href="http://dev.ektron.com/forum.aspx?g=posts&amp;t=8390"&gt;System.Web.Services.Protocols.SoapException: Credentials must be specified&lt;/a&gt; &lt;i&gt;"That code will work from local system but won't work from remote system because of security. Ektron does not allow unauthenticated remote calls. In order to execute WS calls remotely you need to specify username and password of a cms user."&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
This code will add authentication that will allow the call to complete without a SOAP exception:&lt;br /&gt;
&lt;blockquote&gt;Ektron.Services.AuthenticationHeaderValue = new Ektron.Services.AuthenticationHeader();&lt;br /&gt;
Ektron.Services.AuthenticationHeaderValue.Username = "admin";&lt;br /&gt;
Ektron.Services.AuthenticationHeaderValue.Password = "admin";&lt;/blockquote&gt;&lt;br /&gt;
This is a great example where you could wrap the authentication into a factory for creation of the service wrapper objects and/or create a fluent extension method that sets credentials for each wrapper object:&lt;br /&gt;
&lt;blockquote&gt;var taxonomySvc = TaxonomyFactory.GetService(); OR var taxonomySvc = new Ektron.Services.Taxonomy().WithDefaultCredentials();&lt;/blockquote&gt;&lt;br /&gt;
&lt;i&gt;&lt;b&gt;However, you should not a couple of things. &lt;/b&gt;&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
In my case, I was working with the Taxonomy classes, and by accident referenced: &lt;b&gt;Ektron.Services.Taxonomy&lt;/b&gt; and &lt;i&gt;NOT&lt;/i&gt; &lt;b&gt;Ektron.Cms.API.Content.Taxonomy&lt;/b&gt;. Apparently they both work the same, and are available (in separate namespaces). According to the same post, the latter (Ektron.Cms.API.Content.Taxonomy) should not require credentials. Which would explain how I came across this problem in the first place.&lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
&lt;a href="http://dev.ektron.com/forum.aspx?g=posts&amp;t=8390"&gt;System.Web.Services.Protocols.SoapException: Credentials must be specified&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-3564483643582350";
/* 728x90, created 12/26/08 */
google_ad_slot = "8029697074";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1081905209486048806-4624911510913751817?l=chrisghardwick.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/SGSZfUYUJl-ztE3LP__7pAqFRJ4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SGSZfUYUJl-ztE3LP__7pAqFRJ4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/SGSZfUYUJl-ztE3LP__7pAqFRJ4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SGSZfUYUJl-ztE3LP__7pAqFRJ4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~4/PwzsFKpca8k" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://chrisghardwick.blogspot.com/feeds/4624911510913751817/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1081905209486048806&amp;postID=4624911510913751817" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/4624911510913751817?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/4624911510913751817?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~3/PwzsFKpca8k/ektron-systemwebservicesprotocolssoapex.html" title="Ektron: &quot;System.Web.Services.Protocols.SoapException: Credentials must be specified&quot;" /><author><name>Christopher Hardwick</name><uri>https://profiles.google.com/116172115963583202334</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-OG9i9PRR96o/TwdKx6CVsZI/AAAAAAAAHcA/i4ZCTXOwtJw/s72-c/EktronSoapException.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://chrisghardwick.blogspot.com/2012/01/ektron-systemwebservicesprotocolssoapex.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkIDRX4_fip7ImA9WhRWGE0.&quot;"><id>tag:blogger.com,1999:blog-1081905209486048806.post-8236419491888114869</id><published>2012-01-05T16:56:00.000-05:00</published><updated>2012-01-05T16:56:14.046-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-05T16:56:14.046-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Ektron" /><category scheme="http://www.blogger.com/atom/ns#" term="CMS" /><category scheme="http://www.blogger.com/atom/ns#" term="Content Management" /><title>Designing an Ektron Content Delivery and Provider Mechanism (Part 1)</title><content type="html">As your designing your &lt;a href="http://www.ektron.com/"&gt;Ekron &lt;/a&gt;Content Management System (CMS) you need to design the level of interaction your enterprise will have with the CMS. &lt;br /&gt;
&lt;br /&gt;
From the design of Ektron you can see it prefers to be the center of your offering. Most of the controls, pages, API and other components are geared towards building a site. In that regard, it seems to be competent. &lt;br /&gt;
&lt;br /&gt;
For the project I am currently working on, the idea is something very different. It's to &lt;b&gt;use Ektron for management of the content&lt;/b&gt;, with the idea of pushing (or pulling) content from this system to be consumed by a host of other sites (and potentially applications).&lt;br /&gt;
&lt;br /&gt;
In some regards, Ektron is not designed to do this type of work. The out-of-the-box offering for exporting content supports PDF, and a synronization utility integrated with the product called &lt;a href="http://www.ektron.com/Products/Web-CMS/eSync/"&gt;ESync &lt;/a&gt;is designed to move content through the environments, and for content generation. Their marketing literature describes ESync as: &lt;i&gt;"Automate the secure provisioning of web content, code, assets, and templates from development through production. Deploy only the necessary changes, from a single content update to an entire site, speeding time to Web and eliminating site downtime."&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
Based upon Ektron's functionality and the desire to use it as a content repository there is a need to:&lt;br /&gt;
1. Design a way to generic render XML (SmartForm) content into Html, Text, Csv&lt;br /&gt;
2. Design a way to extract content information (SmartForm) into Xml, JSon&lt;br /&gt;
3. Design a way to extract html (or Ektron rendered content) in it's native format&lt;br /&gt;
4. Develop an Intermediate/Proxy API capable of extracting content on demand, providing caching of that content at the destination, and providing the content when requested.&lt;br /&gt;
5. &lt;br /&gt;
&lt;br /&gt;
These deliverables combined with Ektron as a system itself (including the best practices documentation) generated these additional constraints or parameters: &lt;br /&gt;
1. The content delivery and provider mechanism should not interact directly with Ektron's data-storage.&lt;br /&gt;
2. The system should rely heavily on using the Ektron website for content extraction, and avoid direct interaction with the database, or Ektron APIs where possible.&lt;br /&gt;
3. The delivery mechanism should be extremely flexible and should scale with demand.&lt;br /&gt;
4. Any development should wrap Ektron, and not involve changing the core application or product.&lt;br /&gt;
5. The strategy support upgrading Ektron at any time.&lt;br /&gt;
&lt;br /&gt;
In order to achieve the deliverables and system requirements, I designed a series of extraction templates (to be included within the Ektron site), and an API for use by these templates, and for extraction of the content (in it's various forms).&lt;br /&gt;
&lt;br /&gt;
This is the high-level design:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-DnJrMIb1PM8/TwYZyUyUMZI/AAAAAAAAHb0/mMm3liDA8tI/s1600/Ektron1.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="128" width="400" src="http://2.bp.blogspot.com/-DnJrMIb1PM8/TwYZyUyUMZI/AAAAAAAAHb0/mMm3liDA8tI/s400/Ektron1.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Each of the sites consuming the content access Ektron's information via the API, and then store the content within one of the caching mechanisms (file/IO, HttpContext caching, RavenDB) and retrieve any missing content on demand.&lt;br /&gt;
&lt;br /&gt;
Since the API capable of retrieving, caching and filtering content it supports on-demand requests, pull-requests from sites. The next goal is to add content-push from Ektron into the caching mechanisms (proactively staging updated content for the sites to consume).&lt;br /&gt;
&lt;br /&gt;
In my next post:&lt;br /&gt;
1. Designing Data Templates for Content Extraction with Ektron (JSon, XML)&lt;br /&gt;
2. Designing a Generic Meta-Data Driven Transformation Template with Ekron&lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
&lt;a href="http://www.ektron.com/"&gt;Ektron&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.ektron.com/Products/Web-CMS/eSync/"&gt;ESync&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-3564483643582350";
/* 728x90, created 12/26/08 */
google_ad_slot = "8029697074";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1081905209486048806-8236419491888114869?l=chrisghardwick.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/xJJjr505K1E6po7HXo3Ufw-bBWo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xJJjr505K1E6po7HXo3Ufw-bBWo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/xJJjr505K1E6po7HXo3Ufw-bBWo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xJJjr505K1E6po7HXo3Ufw-bBWo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~4/rAGf0WEyGYU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://chrisghardwick.blogspot.com/feeds/8236419491888114869/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1081905209486048806&amp;postID=8236419491888114869" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/8236419491888114869?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/8236419491888114869?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~3/rAGf0WEyGYU/designing-ektron-content-delivery-and.html" title="Designing an Ektron Content Delivery and Provider Mechanism (Part 1)" /><author><name>Christopher Hardwick</name><uri>https://profiles.google.com/116172115963583202334</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-DnJrMIb1PM8/TwYZyUyUMZI/AAAAAAAAHb0/mMm3liDA8tI/s72-c/Ektron1.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://chrisghardwick.blogspot.com/2012/01/designing-ektron-content-delivery-and.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk4GSXw5eSp7ImA9WhRWFkQ.&quot;"><id>tag:blogger.com,1999:blog-1081905209486048806.post-9000640405597744648</id><published>2012-01-04T11:35:00.000-05:00</published><updated>2012-01-04T11:35:28.221-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-04T11:35:28.221-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript" /><category scheme="http://www.blogger.com/atom/ns#" term="Unit Testing" /><category scheme="http://www.blogger.com/atom/ns#" term="Chrome" /><category scheme="http://www.blogger.com/atom/ns#" term="Node.js" /><title>Giving Node.js a Try</title><content type="html">Based upon their own description: &lt;i&gt;"Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices."&lt;/i&gt; (-http://nodejs.org/)&lt;br /&gt;
&lt;br /&gt;
Seems pretty tempting. In particular I'm interesting is using Node.js for Javascript unit testing in combination with &lt;a href="http://pivotal.github.com/jasmine/"&gt;Jasmine&lt;/a&gt;. As I've started creating some basic script libraries for dependency injection and publish-subscribe I need a way to unit test and a way to run these tests. It's also promising for use with &lt;a href="https://github.com/BorisMoore/jsrender"&gt;JsRender&lt;/a&gt; as well for templating on the server-side.&lt;br /&gt;
&lt;br /&gt;
This blog post (&lt;a href="http://codeofrob.com/archive/2011/04/30/5-reasons-to-give-node-js-some-love.aspx"&gt;5 reasons to give node.js some love&lt;/a&gt;) covers what I think are the basic reasons why to give it a try:&lt;br /&gt;
&lt;i&gt;1) You get to write Javascript on the server and the client&lt;br /&gt;
2) Event-based asynchronous stuff is just How Things Work in JavaScript&lt;br /&gt;
3) Awesome package management!&lt;br /&gt;
4) Community community community&lt;br /&gt;
5) It's easy, really easy, like super easy, We can all do it!&lt;/i&gt; &lt;br /&gt;
(-http://codeofrob.com/archive/2011/04/30/5-reasons-to-give-node-js-some-love.aspx)&lt;br /&gt;
&lt;br /&gt;
The download link on the &lt;a href="http://nodejs.org/"&gt;Node.js site&lt;/a&gt; offers three download options: Windows Installer, Mac Installer, and source. Today I am going to download both the Windows Installer and the source (to take a look). For reference the project is hosted on GitHub  here: https://github.com/joyent/node. Taking a look, the project seems active and had a recent check in (43 minutes ago).&lt;br /&gt;
&lt;br /&gt;
After running the installation, getting started is easy. &lt;br /&gt;
1. Open a command-prompt&lt;br /&gt;
2. Navigate to the executable path (on my machine): "C:\Program Files (x86)\nodejs\" &lt;br /&gt;
3. Create a small, sample script to be executed, and name it example.js. In my case I copied it from the example:&lt;br /&gt;
&lt;blockquote&gt;var http = require('http');&lt;br /&gt;
http.createServer(function (req, res) {&lt;br /&gt;
  res.writeHead(200, {'Content-Type': 'text/plain'});&lt;br /&gt;
  res.end('Hello World\n');&lt;br /&gt;
}).listen(1337, "127.0.0.1");&lt;br /&gt;
console.log('Server running at http://127.0.0.1:1337/');&lt;/blockquote&gt;4. Type &lt;i&gt;node example.js&lt;/i&gt;&lt;br /&gt;
5. node.js will respond with the result of the executed script. In this case: &lt;blockquote&gt;"Server running at http://127.0.0.1:1337/"&lt;/blockquote&gt;&lt;br /&gt;
How to exit node.js:&lt;br /&gt;
To exit node.js you have to enter the key-combination Ctrl-C twice or &lt;i&gt;Ctrl-C, Ctrl-C&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
&lt;a href="http://nodejs.org/"&gt;Node.js&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://pivotal.github.com/jasmine/"&gt;Jasmine&lt;/a&gt;&lt;br /&gt;
&lt;a href="https://github.com/BorisMoore/jsrender"&gt;JsRender&lt;/a&gt; &lt;br /&gt;
&lt;a href="http://codeofrob.com/archive/2011/04/30/5-reasons-to-give-node-js-some-love.aspx"&gt;5 reasons to give node.js some love&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-3564483643582350";
/* 728x90, created 12/26/08 */
google_ad_slot = "8029697074";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1081905209486048806-9000640405597744648?l=chrisghardwick.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/w9f_0A2mfa92kgHw4s7uUirVCaA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/w9f_0A2mfa92kgHw4s7uUirVCaA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/w9f_0A2mfa92kgHw4s7uUirVCaA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/w9f_0A2mfa92kgHw4s7uUirVCaA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~4/lzfsRdbFmR0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://chrisghardwick.blogspot.com/feeds/9000640405597744648/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1081905209486048806&amp;postID=9000640405597744648" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/9000640405597744648?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/9000640405597744648?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~3/lzfsRdbFmR0/giving-nodejs-try.html" title="Giving Node.js a Try" /><author><name>Christopher Hardwick</name><uri>https://profiles.google.com/116172115963583202334</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><georss:featurename>Marietta, GA, USA</georss:featurename><georss:point>33.95260200000001 -84.5499327</georss:point><georss:box>33.89982250000001 -84.6243667 34.00538150000001 -84.4754987</georss:box><feedburner:origLink>http://chrisghardwick.blogspot.com/2012/01/giving-nodejs-try.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMCRXk4fSp7ImA9WhRWFkQ.&quot;"><id>tag:blogger.com,1999:blog-1081905209486048806.post-2708046808799740830</id><published>2012-01-04T10:54:00.000-05:00</published><updated>2012-01-04T10:54:24.735-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-04T10:54:24.735-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ILSpy" /><category scheme="http://www.blogger.com/atom/ns#" term="Open Source" /><category scheme="http://www.blogger.com/atom/ns#" term=".NET Reflector" /><title>ILSpy: An Alternative to .NET Reflector</title><content type="html">According to RedGate &lt;a href="http://www.reflector.net/"&gt;.NET Reflector&lt;/a&gt; is longer a free (as of February 2011, which leaves a big opening for a new assembly browser for .NET assemblies.&lt;br /&gt;
&lt;br /&gt;
Today I checked out &lt;a href="http://wiki.sharpdevelop.net/ILSpy.ashx"&gt;ILSpy&lt;/a&gt;. It is an open-source .NET assembly browser and decompiler. It runs on .NET 4.0, and from GitHub is appears to be maintained. It even has a couple of plug-ins (I didn't install any of them) available: http://wiki.sharpdevelop.net/ILSpy%20Plugins.ashx&lt;br /&gt;
&lt;br /&gt;
The user interface looks familiar, almost like .NET Reflector from a few versions ago. It also supports the drag-and-drop of assemblies. &lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-rbu5Ppd6m4U/TwR0wvDr-WI/AAAAAAAAHbo/LtyYW4JZuus/s1600/ILSpy.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="220" width="320" src="http://4.bp.blogspot.com/-rbu5Ppd6m4U/TwR0wvDr-WI/AAAAAAAAHbo/LtyYW4JZuus/s320/ILSpy.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
It's simple and works well. I'm going to keep it.&lt;br /&gt;
&lt;br /&gt;
Next up I am going to install the Visual Studio Plug-In and see &lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
&lt;a href="https://github.com/icsharpcode/ILSpy"&gt;ILSpy in GitHub&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://wiki.sharpdevelop.net/ILSpy.ashx"&gt;ILSpy&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://community.sharpdevelop.net/forums/t/13720.aspx"&gt;ILSpy Visual Studio Plug-In (&lt;br /&gt;
(Forum Post)&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.reflector.net/"&gt;.NET Reflector&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-3564483643582350";
/* 728x90, created 12/26/08 */
google_ad_slot = "8029697074";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1081905209486048806-2708046808799740830?l=chrisghardwick.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/x4Er9vPXRtNBag8AmqiD2g1bmTM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/x4Er9vPXRtNBag8AmqiD2g1bmTM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/x4Er9vPXRtNBag8AmqiD2g1bmTM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/x4Er9vPXRtNBag8AmqiD2g1bmTM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~4/iclgt0ym5BQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://chrisghardwick.blogspot.com/feeds/2708046808799740830/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1081905209486048806&amp;postID=2708046808799740830" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/2708046808799740830?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/2708046808799740830?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~3/iclgt0ym5BQ/ilspy-alternative-to-net-reflector.html" title="ILSpy: An Alternative to .NET Reflector" /><author><name>Christopher Hardwick</name><uri>https://profiles.google.com/116172115963583202334</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-rbu5Ppd6m4U/TwR0wvDr-WI/AAAAAAAAHbo/LtyYW4JZuus/s72-c/ILSpy.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://chrisghardwick.blogspot.com/2012/01/ilspy-alternative-to-net-reflector.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUNSXc5fCp7ImA9WhRWFkw.&quot;"><id>tag:blogger.com,1999:blog-1081905209486048806.post-2722347096753976325</id><published>2012-01-03T12:21:00.001-05:00</published><updated>2012-01-03T12:54:58.924-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-03T12:54:58.924-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Best Practices" /><category scheme="http://www.blogger.com/atom/ns#" term="Ektron" /><title>Best Practices for Developing Your First Ektron Site</title><content type="html">This is a good presentation on best practices for Ektron.&lt;br /&gt;&lt;br /&gt;Key Points:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Prefer SmartForms over HTML content&lt;/b&gt; - SmartForms provide a structured representation of your content allowing for greater control, and options for content re-use.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;PageBuilder&lt;/b&gt; - The presentation recommends leveraging PageBuilder. My own experiences with PageBuilder have been mixed, but then again I am working with 8.0 and not version 8.5&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Create an abstraction layer of Ektron&lt;/b&gt; - A key point in any application, but most definitively within Ektron. An abstraction layer to avoid directly calling the Ektron assemblies.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Have a caching strategy&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Logging&lt;/b&gt; - The presentation recommends using the integrated Microsoft Enterprise Library logging that is already used within Ekton CMS.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Configuration&lt;/b&gt; - The presentation points out that the Ektron configuration, and your custom configuration should be separated into different configuration files.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Presentation:&lt;br /&gt;&lt;a href="http://www.slideshare.net/ektron/best-practices-for-developing-your-first-ektron-site"&gt;Best Practices for Developing Your First Ektron Site&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-3564483643582350";
/* 728x90, created 12/26/08 */
google_ad_slot = "8029697074";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1081905209486048806-2722347096753976325?l=chrisghardwick.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/nDpv2buRlQP8KvlDdDwo_6hAUdE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/nDpv2buRlQP8KvlDdDwo_6hAUdE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/nDpv2buRlQP8KvlDdDwo_6hAUdE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/nDpv2buRlQP8KvlDdDwo_6hAUdE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~4/aI-w5ylznTM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://chrisghardwick.blogspot.com/feeds/2722347096753976325/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1081905209486048806&amp;postID=2722347096753976325" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/2722347096753976325?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/2722347096753976325?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~3/aI-w5ylznTM/best-practices-for-developing-your.html" title="Best Practices for Developing Your First Ektron Site" /><author><name>Christopher Hardwick</name><uri>https://profiles.google.com/116172115963583202334</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://chrisghardwick.blogspot.com/2012/01/best-practices-for-developing-your.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU8AQnc5eyp7ImA9WhRWE0o.&quot;"><id>tag:blogger.com,1999:blog-1081905209486048806.post-6340179951537343081</id><published>2011-12-31T19:23:00.000-05:00</published><updated>2011-12-31T19:30:43.923-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-31T19:30:43.923-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="MobiGo" /><category scheme="http://www.blogger.com/atom/ns#" term="VTech" /><category scheme="http://www.blogger.com/atom/ns#" term="Learning Lodge Navigator" /><title>MobiGo Connecting to a Computer - Device not Found</title><content type="html">So my son received a V-Tech MobiGo "Touch Learning System" for Christmas. Both of the older boys love it, but it has a feature to connect it to a computer. &lt;br /&gt;&lt;br /&gt;Seems simple enough: Install the software, and then connect the device. The directions point to a location of http://www.vtechkids.com/download with instructions to select "Learning Lodge Navigator" software. Ok. No problem.&lt;br /&gt;&lt;br /&gt;After installing the software, and connecting the device, it kept giving the error "device not found". The Windows 7 PC sees the device, the driver was loaded, everything seemed to be fine... except for the software.&lt;br /&gt;&lt;br /&gt;After searching around, it turns out there is more than one Learning Lodge Navigator, and you have to select the correct one. The actual one to download and use is located at: http://www.vtechkids.com/download/us/en/mobigo&lt;br /&gt;&lt;br /&gt;To fix the problem: disconnect the MobiGo device. Uninstall the other version of the "Learning Lodge Navigator", go to the link above and download then install the correct version. Reconnect the device, and it will find it correctly.&lt;br /&gt;&lt;br /&gt;References:&lt;br /&gt;&lt;a href="http://answers.yahoo.com/question/index?qid=20111224003700AA3X2AY"&gt;Yahoo Answers Article with the correct download link.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-3564483643582350";
/* 728x90, created 12/26/08 */
google_ad_slot = "8029697074";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1081905209486048806-6340179951537343081?l=chrisghardwick.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/LO9w0FwpleRuKIOx3qZ7nxmMuVQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LO9w0FwpleRuKIOx3qZ7nxmMuVQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/LO9w0FwpleRuKIOx3qZ7nxmMuVQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LO9w0FwpleRuKIOx3qZ7nxmMuVQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~4/a6pihmht8cg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://chrisghardwick.blogspot.com/feeds/6340179951537343081/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1081905209486048806&amp;postID=6340179951537343081" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/6340179951537343081?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/6340179951537343081?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~3/a6pihmht8cg/mobigo-connecting-to-computer-device.html" title="MobiGo Connecting to a Computer - Device not Found" /><author><name>Christopher Hardwick</name><uri>https://profiles.google.com/116172115963583202334</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://chrisghardwick.blogspot.com/2011/12/mobigo-connecting-to-computer-device.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEQFRHw-eSp7ImA9WhRXFUs.&quot;"><id>tag:blogger.com,1999:blog-1081905209486048806.post-2742935708553005796</id><published>2011-12-22T09:58:00.000-05:00</published><updated>2011-12-22T10:05:15.251-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-22T10:05:15.251-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="TF10121" /><category scheme="http://www.blogger.com/atom/ns#" term="Visual Studio 2010" /><title>TF10121: The path '' is not found or not supported. Type or select a different path</title><content type="html">When working with a Web site within Visual Studio 2010 the Source Control window displayed the error message: TF10121: The path '[Web Site Url]' is not found or not supported. Type or select a different path.&lt;br /&gt;&lt;br /&gt;There are a bunch of different articles out there around how to resolve this problem. Basically the reference article below titled &lt;i&gt;TF10121: The path '' is not found or not supported. Type or select a different path (VS.NET)&lt;/i&gt; has the answer that worked. Open the affected solution (containing the web site that displays this error). Remove the affected project. Re-add the project.&lt;br /&gt;&lt;br /&gt;This did the trick!&lt;br /&gt;&lt;br /&gt;The article below also mentions a more low-level resolution if that does not work correctly (listed as a work-around) under which you manually remove the binding information.&lt;br /&gt;&lt;br /&gt;Reference:&lt;br /&gt;&lt;a href="http://stackemedia.wordpress.com/2009/06/17/tf10121-the-path-is-not-found-or-not-supported-type-or-select-a-different-path-vsnet/"&gt;TF10121: The path '' is not found or not supported. Type or select a different path (VS.NET)&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-3564483643582350";
/* 728x90, created 12/26/08 */
google_ad_slot = "8029697074";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1081905209486048806-2742935708553005796?l=chrisghardwick.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/3J_ZjL8nulAmGHyrtcEsJ8SDyo0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3J_ZjL8nulAmGHyrtcEsJ8SDyo0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/3J_ZjL8nulAmGHyrtcEsJ8SDyo0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3J_ZjL8nulAmGHyrtcEsJ8SDyo0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~4/6AV2OdHqdjA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://chrisghardwick.blogspot.com/feeds/2742935708553005796/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1081905209486048806&amp;postID=2742935708553005796" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/2742935708553005796?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/2742935708553005796?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~3/6AV2OdHqdjA/tf10121-path-is-not-found-or-not.html" title="TF10121: The path '' is not found or not supported. Type or select a different path" /><author><name>Christopher Hardwick</name><uri>https://profiles.google.com/116172115963583202334</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://chrisghardwick.blogspot.com/2011/12/tf10121-path-is-not-found-or-not.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEYFQnY4eCp7ImA9WhZXFkQ.&quot;"><id>tag:blogger.com,1999:blog-1081905209486048806.post-3246006387652826913</id><published>2011-05-06T10:27:00.001-04:00</published><updated>2011-05-06T10:28:33.830-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-06T10:28:33.830-04:00</app:edited><title>Atlanta Coworking Facilities</title><content type="html">Thanks to Google, I was able to locate a website out there that lists all of the co-working facilities in the Atlanta area:&lt;br /&gt;http://wiki.coworking.info/w/page/16583399/CoworkingAtlanta&lt;br /&gt;&lt;br /&gt;I've contacted this one: The BOX : think inside here - 145 Church St. NE Suite 210, Marietta GA 30060. Planning on checking it out in the next couple of weeks!&lt;br /&gt;&lt;br /&gt;If your interested in co-working, check it out!&lt;br /&gt;&lt;br /&gt;Chris&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-3564483643582350";
/* 728x90, created 12/26/08 */
google_ad_slot = "8029697074";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1081905209486048806-3246006387652826913?l=chrisghardwick.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/uR5VJR5lrXFQ05wJoxwiAxPUa0Y/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uR5VJR5lrXFQ05wJoxwiAxPUa0Y/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/uR5VJR5lrXFQ05wJoxwiAxPUa0Y/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uR5VJR5lrXFQ05wJoxwiAxPUa0Y/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~4/iocViDLRr7Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://chrisghardwick.blogspot.com/feeds/3246006387652826913/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1081905209486048806&amp;postID=3246006387652826913" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/3246006387652826913?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/3246006387652826913?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~3/iocViDLRr7Y/atlanta-coworking-facilities.html" title="Atlanta Coworking Facilities" /><author><name>Christopher Hardwick</name><uri>https://profiles.google.com/116172115963583202334</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://chrisghardwick.blogspot.com/2011/05/atlanta-coworking-facilities.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04GQHg4fSp7ImA9WhZXFk0.&quot;"><id>tag:blogger.com,1999:blog-1081905209486048806.post-2189379184005281390</id><published>2011-05-05T10:30:00.000-04:00</published><updated>2011-05-05T10:32:01.635-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-05T10:32:01.635-04:00</app:edited><title>How to be an entrepreneur…with a job</title><content type="html">This is a great article. It defines quite a bit of the sentiment about the entrepreneurial spirit. &lt;br /&gt;&lt;br /&gt;http://jeffhilimire.com/2011/02/how-to-be-an-entrepreneur-with-a-job/&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-3564483643582350";
/* 728x90, created 12/26/08 */
google_ad_slot = "8029697074";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1081905209486048806-2189379184005281390?l=chrisghardwick.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/KAvedMOLWX6udepwI86J5AVD7gM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KAvedMOLWX6udepwI86J5AVD7gM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/KAvedMOLWX6udepwI86J5AVD7gM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KAvedMOLWX6udepwI86J5AVD7gM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~4/3_q8moyH-mk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://chrisghardwick.blogspot.com/feeds/2189379184005281390/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1081905209486048806&amp;postID=2189379184005281390" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/2189379184005281390?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1081905209486048806/posts/default/2189379184005281390?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Developer/ArchitectAndNotTheOtherWayAround/~3/3_q8moyH-mk/how-to-be-entrepreneurwith-job.html" title="How to be an entrepreneur…with a job" /><author><name>Christopher Hardwick</name><uri>https://profiles.google.com/116172115963583202334</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://chrisghardwick.blogspot.com/2011/05/how-to-be-entrepreneurwith-job.html</feedburner:origLink></entry></feed>

