<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Alastair&#39;s Blog</title>
    <link>https://alastaircrabtree.com/</link>
    <description>Recent content on Alastair&#39;s Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-gb</language>
    <lastBuildDate>Mon, 22 Jul 2024 15:50:03 +0000</lastBuildDate>
    <atom:link href="https://alastaircrabtree.com/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>One click deploy between multiple environments using GitHub Actions</title>
      <link>https://alastaircrabtree.com/posts/one-click-deploys-to-multiple-environments-using-github-actions/</link>
      <pubDate>Mon, 22 Jul 2024 15:50:03 +0000</pubDate>
      <guid>https://alastaircrabtree.com/posts/one-click-deploys-to-multiple-environments-using-github-actions/</guid>
      <description>An example Actions workflow thet shows how to deploy to a test environment on every commit, and then give you a button to push to promote it into a production environment, with different variables in each environment</description>
    </item>
    <item>
      <title>Migrating the blog from Ghost(Pro) to Hugo and Cloudflare</title>
      <link>https://alastaircrabtree.com/posts/migrating-from-ghost-pro-to-hugo-and-cloudflare/</link>
      <pubDate>Wed, 03 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://alastaircrabtree.com/posts/migrating-from-ghost-pro-to-hugo-and-cloudflare/</guid>
      <description>How did I migrate this blog from fully featured open source CMS Ghost to a static site using Hugo (and save some cash in the process)?</description>
    </item>
    <item>
      <title>Absolute cache expiry corrupts absolutely?</title>
      <link>https://alastaircrabtree.com/posts/absolute-cache-expiry-corrupts-absolutely/</link>
      <pubDate>Fri, 12 Jul 2019 14:29:47 +0000</pubDate>
      <guid>https://alastaircrabtree.com/posts/absolute-cache-expiry-corrupts-absolutely/</guid>
      <description>Should you specify absolute expiry of a cache item from the current time or from the current time in the UTC time zone? The answer may not be what you expect.</description>
    </item>
    <item>
      <title>LazyCache 2.0 released</title>
      <link>https://alastaircrabtree.com/posts/lazycache-2-0-released/</link>
      <pubDate>Fri, 22 Mar 2019 00:05:46 +0000</pubDate>
      <guid>https://alastaircrabtree.com/posts/lazycache-2-0-released/</guid>
      <description>LazyCache is a library that makes it easy for developers to add in-memory caching to dotnet apps. Version 2 is a major rewrite to change from the .Net Framework 4.5 to Netstandard 2.0, and is now available from nuget.org/packages/LazyCache.
Getting started Install from nuget:
dotnet add package LazyCache --version 2.0.0 And then cache object that are slow or expensive to produce:
IAppCache cache = new CachingService(); Func&amp;lt;ComplexObjects&amp;gt; complexObjectFactory = () =&amp;gt; methodThatTakesTimeOrResources(); ComplexObjects cachedResults = cache.</description>
    </item>
    <item>
      <title>Logging with output in Unit Tests in .Net Core 2.0</title>
      <link>https://alastaircrabtree.com/posts/using-logging-in-unit-tests-in-net-core/</link>
      <pubDate>Wed, 21 Feb 2018 18:34:57 +0000</pubDate>
      <guid>https://alastaircrabtree.com/posts/using-logging-in-unit-tests-in-net-core/</guid>
      <description>If you use logging in your application code (and you should) then it would be nice if all that logging info appeared in your unit tests. If you use dotnet core and the default Microsoft.Extensions.Logging then logs will not automatically appear.
Unfortunately the default Debug and Console loggers in the Microsoft.Extensions.Logging family do not flush to standard out quick enough for test frameworks like NUnit to pick up the output because they flush on a background thread for performance.</description>
    </item>
    <item>
      <title>Keeping Visual Studio 2017 build tools up to date</title>
      <link>https://alastaircrabtree.com/posts/keeping-visual-studio-2017-build-tools-up-to-date/</link>
      <pubDate>Fri, 02 Feb 2018 19:20:01 +0000</pubDate>
      <guid>https://alastaircrabtree.com/posts/keeping-visual-studio-2017-build-tools-up-to-date/</guid>
      <description>If you have to maintain a farm of build servers it can be a pain to keep them updated will the latest versions of all the tools needed, and if you have a few servers you will have scripts to automate this. Normally chocolatey does a great job of this for me, however scripted update of VS build tools using chocolatey does not seem to work. The MS installer cli docs for this stuff are fairly comprehensive, but lacking coverage of just the build tool update scenario at the moment.</description>
    </item>
    <item>
      <title>Stubbing your way to automated end to end testing in an API first world</title>
      <link>https://alastaircrabtree.com/posts/stubbing-your-way-to-automated-e2e-testing-api-first-with-wiremock/</link>
      <pubDate>Mon, 04 Dec 2017 22:15:52 +0000</pubDate>
      <guid>https://alastaircrabtree.com/posts/stubbing-your-way-to-automated-e2e-testing-api-first-with-wiremock/</guid>
      <description>Building high quality end to end acceptance tests suites is hard, and creating API stubs (aka mock servers) can be surprisingly time consuming. WireMock.net can help speed this up.
E2E testing is hard End to end testing is hard for many reasons, but I think one of the most common is that the developers under estimate how much time to allow for it and then rush the job. Most E2E test harnesess I have worked on, (including several I wrote myself!</description>
    </item>
    <item>
      <title>How to find latest version of MsBuild in powershell</title>
      <link>https://alastaircrabtree.com/posts/how-to-find-latest-version-of-msbuild-in-powershell/</link>
      <pubDate>Tue, 19 Sep 2017 16:01:24 +0000</pubDate>
      <guid>https://alastaircrabtree.com/posts/how-to-find-latest-version-of-msbuild-in-powershell/</guid>
      <description>Build scripts for .net are always a bit painful, and Microsoft has not made it easy over the years as every release they change the paths. For 2017 it is even worse and it depends on the edition so they want you to use vswhere.exe to locate the installed version(s) of msbuild.
I find the following bit of Powershell to be far more portable and reliable.
Function Find-MsBuild([int] $MaxVersion = 2017) { $agentPath = &amp;#34;$Env:programfiles (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.</description>
    </item>
    <item>
      <title>Microsoft.WebApplication.targets was not found (again)</title>
      <link>https://alastaircrabtree.com/posts/microsoft-webapplication-targets-was-not-found-again/</link>
      <pubDate>Fri, 28 Jul 2017 13:24:47 +0000</pubDate>
      <guid>https://alastaircrabtree.com/posts/microsoft-webapplication-targets-was-not-found-again/</guid>
      <description>Every time Microsoft releases some build tooling it feels like they forget lots of us use it to build websites. And we do this on build servers that do not have Visual Studio installed using scripts. We even dare to have created websites with old versions of Visual Studio and upgrade them when a new one comes out.
I often find that these scripted builds fail on build servers because they are missing Microsoft.</description>
    </item>
    <item>
      <title>Troubleshooting an Umbraco website</title>
      <link>https://alastaircrabtree.com/posts/troubleshooting-an-umbraco-website/</link>
      <pubDate>Tue, 09 May 2017 12:11:07 +0000</pubDate>
      <guid>https://alastaircrabtree.com/posts/troubleshooting-an-umbraco-website/</guid>
      <description>A few quick tips I have picked up working with UmbracoCMS that might help you out when things go wrong.
Ensure you can login to the database directly using any username and password in the web.config file. Whilst this is obvious and true for any website, Umbraco has a habit of swallowing these errors at times like upgrades leading to some missleading error hunting.
Check the logs in ~\App_Data\Logs. By default each site logs to a local app data folder.</description>
    </item>
    <item>
      <title>Deploy asp.net websites with an SSL certificate using Octopus Deploy</title>
      <link>https://alastaircrabtree.com/posts/deploy-asp-net-websites-with-an-ssl-certificate-using-octopus-deploy/</link>
      <pubDate>Fri, 07 Apr 2017 13:34:19 +0000</pubDate>
      <guid>https://alastaircrabtree.com/posts/deploy-asp-net-websites-with-an-ssl-certificate-using-octopus-deploy/</guid>
      <description>Octopus Deploy 3.11 upwards has a nice new feature to manage SSL certificates that makes it simple to deploy a web app with its x509 SSL certificate in a secure manner. Once it’s setup the developer and deployer don’t even need access to the certificate or admin rights of the web server – all of it is managed and secured by the Octopus server itself.
Load the certificate into Octopus Whether they are internal of public someone needs to load the PFX certificate file into the Octopus Certificate Library.</description>
    </item>
    <item>
      <title>Cannot open VS 2015 Web project in VS 2017</title>
      <link>https://alastaircrabtree.com/posts/cannot-open-vs-2015-web-project-in-vs-2017/</link>
      <pubDate>Wed, 05 Apr 2017 13:17:14 +0000</pubDate>
      <guid>https://alastaircrabtree.com/posts/cannot-open-vs-2015-web-project-in-vs-2017/</guid>
      <description>Brand new installs of Visual Studio 2017 do not seem to be able to open some older web projects created in Visual Studio 2015 or before. To fix you need to add one line to your csproj file.
The problem When you open the solution in VS 2017 the project will not be loaded. If you try and right click and reload the project check the output window to see the following error:</description>
    </item>
    <item>
      <title>Implementing the retry pattern in c sharp using Polly</title>
      <link>https://alastaircrabtree.com/posts/implementing-the-retry-pattern-using-polly/</link>
      <pubDate>Thu, 29 Dec 2016 09:27:59 +0000</pubDate>
      <guid>https://alastaircrabtree.com/posts/implementing-the-retry-pattern-using-polly/</guid>
      <description>This post is the third and final installment on the retry pattern following on from implementing a simple retry pattern in c# and the retry pattern for async tasks.
In the last two posts we created a retry helper class to allow us to add retry logic to applications without cluttering important application logic with retry code. Now we will solve the same problem using a popular OSS library.
Polly is an open source framework for that &amp;ldquo;allows developers to express transient exception and fault handling policies such as Retry, Retry Forever, Wait and Retry, or Circuit Breaker in a fluent manner&amp;rdquo;.</description>
    </item>
    <item>
      <title>Implementing the retry pattern for async tasks in c#</title>
      <link>https://alastaircrabtree.com/posts/implementing-the-retry-pattern-for-async-tasks-in-c/</link>
      <pubDate>Fri, 02 Dec 2016 18:09:00 +0000</pubDate>
      <guid>https://alastaircrabtree.com/posts/implementing-the-retry-pattern-for-async-tasks-in-c/</guid>
      <description>This post is a follow on from Implementing a simple retry pattern in c#.
Tasks, async and await are rapidly becoming be default API flavours in many dotnet libraries and the performance benefits for IO bound code have been well documented. However if you need to apply the retry pattern to some async or task returning method invocation you need to watch out for subtle errors. I&amp;rsquo;ll outline the problem and revise my solution from the previous post.</description>
    </item>
    <item>
      <title>Implementing a simple retry pattern in c#</title>
      <link>https://alastaircrabtree.com/posts/implementing-a-simple-retry-pattern-in-c/</link>
      <pubDate>Thu, 01 Dec 2016 00:53:35 +0000</pubDate>
      <guid>https://alastaircrabtree.com/posts/implementing-a-simple-retry-pattern-in-c/</guid>
      <description>Everything is unstable. You cannot assume that every external service call will succeed on first attempt - the load balancer might be removing a failing host, the database might be being patched, the Ops person might have tripped on the network cable and quickly plugged it back in hoping the boss didn&amp;rsquo;t notice. If you make an outbound call you probably need an easy way to retry a couple of times before giving up and raising an exception.</description>
    </item>
    <item>
      <title>Converting an SVN repository to Git on windows</title>
      <link>https://alastaircrabtree.com/posts/converting-an-svn-repository-to-git-on-windows/</link>
      <pubDate>Thu, 17 Nov 2016 00:00:18 +0000</pubDate>
      <guid>https://alastaircrabtree.com/posts/converting-an-svn-repository-to-git-on-windows/</guid>
      <description>Git is everywhere these days, and I can&amp;rsquo;t really remember how I used to cope without the power of local distributed source control and quick branching. But once in a while I find an old SVN repository I need to convert to git and then push to a git server like github.
Here are the easy steps to switch a repositiry from SVN to git and keep the full history. Much is based on the excellent Pro Git book http://git-scm.</description>
    </item>
    <item>
      <title>Cache the result of an async method using LazyCache</title>
      <link>https://alastaircrabtree.com/posts/cache-the-result-of-an-async-method-using-lazycache/</link>
      <pubDate>Fri, 30 Sep 2016 07:00:00 +0000</pubDate>
      <guid>https://alastaircrabtree.com/posts/cache-the-result-of-an-async-method-using-lazycache/</guid>
      <description>The latests release of LazyCache, my open source cache library based on ObjectCache, makes it easy to cache the results of asynchronous or Task returning methods, so now it is simpler for you to speed up your application.
Why bother with Async? Async code tends to be more efficient as you release threads while they are waiting for the response from an asynchronous resource, but at a cost of added code complexity.</description>
    </item>
    <item>
      <title>I have to rebase and squash before the pull request will be accepted?!</title>
      <link>https://alastaircrabtree.com/posts/i-have-to-rebase-and-squash-before-the-pull-request-will-be-accepted/</link>
      <pubDate>Thu, 08 Sep 2016 11:42:08 +0000</pubDate>
      <guid>https://alastaircrabtree.com/posts/i-have-to-rebase-and-squash-before-the-pull-request-will-be-accepted/</guid>
      <description>TL/DR If you want your pull requests to be taken seriously you probably need to learn some more advanced git features like interactive rebase and squash.
First I wanted to share an article I found when helping folks that struggle with code review/pull request comments like “Can you rebase that” or “I don’t want to see all your workings – please squash your commits”.
If that applies to you, I suggest you have a read of Git Interactive Rebase, Squash, Amend and Other Ways of Rewriting History.</description>
    </item>
    <item>
      <title>How to run a dotnet windows service as a console app</title>
      <link>https://alastaircrabtree.com/posts/how-to-run-a-dotnet-windows-service-as-a-console-app/</link>
      <pubDate>Mon, 29 Aug 2016 18:20:51 +0000</pubDate>
      <guid>https://alastaircrabtree.com/posts/how-to-run-a-dotnet-windows-service-as-a-console-app/</guid>
      <description>C# Windows services can be a pain to develop because they are awkward to test, debug and run locally. However a few tweaks to the default VS template make them far more manageable.
Why use a windows service in the first place? At first glance a Windows Service looks like old tech in an age of http everywhere. However they are a reliable proven platform that is easy to deploy, easy to remotely monitor, and it is actually trivial to embed a web-server inside one and ditch IIS entirely.</description>
    </item>
    <item>
      <title>Detecting plurals in dot.net / C# the way a human might</title>
      <link>https://alastaircrabtree.com/posts/detecting-plurals-in-dot-net/</link>
      <pubDate>Tue, 16 Aug 2016 17:09:57 +0000</pubDate>
      <guid>https://alastaircrabtree.com/posts/detecting-plurals-in-dot-net/</guid>
      <description>I recently had a requirement to be able to spot pluralised words which may not be real words, but follow English language conventions, and so appear as a plural to any normal reader. So ComplexBusinesObjects is a valid plural of ComplexBusinesObject but series is its own plural. The idea was to write code that would recognise a plural in the same way a human might, even if it was not perfect grammar.</description>
    </item>
    <item>
      <title>Fixing intermittant &#39;EPERM: operation not permitted&#39; on npm install</title>
      <link>https://alastaircrabtree.com/posts/fixing-intermittant-eperm-operation-not-permitted-on-npm-install/</link>
      <pubDate>Mon, 04 Jul 2016 22:34:34 +0000</pubDate>
      <guid>https://alastaircrabtree.com/posts/fixing-intermittant-eperm-operation-not-permitted-on-npm-install/</guid>
      <description>The npm install step in my Teamcity CI build for an angular app I have been working has been failing intermittently and I finally uncovered the reason.
TL/DR The combination of McAfee Anti-virus and network mounted user AppData folders was the culprit - moving them to an unscanned local folder fixed it.
npm install was failing the build intermittently when run by our build software Teamcity on a windows agent with ugly errors like:</description>
    </item>
    <item>
      <title>An agile project retrospective - tips for your (and my) next project</title>
      <link>https://alastaircrabtree.com/posts/an-agile-project-retrospective-tips-for-your-and-my-next-project/</link>
      <pubDate>Tue, 07 Jun 2016 19:57:21 +0000</pubDate>
      <guid>https://alastaircrabtree.com/posts/an-agile-project-retrospective-tips-for-your-and-my-next-project/</guid>
      <description>Insanity: doing the same thing over and over again and expecting different results. Albert Einstein
I recently finished another agile development project and we ran some really great retrospectives over the 9 months, along with a thorough review at the end. We captured lots of data and feedback and I decided to pick out the best and publish them in the hope of not making the same mistakes in future.</description>
    </item>
    <item>
      <title>Choose the right return type for WebApi controllers</title>
      <link>https://alastaircrabtree.com/posts/choose-the-right-return-type-for-webapi-controllers/</link>
      <pubDate>Mon, 30 May 2016 13:57:17 +0000</pubDate>
      <guid>https://alastaircrabtree.com/posts/choose-the-right-return-type-for-webapi-controllers/</guid>
      <description>WebApi controller actions can return a variety of response types: HttpResponseMessage, IHttpActionResult, CLR objects and then the Task based variety of each for async actions. But which one is best? And how do we unit test them? Lets look at each in turn and examine why IHttpActionResult is usually the right choice.
Synchronous controllers returning objects The simplest web api controller can directly return the object in question. Say you have a ProductController that is concerned with CRUD operations on Products, it might have a method like the below:</description>
    </item>
    <item>
      <title>LazyCache: The easy way to add caching to your .net app &amp; make it fast</title>
      <link>https://alastaircrabtree.com/posts/the-easy-way-to-add-caching-to-net-application-and-make-it-faster-is-called-lazycache/</link>
      <pubDate>Mon, 23 May 2016 20:05:00 +0000</pubDate>
      <guid>https://alastaircrabtree.com/posts/the-easy-way-to-add-caching-to-net-application-and-make-it-faster-is-called-lazycache/</guid>
      <description>tl;dr If you need to speed up your c# application you probably need to add caching, and the easiest way to do that is use the source library I wrote called LazyCache.
Do I need to cache? Lots of apps don&amp;rsquo;t need caching because web servers and databases are fast. However many apps get to a point where performance becomes an issue, and adding caching is one easy way to get a significant performance boost.</description>
    </item>
    <item>
      <title>Smoke test windows authenticated sites with Octopus Deploy</title>
      <link>https://alastaircrabtree.com/posts/smoke-test-windows-authenticated-sites-deployed-with-octopus-deploy/</link>
      <pubDate>Thu, 05 May 2016 10:17:45 +0000</pubDate>
      <guid>https://alastaircrabtree.com/posts/smoke-test-windows-authenticated-sites-deployed-with-octopus-deploy/</guid>
      <description>After deploying a website don&amp;rsquo;t assume it succeeded - add automated tests to check everything works.
Back in the old days you would open a browser and check your new version of the site works - make sure IIS is running, the app pools starts, your database login credentials are valid etc. A human sanity check is always good - i still do it often - but ideally I want to know during deployment if something simple like that has caused the deploy to break the system.</description>
    </item>
    <item>
      <title>400 (Bad Request) when pushing a package to Octopus Deploy using nuget push</title>
      <link>https://alastaircrabtree.com/posts/400-bad-request-when-pushing-a-package-to-octopus-deploy-using-nuget-push/</link>
      <pubDate>Wed, 04 May 2016 10:53:00 +0000</pubDate>
      <guid>https://alastaircrabtree.com/posts/400-bad-request-when-pushing-a-package-to-octopus-deploy-using-nuget-push/</guid>
      <description>Stumbled on a little gotcha today when using nuget packages as deployment artifacts to be send to Octopus Deploy and thought it worth documenting so i don&amp;rsquo;t forget next time.
The quick answer is that you cannot push the same package and version to the built in octopus deploy package repository - if you try you get 400 (Bad Request).
Our build process goes a little like this:
Install the Octopack nuget package in each deployable project in the solution Compile the solution using Teamcity and msbuild, specifying the octopack build property to output packages msbuild MySolution.</description>
    </item>
    <item>
      <title>How to build a Visual Studio 2013 or 2015 solution on a build server using NAnt</title>
      <link>https://alastaircrabtree.com/posts/how-to-build-a-visual-studio-2013-or-2015-solution-on-a-build-server-using-nant/</link>
      <pubDate>Tue, 22 Mar 2016 12:03:59 +0000</pubDate>
      <guid>https://alastaircrabtree.com/posts/how-to-build-a-visual-studio-2013-or-2015-solution-on-a-build-server-using-nant/</guid>
      <description>In VS 2013+ msbuild moved out of the core .net framework and is available as a separate install for build agents know as &amp;ldquo;Build tools&amp;rdquo;.
You need to be aware that MsBuild has moved path for studio 2013 and 2015 - the path of msbuild in 2015 is C:\Program Files (x86)\MSBuild\14.0\Bin\msbuild.exe (moved from C:\Program Files (x86)\MSBuild\12.0\Bin\msbuild.exe in 2013 and C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe in 2012 and before). More info on the studio blog from 2013.</description>
    </item>
    <item>
      <title>Sites worth reading for .net developers | Mar 2016</title>
      <link>https://alastaircrabtree.com/posts/sites-worth-reading-for-net-developers-mar-2016/</link>
      <pubDate>Wed, 16 Mar 2016 15:56:50 +0000</pubDate>
      <guid>https://alastaircrabtree.com/posts/sites-worth-reading-for-net-developers-mar-2016/</guid>
      <description>Some stuff I have read in the last couple of weeks that I think are worth checking out, mostly new but some old stuff too. All worth subscribing to.
ASP.NET Core is approaching its full release and the polish is starting to shine. Using Kestral it passed node in some benchmark perf a while back, and now it&amp;rsquo;s getting silly. 1 million requests a second | ageofascent.com
3 top notch free videos from Thoughtworks and Martin Fowler, especially the last one on microservices.</description>
    </item>
    <item>
      <title>What should I look for when doing a code review?</title>
      <link>https://alastaircrabtree.com/posts/what-to-look-for-when-doing-a-code-review/</link>
      <pubDate>Fri, 11 Mar 2016 11:43:26 +0000</pubDate>
      <guid>https://alastaircrabtree.com/posts/what-to-look-for-when-doing-a-code-review/</guid>
      <description>In addition to my previous post about how to do better code reviews below is a list of specific things to watch out for during code reviews, in no particular order:
All the CI builds are green The diff/pull request should be small enough that it is reasonable to review it in under 30min - avoid giant whitespace changes. The entire app build is scripted and available with one click/script CI builds are clearly named and well organised, with separate build/test, deploy and acceptance tests stages Deployment is 100% automated New code does not introduce unnecessary duplication.</description>
    </item>
    <item>
      <title>How to do a code review without it being awkward and painful</title>
      <link>https://alastaircrabtree.com/posts/what-to-look-out-for-in-a-code-review/</link>
      <pubDate>Mon, 07 Mar 2016 23:31:00 +0000</pubDate>
      <guid>https://alastaircrabtree.com/posts/what-to-look-out-for-in-a-code-review/</guid>
      <description>Code reviews, the process of showing your hard work to another developer and having them tear it to shreds, are often an unloved part of the modern development cycle. The project manager asks why you would change the working solution, the tester refuses to test something twice, and you have to make your colleague admit on closer inspection their masterpiece has an awful double chin.
However it doesn&amp;rsquo;t have to be that way; code reviews can become part of the daily process and you and your colleagues might start looking forward to showing each other work and sharing knowledge.</description>
    </item>
    <item>
      <title>Sites worth reading for .net developers | Feb 2016</title>
      <link>https://alastaircrabtree.com/posts/blogs-developers-should-be-reading/</link>
      <pubDate>Mon, 29 Feb 2016 17:30:00 +0000</pubDate>
      <guid>https://alastaircrabtree.com/posts/blogs-developers-should-be-reading/</guid>
      <description>Some stuff I have read in the last couple of weeks that I think are worth checking out, mostly new but some old stuff too. All worth subscribing to.
The command line tooling shipped with git for windows is pretty useful, even if you are not using git itself. I often find myself dropping into the bash shell for ls, touch, less, and grep and Matt Wrock gives another useful tip.</description>
    </item>
    <item>
      <title>Tips for running a code Kata</title>
      <link>https://alastaircrabtree.com/posts/tips-for-running-a-code-kata-at-work/</link>
      <pubDate>Sun, 14 Feb 2016 18:24:36 +0000</pubDate>
      <guid>https://alastaircrabtree.com/posts/tips-for-running-a-code-kata-at-work/</guid>
      <description>Code katas such as the classic bowling game kata by uncle bob are a good way of fostering TDD best practice in your team. Here, in no particular order, are a few hints for running them I have picked up over the last few months.
Start with a subject that everyone knows. For example with the bowling game don&amp;rsquo;t assume that everyone knows how to play and how to score the game.</description>
    </item>
    <item>
      <title>What type of test is that?</title>
      <link>https://alastaircrabtree.com/posts/what-type-of-test-is-that/</link>
      <pubDate>Tue, 02 Feb 2016 19:29:00 +0000</pubDate>
      <guid>https://alastaircrabtree.com/posts/what-type-of-test-is-that/</guid>
      <description>Tests help you ensure your code works, but they come in several shapes and sizes. Here are the four key ones I use, and how to spot the difference.
Unit tests AKA: TDD, fast tests, &amp;ldquo;tests&amp;rdquo; Usually written by: Developers Time to run one: few ms Time to run suite: few secs - 3m Component under test: one or more related classes/types usually in the same module. Success: You have hundreds of quick running tests that cover 80% of application code.</description>
    </item>
    <item>
      <title>QuickTip: Comparing strings in c# ignoring case?  ToLower() is not the answer.</title>
      <link>https://alastaircrabtree.com/posts/quicktip-comparing-strings-in-c-tolower-is-not-the-answer/</link>
      <pubDate>Mon, 11 Jan 2016 12:23:00 +0000</pubDate>
      <guid>https://alastaircrabtree.com/posts/quicktip-comparing-strings-in-c-tolower-is-not-the-answer/</guid>
      <description>When doing a code review I often see code comparing two strings where the developer wants the comparison to be case insensitive and chose to use ToLower() or ToUpper() and == to get the job done. However because the dot net framework handles different cultures just using ToUpper/Lower could produce unpredictable results depending on the config of the machine your code is running on. Instead you should use the OrdinalIgnoreCase option on string.</description>
    </item>
    <item>
      <title>Encrypting configuration files in asp.net during deployment</title>
      <link>https://alastaircrabtree.com/posts/encrypting-configuration-files-in-asp-net/</link>
      <pubDate>Mon, 14 Dec 2015 15:37:00 +0000</pubDate>
      <guid>https://alastaircrabtree.com/posts/encrypting-configuration-files-in-asp-net/</guid>
      <description>Assuming you are running your asp.net website on windows and IIS it is possible to encrypt your web.config file with a little bit of scripting during your website deployment. However I would always ask why do you want to do this? IIS will not serve this file by default and if you are sensible your production websites file system should be well secured already. But assuming you have a good reason, here is how.</description>
    </item>
    <item>
      <title>Continuous Integration - am I doing it right?</title>
      <link>https://alastaircrabtree.com/posts/continuous-integration-am-i-doing-it-right/</link>
      <pubDate>Mon, 23 Nov 2015 10:36:00 +0000</pubDate>
      <guid>https://alastaircrabtree.com/posts/continuous-integration-am-i-doing-it-right/</guid>
      <description>You have a substantial development project with several people working on it and you expect to be around for a while. Having your source built by Teamcity/TFS/Jenkins etc is a good start, but there is plenty more you should probably be doing.
To help out, here is my checklist of a good quality continuous integration/continuous delivery pipeline. It takes a while and some experience to set it all up but the long term benefits to developer productivity are well worth it.</description>
    </item>
    <item>
      <title>About</title>
      <link>https://alastaircrabtree.com/about/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://alastaircrabtree.com/about/</guid>
      <description>Hi, I&amp;rsquo;m Alastair. I am a Software Engineer. I currently work on the NASA IMAP mission working on the MAG instrument. I am also the author of the .net caching library LazyCache. I build applications in c# and javascript for the web, embedded apps in c, tooling in python and I also have been known to play around in node, ruby and more. Check out my GitHub or drop me an email.</description>
    </item>
  </channel>
</rss>
