<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Posts on Paul Hatcher</title>
		<link>https://blog.paulhatcher.com/post/</link>
		<description>Recent content in Posts on Paul Hatcher</description>
		<generator>Hugo</generator>
		<language>en</language>
		
		
		
		
			<lastBuildDate>Mon, 20 May 2024 09:00:00 +0000</lastBuildDate>
		
			<atom:link href="https://blog.paulhatcher.com/post/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>Locking manifests in Azure Container Registry</title>
				<link>https://blog.paulhatcher.com/2024/05/locking-manifests-in-azure-container-registry/</link>
				<pubDate>Mon, 20 May 2024 09:00:00 +0000</pubDate>
				<guid>https://blog.paulhatcher.com/2024/05/locking-manifests-in-azure-container-registry/</guid>
				<description>&lt;p&gt;So a consequence of wanting to purge images from your container registry is sometimes you need to keep some of them.&lt;/p&gt;&#xA;&lt;p&gt;One example is that in regulated industries you must be able to produce software that was deployed to production for audit/legal purposes, so if you are purging images that are over 3 months old you might have an issue.&lt;/p&gt;&#xA;&lt;p&gt;You can update an image so that it can&amp;rsquo;t be overridden or deleted via the &lt;code&gt;az acr repository update&lt;/code&gt; command e.g.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Purging manifests from Azure Container Registry</title>
				<link>https://blog.paulhatcher.com/2024/05/purging-manifests-from-azure-container-registry/</link>
				<pubDate>Sun, 19 May 2024 09:00:00 +0000</pubDate>
				<guid>https://blog.paulhatcher.com/2024/05/purging-manifests-from-azure-container-registry/</guid>
				<description>&lt;p&gt;One housekeeping task if you are producing docker images is clearing your container registry of old images.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve been particularly bad at this and had also made some mistakes such as publishing PR images and images produced via our auto-patching runs, leading to the ACR size being &amp;gt;1.2Tb (ouch!).&lt;/p&gt;&#xA;&lt;p&gt;There are some features introduced by &lt;a href=&#34;https://learn.microsoft.com/en-us/azure/container-registry/container-registry-auto-purge&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;acr auto purge&lt;/a&gt;, but I found an issue since my images typically have three tags&amp;hellip;&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Build number produced by Azure DevOps, needed as release pipelines can&amp;rsquo;t pass the version&lt;/li&gt;&#xA;&lt;li&gt;The git SHA1, easy tracing back to the source code rather than just the build&lt;/li&gt;&#xA;&lt;li&gt;Version number produced by gitversion (also on the source as a tag)&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;When I tried to remove an image via a tag, it removed the tag but not the manifest due to the other tags referencing it. The &lt;a href=&#34;https://learn.microsoft.com/en-us/azure/container-registry/container-registry-delete#delete-by-tag&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;documentation&lt;/a&gt; says that this should work, but it doesn&amp;rsquo;t appear to.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Wikiexport 0.4 Draft</title>
				<link>https://blog.paulhatcher.com/2024/02/wikiexport-0.4-draft/</link>
				<pubDate>Wed, 28 Feb 2024 17:00:00 +0000</pubDate>
				<guid>https://blog.paulhatcher.com/2024/02/wikiexport-0.4-draft/</guid>
				<description>&lt;p&gt;I have a draft updated &lt;a href=&#34;https://github.com/phatcher/wikiexport&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;WikiExport&lt;/a&gt; to NET 6/8 since NET 3.1 is EOL&lt;/p&gt;&#xA;&lt;p&gt;This release also has a couple of bug fixes&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/phatcher/wikiexport/issues/6&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Missing images causes export to fail&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/phatcher/wikiexport/issues/5&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Image paths not correct if no caption&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Have it as a beta release at the moment until a bit more operational testing has been done.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Wikiexport 0.3</title>
				<link>https://blog.paulhatcher.com/2022/01/wikiexport-0.3/</link>
				<pubDate>Sun, 23 Jan 2022 17:00:00 +0000</pubDate>
				<guid>https://blog.paulhatcher.com/2022/01/wikiexport-0.3/</guid>
				<description>&lt;p&gt;Just pushed a new version of &lt;a href=&#34;https://github.com/phatcher/wikiexport&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;WikiExport&lt;/a&gt; with a couple of useful features&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Change &lt;code&gt;titleFormat&lt;/code&gt; to have explicit &lt;code&gt;{project}&lt;/code&gt;/&lt;code&gt;{title}&lt;/code&gt; macros&lt;/li&gt;&#xA;&lt;li&gt;Support for .attachments in non-root folder - provided by &lt;a href=&#34;https://github.com/ricfre/wikiexport&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;@ricfre&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;The first is just a simplification since it&amp;rsquo;s more intentional to use named values rather than &lt;code&gt;{0}&lt;/code&gt; etc, and we can also automatically determine &lt;code&gt;projectInTitle&lt;/code&gt; from the &lt;code&gt;titleFormat&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The second one allows support for &lt;a href=&#34;https://docs.microsoft.com/en-us/azure/devops/project/wiki/publish-repo-to-wiki?view=azure-devops&amp;amp;tabs=browser&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;code wikis&lt;/a&gt; and the image path not being in the root of the repository e.g. the repository may look a bit like this&amp;hellip;&lt;/p&gt;</description>
			</item>
			<item>
				<title>Project Documentation from Azure DevOps Wikis</title>
				<link>https://blog.paulhatcher.com/2022/01/project-documentation-from-azure-devops-wikis/</link>
				<pubDate>Thu, 06 Jan 2022 09:00:00 +0000</pubDate>
				<guid>https://blog.paulhatcher.com/2022/01/project-documentation-from-azure-devops-wikis/</guid>
				<description>&lt;p&gt;One perennial issue when developing software is how to keep documentation up to date. For detailed documentation such as APIs this has become a lot easier in recent years with capabilities such as &lt;a href=&#34;https://docs.microsoft.com/en-us/aspnet/core/tutorials/getting-started-with-swashbuckle?view=aspnetcore-6.0&amp;amp;tabs=visual-studio&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Swashbuckle&lt;/a&gt; being able to pick up annotations directly from the code.&lt;/p&gt;&#xA;&lt;p&gt;The principal of keeping your documentation as close to the code as possible means that development teams are more likely to keep it up to date and relevant to the actual behaviour - presuming you are have a good &lt;a href=&#34;https://www.agilealliance.org/glossary/definition-of-done&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;definition of done&lt;/a&gt; and are performing code reviews &amp;#x1f609;.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Moved Blog to Hugo</title>
				<link>https://blog.paulhatcher.com/2021/12/moved-blog-to-hugo/</link>
				<pubDate>Fri, 31 Dec 2021 14:49:50 +0000</pubDate>
				<guid>https://blog.paulhatcher.com/2021/12/moved-blog-to-hugo/</guid>
				<description>&lt;p&gt;I need to resume my blog to talk about some projects I&amp;rsquo;ve been working on and I&amp;rsquo;ve migrated over to using &lt;a href=&#34;https://gohugo.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Hugo&lt;/a&gt; as the blogging platform from my old MiniBlog based solution. The main reasons are ease of writing since the content typically has some code in it, and with Hugo I can write in Markdown. Went relatively easily since I didn&amp;rsquo;t have that many posts to fix but did find some that had gone missing &amp;#x1f604;.&lt;/p&gt;</description>
			</item>
			<item>
				<title>NCheck V4</title>
				<link>https://blog.paulhatcher.com/2019/11/ncheck-v4/</link>
				<pubDate>Thu, 21 Nov 2019 19:30:00 +0000</pubDate>
				<guid>https://blog.paulhatcher.com/2019/11/ncheck-v4/</guid>
				<description>&lt;p&gt;I&amp;rsquo;ve released &lt;a href=&#34;https://www.nuget.org/packages/NCheck/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;NCheck V4&lt;/a&gt;, largely tidy up and removal of legacy code and changed the framework to support net472, net48 and netstandard2.0.&lt;/p&gt;&#xA;&lt;p&gt;The dictionary/list checking has been reworked as well so we can get per-element reporting e.g. if we look at the list test fixture we can see which elements are not in alignment,&lt;/p&gt;&#xA;&lt;p&gt;We now get error messages like this&amp;hellip;&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;SampleList.Children&#xA;Count: Expected:&amp;lt;3&amp;gt;. Actual:&amp;lt;2&amp;gt;&#xA;[1].Id: Expected:&amp;lt;2&amp;gt;. Actual:&amp;lt;4&amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Useful when you have more than a couple of items in the list.&lt;/p&gt;</description>
			</item>
			<item>
				<title>NCheck V3</title>
				<link>https://blog.paulhatcher.com/2018/05/ncheck-v3/</link>
				<pubDate>Thu, 10 May 2018 19:30:00 +0000</pubDate>
				<guid>https://blog.paulhatcher.com/2018/05/ncheck-v3/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;https://www.nuget.org/packages/NCheck/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;NCheck V3&lt;/a&gt;, has just been released, not much change but it does now support net35, net452, net462 and netstandard1.5 and above.&lt;/p&gt;</description>
			</item>
			<item>
				<title>OData Delta Patch Security</title>
				<link>https://blog.paulhatcher.com/2018/01/odata-delta-patch-security/</link>
				<pubDate>Fri, 05 Jan 2018 19:30:00 +0000</pubDate>
				<guid>https://blog.paulhatcher.com/2018/01/odata-delta-patch-security/</guid>
				<description>&lt;p&gt;My main project is using OData a lot and one of the requirements was to ensure that certain properties should not be updatable via PATCH - this is to ensure the integrity of the object e.g. audit fields should not be changeable post-hoc.&lt;/p&gt;&#xA;&lt;p&gt;There&amp;rsquo;s a couple of possibilities, depending on your use case&amp;hellip;&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;You want to exclude the changes if they are supplied&lt;/li&gt;&#xA;&lt;li&gt;You want to throw an error if non-editable fields are updated.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;The way we approached this was to start with an attribute&lt;/p&gt;</description>
			</item>
			<item>
				<title>Meerkat NameParser</title>
				<link>https://blog.paulhatcher.com/2017/04/meerkat-nameparser/</link>
				<pubDate>Tue, 11 Apr 2017 19:30:00 +0000</pubDate>
				<guid>https://blog.paulhatcher.com/2017/04/meerkat-nameparser/</guid>
				<description>&lt;p&gt;I&amp;rsquo;ve released a little project &lt;a href=&#34;https://www.nuget.org/packages/Meerkat.NameParser/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Meerkat.NameParser&lt;/a&gt; which assists in splitting up personal names into their component parts.&lt;/p&gt;&#xA;&lt;p&gt;This code has been around in one form or another since around 1988 when I wrote the first version in Informix 4GL as part of a project for a client. Subsequent versions were written in Clipper, Visual Basic and this one in C#.&lt;/p&gt;&#xA;&lt;p&gt;It&amp;rsquo;s not perfect by any means but on projects I&amp;rsquo;ve used it on we were getting error rates of ~2 per 100K.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Dependency Injection For SpecFlow With Unity 4</title>
				<link>https://blog.paulhatcher.com/2016/11/dependency-injection-for-specflow-with-unity-4/</link>
				<pubDate>Fri, 11 Nov 2016 12:56:00 +0000</pubDate>
				<guid>https://blog.paulhatcher.com/2016/11/dependency-injection-for-specflow-with-unity-4/</guid>
				<description>&lt;p&gt;One of my current projects is using SpecFlow for testing some complex security logic; there are lots of scenarios so the BDD style of testing is well suited to the problem. I wanted to use the same style of testing for some integration testing where the client is talking to my API but hit a problem of how/where to construct the container as even the client library uses dependency injection to construct itself.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Unauthenticated users in Meerkat.Security</title>
				<link>https://blog.paulhatcher.com/2016/09/unauthenticated-users-in-meerkat.security/</link>
				<pubDate>Tue, 20 Sep 2016 14:00:00 +0000</pubDate>
				<guid>https://blog.paulhatcher.com/2016/09/unauthenticated-users-in-meerkat.security/</guid>
				<description>&lt;p&gt;Couple of changes released today, one to &lt;a href=&#34;https://github.com/phatcher/Meerkat.Security&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Meerkat.Security&lt;/a&gt; and the other to &lt;a href=&#34;https://github.com/phatcher/Meerkat.Caching&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Meerkat.Caching&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The first was to introduce handling for grant/deny of actions for unauthenticated users. I’d missed this use case before as to date, the project was just used in a corporate Windows environment and so everyone was authenticated by the time we saw them.&lt;/p&gt;&#xA;&lt;p&gt;As I’m now working on a project using &lt;a href=&#34;https://azure.microsoft.com/en-gb/services/active-directory-b2c/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Azure B2C Active Directory&lt;/a&gt; we are now back to the point where users need to authenticate, so you want to filter the actions they can see/perform before and after they authenticate, e.g. you want to allow unauthenticated users access to Home.Index and error pages but probably not much more, and as the principle of the project was to centralize the security checking, we need a way to allow unauthenticated users without using AllowAnonymous on the controller action.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Publishing a different branch to Azure WebSites</title>
				<link>https://blog.paulhatcher.com/2016/09/publishing-a-different-branch-to-azure-websites/</link>
				<pubDate>Fri, 09 Sep 2016 11:00:00 +0000</pubDate>
				<guid>https://blog.paulhatcher.com/2016/09/publishing-a-different-branch-to-azure-websites/</guid>
				<description>&lt;p&gt;I’ve just started blogging again and decided to adopt &lt;a href=&#34;https://github.com/madskristensen/MiniBlog&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;MiniBlog&lt;/a&gt;, a minimal modern blog engine written by Mads Kristensen who also wrote BlogEngine.NET, as SubText has died.&lt;/p&gt;&#xA;&lt;p&gt;It only has a small set of features and Mads intends to keep it like this, the concept is that you make your own fork on GitHub, adding the features you want and publish from there; this has a few consequences…&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Your blog credentials are visible in your GitHub fork&lt;/li&gt;&#xA;&lt;li&gt;Potentially your content is there as well&lt;/li&gt;&#xA;&lt;li&gt;How to test out new features written by yourself and/or from other forks.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;I decided on a three branch strategy&lt;/p&gt;</description>
			</item>
			<item>
				<title>Securing WebAPI with HMAC - Protocol</title>
				<link>https://blog.paulhatcher.com/2016/04/securing-webapi-with-hmac-protocol/</link>
				<pubDate>Wed, 20 Apr 2016 14:00:00 +0000</pubDate>
				<guid>https://blog.paulhatcher.com/2016/04/securing-webapi-with-hmac-protocol/</guid>
				<description>&lt;p&gt;I&amp;rsquo;m working on a project where we are using &lt;a href=&#34;https://azure.microsoft.com/en-gb/services/active-directory-b2c/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Azure B2C Active Directory&lt;/a&gt;&#xA;to provide authentication so that we can avoid the security headaches associated with managing a password store for it.&lt;/p&gt;&#xA;&lt;p&gt;Unfortunately, the current implementation doesn&amp;rsquo;t support .NET Windows applications or standalone services where no user-interface&#xA;is present - it will eventually, but I can&amp;rsquo;t wait on the eventual delivery date for these two use-cases.  I don&amp;rsquo;t want to re-introduce&#xA;user name/password for this, as I&amp;rsquo;d introduce the same security issues that I was trying to avoid in the first place, but following a&#xA;bit of research I decided the way forward was &lt;a href=&#34;https://en.wikipedia.org/wiki/Hash-based_message_authentication_code&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;HMAC authentication&lt;/a&gt;.&lt;/p&gt;</description>
			</item>
			<item>
				<title>NCheck V2.3</title>
				<link>https://blog.paulhatcher.com/2015/05/ncheck-v2.3/</link>
				<pubDate>Fri, 29 May 2015 19:30:00 +0000</pubDate>
				<guid>https://blog.paulhatcher.com/2015/05/ncheck-v2.3/</guid>
				<description>&lt;p&gt;Updated &lt;a href=&#34;https://www.nuget.org/packages/NCheck/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;NCheck&lt;/a&gt;, my test object comparison helper, to version 2.3 which&amp;hellip;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Introduces a new technique to wire up conventions&lt;/li&gt;&#xA;&lt;li&gt;Supports multi-threading e.g. test fixtures using NUnit Parallelizable&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;customizing-the-checkerfactory&#34;&gt;Customizing the CheckerFactory&lt;/h3&gt;&#xA;&lt;p&gt;The &lt;code&gt;CheckerFactory&lt;/code&gt; has a number conventions which are used to automatically construct Checkers for each class; these conventions can be overridden by the developer if they don&amp;rsquo;t suit a particular scenario.&lt;/p&gt;&#xA;&lt;p&gt;We support&amp;hellip;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Type conventions: Applied to all instances of a particular type&lt;/li&gt;&#xA;&lt;li&gt;Property conventions: Applied to properties which satisfy a function e.g. matching a particular name&lt;/li&gt;&#xA;&lt;li&gt;Comparer conventions: Operates on a type or property convention and changes Value comparison from object.Equals to a specified comparer; useful for values such putting error bound on floating point comparison.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;The suggested technique for this is to introduce an extension class to hold the factory methods&lt;/p&gt;</description>
			</item>
			<item>
				<title>NCheck V2.2</title>
				<link>https://blog.paulhatcher.com/2015/05/ncheck-v2.2/</link>
				<pubDate>Thu, 28 May 2015 19:30:00 +0000</pubDate>
				<guid>https://blog.paulhatcher.com/2015/05/ncheck-v2.2/</guid>
				<description>&lt;p&gt;Updated &lt;a href=&#34;https://www.nuget.org/packages/NCheck/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;NCheck&lt;/a&gt;, my test object comparison helper, to version 2.2 which extends &lt;code&gt;ICheckerFactory&lt;/code&gt; to support &lt;code&gt;Compare&amp;lt;T&amp;gt;&lt;/code&gt; - this allows us to override checkers on a per-test basis which I&amp;rsquo;ve found useful on some of my current projects.&lt;/p&gt;&#xA;&lt;h3 id=&#34;customizing-the-checkerfactory&#34;&gt;Customizing the CheckerFactory&lt;/h3&gt;&#xA;&lt;p&gt;The &lt;code&gt;CheckerFactory&lt;/code&gt; has a number conventions which are used to automatically construct Checkers for each class; these conventions can be overridden by the developer if they don&amp;rsquo;t suit a particular scenario.&lt;/p&gt;</description>
			</item>
			<item>
				<title>NCheck V2</title>
				<link>https://blog.paulhatcher.com/2014/06/ncheck-v2/</link>
				<pubDate>Sun, 29 Jun 2014 19:30:00 +0000</pubDate>
				<guid>https://blog.paulhatcher.com/2014/06/ncheck-v2/</guid>
				<description>&lt;p&gt;Just release V2 of &lt;a href=&#34;https://www.nuget.org/packages/NCheck/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;NCheck&lt;/a&gt;, my test object comparison helper which tidies up a few&#xA;things that simplify custom comparisons and excluding properties.&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Reworked the &lt;code&gt;ITypeCompareTargter&lt;/code&gt;/&lt;code&gt;IPropertyCompareTargeter&lt;/code&gt; into a more generic &lt;code&gt;IConvention&amp;lt;Source, Target&amp;gt;&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Introduced custom comparers and use convention-based registration for them.&lt;/li&gt;&#xA;&lt;li&gt;Retired Exclude, you can now use &lt;code&gt;Compare(x =&amp;gt; x.PropertyName).Ignore&lt;/code&gt;, unifies the syntax compared to other options.&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
			</item>
			<item>
				<title>NCheck: A object comparison helper</title>
				<link>https://blog.paulhatcher.com/2014/04/ncheck-a-object-comparison-helper/</link>
				<pubDate>Wed, 16 Apr 2014 19:30:00 +0000</pubDate>
				<guid>https://blog.paulhatcher.com/2014/04/ncheck-a-object-comparison-helper/</guid>
				<description>&lt;p&gt;With unit testing one of the precepts is to check one thing in your test, but when you have objects this is difficult to express, since you want to check that the your business process has updated all of the expected properties (positive testing) and also that has not modified things that are not expected to have changed (negative testing).&lt;/p&gt;&#xA;&lt;p&gt;This becomes even more problematic when you have an object graph, e.g. Order –&amp;gt; OrderLine –&amp;gt; Product where you have to navigate the graph, and reporting accurately where any errors is also a major issue as you need to track property names, collection indexes, etc. etc.&lt;/p&gt;</description>
			</item>
			<item>
				<title>CsvReader now on GitHub</title>
				<link>https://blog.paulhatcher.com/2014/02/csvreader-now-on-github/</link>
				<pubDate>Sun, 16 Feb 2014 14:00:00 +0000</pubDate>
				<guid>https://blog.paulhatcher.com/2014/02/csvreader-now-on-github/</guid>
				<description>&lt;p&gt;A number of years ago Sebastien Lorion wrote a very good CSV parser for .NET with the code and an accompanying article on Code Project - &lt;a href=&#34;http://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader%22&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;A Fast CSV Reader&lt;/a&gt;.  I’d used this in a number of projects but recently I needed to make some changes to the code for my trading system project, and there wasn’t a public repository available; there’s a version on NuGet but it doesn’t point back to the source.&lt;/p&gt;</description>
			</item>
			<item>
				<title>MVC Areas Anti-Pattern</title>
				<link>https://blog.paulhatcher.com/2010/09/mvc-areas-anti-pattern/</link>
				<pubDate>Wed, 08 Sep 2010 22:35:54 +0000</pubDate>
				<guid>https://blog.paulhatcher.com/2010/09/mvc-areas-anti-pattern/</guid>
				<description>&lt;p&gt;I was working on the design of a small site where we have public display of information in one format and a set of administrative screens that allow authorised users to create and edit the information.&lt;/p&gt;&#xA;&lt;p&gt;“I know”, I thought, “this is a perfect case for MVC Areas” – and boy was I wrong!&#xA;I should have realised that the problems had started when all the routing started playing up..&lt;/p&gt;</description>
			</item>
			<item>
				<title>Route Testing and MVC 2.0 Areas</title>
				<link>https://blog.paulhatcher.com/2010/09/route-testing-and-mvc-2.0-areas/</link>
				<pubDate>Sun, 05 Sep 2010 18:12:31 +0000</pubDate>
				<guid>https://blog.paulhatcher.com/2010/09/route-testing-and-mvc-2.0-areas/</guid>
				<description>&lt;p&gt;I’ve been using the MvcContrib.TestHelper class for a while now to get rather nice fluent testing of the routes in my MVC applications.&lt;/p&gt;&#xA;&lt;p&gt;A typical test class would look like this&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;CategoryRoutesFixture&lt;/span&gt; : RoutesFixture&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; categoryId = &lt;span style=&#34;color:#ae81ff&#34;&gt;34&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt; BaseUrl&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;get&lt;/span&gt; { &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;~/admin/Category&amp;#34;&lt;/span&gt;; }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;    [Test]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; Index()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        BaseUrl.ShouldMapTo&amp;amp;amp;lt;CategoryController&amp;amp;amp;gt;(x =&amp;amp;amp;gt; x.Index());&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;    [Test]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; Create()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (BaseUrl + &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/create&amp;#34;&lt;/span&gt;).ShouldMapTo&amp;amp;amp;lt;CategoryController&amp;amp;amp;gt;(x =&amp;amp;amp;gt; x.Create());&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;    [Test]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; Show()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (BaseUrl + &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt; + categoryId).ShouldMapTo&amp;amp;amp;lt;CategoryController&amp;amp;amp;gt;(x =&amp;amp;amp;gt; x.Show(categoryId));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;    [Test]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; Edit()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (BaseUrl + &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;.Format(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/{0}/edit&amp;#34;&lt;/span&gt;, categoryId)).ShouldMapTo&amp;amp;amp;lt;CategoryController&amp;amp;amp;gt;(x =&amp;amp;amp;gt; x.Edit(categoryId));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The base class just takes care of initialising the routes collection from the MvcApplication.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Algorithm Performance</title>
				<link>https://blog.paulhatcher.com/2010/07/algorithm-performance/</link>
				<pubDate>Thu, 01 Jul 2010 18:20:24 +0000</pubDate>
				<guid>https://blog.paulhatcher.com/2010/07/algorithm-performance/</guid>
				<description>&lt;p&gt;I was chatting to a colleague recently who although he was a very good programmer, did not have a computer science/maths background – this was fine until he wanted to use bubble sort on a large(ish) (100k) number of records and I had to explain to him about how algorithms that take n&lt;sup&gt;2&lt;/sup&gt; time are not your friend for big (or even little) n.&lt;/p&gt;&#xA;&lt;p&gt;One of the most important decisions you can make when optimizing an application is the up-front choice of algorithm to use, performance tuning and optimization can make a difference but you are very lucky to achieve 2x-5x improvement, to be able to make 10x or 100x improvement in your application you need decent algorithm choice.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Automating Visual Studio Templates</title>
				<link>https://blog.paulhatcher.com/2010/06/automating-visual-studio-templates/</link>
				<pubDate>Mon, 28 Jun 2010 21:17:01 +0000</pubDate>
				<guid>https://blog.paulhatcher.com/2010/06/automating-visual-studio-templates/</guid>
				<description>&lt;p&gt;I find Visual Studio Item Templates very useful, but a lot of teams I encounter haven’t really adopted them as they can be a pain to construct. Here’s the technique I use to manage the templates and make it painless to add new ones and modify existing templates if they need to change. What we do is put the templates into source control and then use a build process to automate the production and distribution of the zip files.&lt;/p&gt;</description>
			</item>
			<item>
				<title>MVC 2 EditorForModel and DropDownList</title>
				<link>https://blog.paulhatcher.com/2010/06/mvc-2-editorformodel-and-dropdownlist/</link>
				<pubDate>Mon, 28 Jun 2010 19:44:29 +0000</pubDate>
				<guid>https://blog.paulhatcher.com/2010/06/mvc-2-editorformodel-and-dropdownlist/</guid>
				<description>&lt;p&gt;Sometimes doing very basic things can be quite tricky in new technologies; case in point presenting a DropDownList (a ComboBox to those, including me, with a VB background) using the new EditorForModel syntax in ASP.NET MVC 2.&lt;/p&gt;&#xA;&lt;p&gt;I had a little class in my MVP framework called &lt;code&gt;IdLabel&lt;/code&gt; which as the name implied just held an Id and a Label so that I wasn’t forced to have a separate display and edit model for every trivial case, so I wanted to do the same sort of thing when writing my shiny new MVC apps. There’s a class called &lt;code&gt;SelectListItem&lt;/code&gt; which fits the bill, but unfortunately a decision late in the MVC 2 Beta meant that by default, the object display/edit templates will not process anything other than basic types.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Debugging ASP.NET MVC 2 Source Code</title>
				<link>https://blog.paulhatcher.com/2010/06/debugging-asp.net-mvc-2-source-code/</link>
				<pubDate>Sun, 27 Jun 2010 14:53:42 +0000</pubDate>
				<guid>https://blog.paulhatcher.com/2010/06/debugging-asp.net-mvc-2-source-code/</guid>
				<description>&lt;p&gt;I&amp;rsquo;m trying to write some templates for MVC 2 and one of the most useful things I&amp;rsquo;ve found is being able to step into the source code and see how it is actually interpreting what you&amp;rsquo;ve written.&lt;/p&gt;&#xA;&lt;p&gt;It&amp;rsquo;s easy enough to acquire the &lt;a href=&#34;http://aspnet.codeplex.com/releases/view/41742&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;source&lt;/a&gt;, but what you might not have done before is set up a symbol server. A symbol server is a location that the Windows and Visual Studio debugging tools can use to obtain pdb files, so that you can debug almost anything, including drivers and the operating system!&lt;/p&gt;</description>
			</item>
			<item>
				<title>Four things you need to know about Recaptcha</title>
				<link>https://blog.paulhatcher.com/2010/06/four-things-you-need-to-know-about-recaptcha/</link>
				<pubDate>Sat, 26 Jun 2010 10:02:40 +0000</pubDate>
				<guid>https://blog.paulhatcher.com/2010/06/four-things-you-need-to-know-about-recaptcha/</guid>
				<description>&lt;p&gt;Working on a project where we needed a (slight) proof of humanness, and we opted to use Recaptcha as it has a fairly simple integration with .NET.&lt;/p&gt;&#xA;&lt;p&gt;Was fine until we wanted to use custom styling to tie in with the site which is when the fun started! A few hours later, after downloading the project&amp;rsquo;s sample app, I found some things out that I thought I&amp;rsquo;d share with you&amp;hellip;&lt;/p&gt;</description>
			</item>
			<item>
				<title>Subversion Upgrade and svn:externals changes</title>
				<link>https://blog.paulhatcher.com/2010/03/subversion-upgrade-and-svnexternals-changes/</link>
				<pubDate>Tue, 23 Mar 2010 23:23:22 +0000</pubDate>
				<guid>https://blog.paulhatcher.com/2010/03/subversion-upgrade-and-svnexternals-changes/</guid>
				<description>&lt;p&gt;I&amp;rsquo;m just in the process of restructuring my source control environment, splitting the single subversion repository into multiple repositories.&lt;/p&gt;&#xA;&lt;p&gt;Couple of reasons for this..&lt;/p&gt;&#xA;&lt;p&gt;My repository is getting a bit big at 1.5Gb a big chunk of this are binary files produced by my continuous integration process, so I want to break this out to a dedicated repository.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;d also like to put each client&amp;rsquo;s work into a separate repository, this makes it easier to archive off and/or remove it at the end of a project as there&amp;rsquo;s no way to delete files from a repository apart from dumping it and filtering it into a new one.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Quality Myths</title>
				<link>https://blog.paulhatcher.com/2009/10/quality-myths/</link>
				<pubDate>Fri, 09 Oct 2009 13:44:31 +0000</pubDate>
				<guid>https://blog.paulhatcher.com/2009/10/quality-myths/</guid>
				<description>&lt;p&gt;Microsoft has &lt;a href=&#34;http://research.microsoft.com/en-us/news/features/nagappan-100609.aspx&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;published&lt;/a&gt; the results of some empirical studies about how development practices affect quality&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Test Driven Development improves quality by 60 to 90 percent but takes 15 to 35 percent more ‘up front’ time. The time spent is compensated by savings in maintenance time later on.&lt;/li&gt;&#xA;&lt;li&gt;Team &amp;amp; organization structure has a huge impact on quality. Although this is conventional wisdom the study publishes figures to prove this. The metrics used data such as how many engineers are involved in a project, how many times individual source files were modified.&lt;/li&gt;&#xA;&lt;li&gt;Code coverage in tests must be used intelligently, and has less overall impact than other factors.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Another &lt;a href=&#34;http://research.microsoft.com/en-us/projects/esm/nagappan_tdd.pdf&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;paper&lt;/a&gt; highlights the issues of not running the unit tests&amp;hellip;.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Windows 7</title>
				<link>https://blog.paulhatcher.com/2009/10/windows-7/</link>
				<pubDate>Sun, 04 Oct 2009 13:09:38 +0000</pubDate>
				<guid>https://blog.paulhatcher.com/2009/10/windows-7/</guid>
				<description>&lt;p&gt;Decided to take the plunge on Windows 7, as a test I&amp;rsquo;ve installed in on my wife&amp;rsquo;s netbook (Samsung NC20) and if anything it&amp;rsquo;s more responsive than under Windows XP.&lt;/p&gt;&#xA;&lt;p&gt;Next decision is whether to go the whole hog and install the 64-bit version; the machine is fairly new, a Dell Precision 690, and I like the idea of having &amp;gt;4Gb of RAM for some of the projects I&amp;rsquo;m working on when I might have three copies of VS 2008 open at the same time.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Swine Flu</title>
				<link>https://blog.paulhatcher.com/2009/10/swine-flu/</link>
				<pubDate>Sat, 03 Oct 2009 13:15:48 +0000</pubDate>
				<guid>https://blog.paulhatcher.com/2009/10/swine-flu/</guid>
				<description>&lt;p&gt;Just recovering from flu at the moment and I&amp;rsquo;m an official Swine Flu statistic.&lt;/p&gt;&#xA;&lt;p&gt;Not the nicest of bugs, couldn&amp;rsquo;t keep any food down until the anti-virals kicked in but the funniest thing about the whole episode is the screening questionnaire to see if you qualify for the Tamiflu.&lt;/p&gt;&#xA;&lt;p&gt;First question is whether you are enquiring on behalf of yourself or someone else, on being told I that I was asking for myself the call centre staff (apologetically) asked&lt;/p&gt;</description>
			</item>
			<item>
				<title>Project Structure</title>
				<link>https://blog.paulhatcher.com/2009/08/project-structure/</link>
				<pubDate>Thu, 27 Aug 2009 22:57:34 +0000</pubDate>
				<guid>https://blog.paulhatcher.com/2009/08/project-structure/</guid>
				<description>&lt;p&gt;I try to keep the same project structure for all projects, this makes it easy when initiating new projects as you can automate the creation of the core project structure.&lt;/p&gt;&#xA;&lt;p&gt;We have the usual subversion branches/tags/trunk structure and then within trunk we have&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;builds : Contains all continuous integration build files for the project.&lt;/li&gt;&#xA;&lt;li&gt;code : All the code for the project, flat directory structure internally with one project per directory.&lt;/li&gt;&#xA;&lt;li&gt;database: Database structure, produced using the Red Gate schema compare tool&lt;/li&gt;&#xA;&lt;li&gt;docs: Documentation source and any other project documentation&lt;/li&gt;&#xA;&lt;li&gt;lib: Holds the library files for the project, typically referenced via svn:externals but might really be here if only used by one project.&lt;/li&gt;&#xA;&lt;li&gt;model: Location of any models, I generally use Enterprise Architect for UML modelling so the files go here.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;I&amp;rsquo;ll explain about the builds directory a bit more in the post about continuous integration, but the reason it is here physically is that then keeps &lt;strong&gt;everything&lt;/strong&gt; about the project in one location rather than some bits being held by the CI project.&lt;/p&gt;</description>
			</item>
			<item>
				<title>NHibernate Search 2.0 on its way...</title>
				<link>https://blog.paulhatcher.com/2009/08/nhibernate-search-2.0-on-its-way.../</link>
				<pubDate>Wed, 05 Aug 2009 11:40:00 +0000</pubDate>
				<guid>https://blog.paulhatcher.com/2009/08/nhibernate-search-2.0-on-its-way.../</guid>
				<description>&lt;p&gt;Finally had sometime to progress the port of Hibernate Search&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;We are intending to be feature complete with Hibernate Search 3.0.1 GA and at the moment I would say that we have ported about 80% of the code.&lt;/p&gt;&#xA;&lt;p&gt;I have also updated the libraries so that we are using Lucene 2.3.1 and NHibernate 2.1&lt;/p&gt;</description>
			</item>
			<item>
				<title>Frictionless Development Environment</title>
				<link>https://blog.paulhatcher.com/2009/08/frictionless-development-environment/</link>
				<pubDate>Mon, 03 Aug 2009 12:24:26 +0000</pubDate>
				<guid>https://blog.paulhatcher.com/2009/08/frictionless-development-environment/</guid>
				<description>&lt;p&gt;One of the things I&amp;rsquo;ve been working on over the last couple of years for myself and for clients, is making the development environment as frictionless as possible. By this I mean removing all the little annoyances that get in the way of producing good quality software.&lt;/p&gt;&#xA;&lt;p&gt;This guiding idea has led me to one guiding principal: keep everything under source control!&lt;/p&gt;&#xA;&lt;p&gt;For example, one classic problem I&amp;rsquo;ve encountered is that the build works on the developer&amp;rsquo;s workstation but not on the build server or vice versa. To solve this, we now put all of our tools, excluding Visual Studio, under source control, this minimizes the differences between the developers&amp;rsquo; machines and build environment.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Lazy Programming</title>
				<link>https://blog.paulhatcher.com/2009/08/lazy-programming/</link>
				<pubDate>Sun, 02 Aug 2009 12:19:44 +0000</pubDate>
				<guid>https://blog.paulhatcher.com/2009/08/lazy-programming/</guid>
				<description>&lt;p&gt;No this isn&amp;rsquo;t about how Haskell evaluates stuff, but how people design and write code.&lt;/p&gt;&#xA;&lt;p&gt;There&amp;rsquo;s a mobile phone ad showing in the UK at the moment about how it&amp;rsquo;s the impatient people that drive towards new innovation and in software at least I strongly disagree.&lt;/p&gt;&#xA;&lt;p&gt;On the contrary, lazy programmers rule. I&amp;rsquo;m a lazy programmer, I can&amp;rsquo;t bear writing the same code more than a couple of times and when I recognise the second instance I refactor it into a function. Why - basically its about how to keep the essential stuff in your head and good use of patterns.&lt;/p&gt;</description>
			</item>
			<item>
				<title>My Development Environment</title>
				<link>https://blog.paulhatcher.com/2009/07/my-development-environment/</link>
				<pubDate>Tue, 28 Jul 2009 22:40:42 +0000</pubDate>
				<guid>https://blog.paulhatcher.com/2009/07/my-development-environment/</guid>
				<description>&lt;p&gt;One of the reasons I started this blog was to write down some of the stuff I&amp;rsquo;ve learnt over the past couple of years on how to structure my development environment so that it&amp;rsquo;s easy to use and ties in nicely with things like continuous integration and automated testing.&lt;/p&gt;&#xA;&lt;p&gt;So this is sort of a &amp;ldquo;head-up&amp;rdquo; of the topics I think I will be covering over the coming weeks..&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Tools choice&lt;/li&gt;&#xA;&lt;li&gt;Source control&lt;/li&gt;&#xA;&lt;li&gt;Project structure&lt;/li&gt;&#xA;&lt;li&gt;Binary dependencies&lt;/li&gt;&#xA;&lt;li&gt;Continuous Integration&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;It won&amp;rsquo;t necessarily be in this order and I may throw some other stuff in if I find the inspiration&lt;/p&gt;</description>
			</item>
			<item>
				<title>Welcome</title>
				<link>https://blog.paulhatcher.com/2009/07/welcome/</link>
				<pubDate>Sun, 26 Jul 2009 22:36:42 +0000</pubDate>
				<guid>https://blog.paulhatcher.com/2009/07/welcome/</guid>
				<description>&lt;p&gt;Well I finally gave in and joined the blogging community.&lt;/p&gt;&#xA;&lt;p&gt;This will be a general rant on technology, running a small software consultancy business and anything else that takes my fancy.&lt;/p&gt;&#xA;&lt;p&gt;To give you all a bit of background I&amp;rsquo;ve been writing software for about 30 years now, having started on a mixture of home built (anyone remember the Tangerine MicroTan 65?) and early home computers including the Commodore Pet, Amstrad 1512, BBC Micro and Atari 1040ST.&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
