<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>danlimerick</title>
	<atom:link href="http://danlimerick.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://danlimerick.wordpress.com</link>
	<description>Daniel Lee&#039;s thoughts about programming.</description>
	<lastBuildDate>Fri, 17 May 2013 20:13:39 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='danlimerick.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>danlimerick</title>
		<link>http://danlimerick.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://danlimerick.wordpress.com/osd.xml" title="danlimerick" />
	<atom:link rel='hub' href='http://danlimerick.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Find the Hidden Pull Request Info on Github</title>
		<link>http://danlimerick.wordpress.com/2013/03/10/find-the-hidden-pull-request-info-on-github/</link>
		<comments>http://danlimerick.wordpress.com/2013/03/10/find-the-hidden-pull-request-info-on-github/#comments</comments>
		<pubDate>Sat, 09 Mar 2013 23:40:28 +0000</pubDate>
		<dc:creator>Daniel Lee</dc:creator>
				<category><![CDATA[Github]]></category>
		<category><![CDATA[GitHub]]></category>

		<guid isPermaLink="false">https://danlimerick.wordpress.com/?p=295</guid>
		<description><![CDATA[I review quite a few pull requests on Github and always thought it strange that Github does not show the repository url of the fork on which the pull request came from. I’ve always had to navigate through a few &#8230; <a href="http://danlimerick.wordpress.com/2013/03/10/find-the-hidden-pull-request-info-on-github/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danlimerick.wordpress.com&#038;blog=17071466&#038;post=295&#038;subd=danlimerick&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>I review quite a few pull requests on Github and always thought it strange that Github does not show the repository url of the fork on which the pull request came from. I’ve always had to navigate through a few pages to find it. I need this url to add it as a remote locally and pull in the changes so that I can review them.</p>
<p>But I’ve had this vague memory that someone on Twitter mentioned that it is possible to find the url on the pull request page. I went through my Twitter favourites and couldn’t find anything. A while ago I (re)discovered this little Github secret.</p>
<p>I’m writing this down mostly as a reminder for myself. Here it is, click the i:</p>
<p><a href="http://danlimerick.files.wordpress.com/2013/03/githubinfo.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;" title="GithubInfo" alt="GithubInfo" src="http://danlimerick.files.wordpress.com/2013/03/githubinfo_thumb.png?w=634&#038;h=190" width="634" height="190" border="0" /></a></p>
<p>When you click this, Github shows all the steps to do the merge manually and *ta-da* the fork’s url as an http url or a git url.</p>
<p><a href="http://danlimerick.files.wordpress.com/2013/03/githubmergeinfo.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;" title="GithubMergeInfo" alt="GithubMergeInfo" src="http://danlimerick.files.wordpress.com/2013/03/githubmergeinfo_thumb.png?w=634&#038;h=553" width="634" height="553" border="0" /></a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/danlimerick.wordpress.com/295/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/danlimerick.wordpress.com/295/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danlimerick.wordpress.com&#038;blog=17071466&#038;post=295&#038;subd=danlimerick&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://danlimerick.wordpress.com/2013/03/10/find-the-hidden-pull-request-info-on-github/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/e0bec8348e8e58e43165159f67883aeb?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">danlimerick</media:title>
		</media:content>

		<media:content url="http://danlimerick.files.wordpress.com/2013/03/githubinfo_thumb.png" medium="image">
			<media:title type="html">GithubInfo</media:title>
		</media:content>

		<media:content url="http://danlimerick.files.wordpress.com/2013/03/githubmergeinfo_thumb.png" medium="image">
			<media:title type="html">GithubMergeInfo</media:title>
		</media:content>
	</item>
		<item>
		<title>Build Your Open Source .NET Project On Travis CI</title>
		<link>http://danlimerick.wordpress.com/2013/02/03/build-your-open-source-net-project-on-travis-ci/</link>
		<comments>http://danlimerick.wordpress.com/2013/02/03/build-your-open-source-net-project-on-travis-ci/#comments</comments>
		<pubDate>Sat, 02 Feb 2013 23:12:09 +0000</pubDate>
		<dc:creator>Daniel Lee</dc:creator>
				<category><![CDATA[FluentMigrator]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[TravisCI]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Continuous integration]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">https://danlimerick.wordpress.com/?p=285</guid>
		<description><![CDATA[Travis CI is a continuous integration service that lives in the cloud and is free for public Github repositories. When you push a change to your Github repo, Travis CI will automatically detect it and run a build script. It &#8230; <a href="http://danlimerick.wordpress.com/2013/02/03/build-your-open-source-net-project-on-travis-ci/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danlimerick.wordpress.com&#038;blog=17071466&#038;post=285&#038;subd=danlimerick&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p><a title="Travis CI" href="https://travis-ci.org/">Travis CI</a> is a continuous integration service that lives in the cloud and is free for public Github repositories. When you push a change to your Github repo, Travis CI will automatically detect it and run a build script. It works for all branches and pull requests as well and has some really nice integration with Github. In the screenshots of the Github Pull Requests below you can see the first Pull Request has a Good to merge label and the second one failed.</p>
<p><a href="http://danlimerick.files.wordpress.com/2013/02/safetomergeprtravis.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;" title="SafeToMergePRTravis" alt="SafeToMergePRTravis" src="http://danlimerick.files.wordpress.com/2013/02/safetomergeprtravis_thumb.png?w=616&#038;h=246" width="616" height="246" border="0" /></a></p>
<p><a href="http://danlimerick.files.wordpress.com/2013/02/failedprtravis.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;" title="FailedPRTravis" alt="FailedPRTravis" src="http://danlimerick.files.wordpress.com/2013/02/failedprtravis_thumb.png?w=616&#038;h=251" width="616" height="251" border="0" /></a></p>
<p>Travis CI supports loads of languages but not C# and the reason is that Travis CI only supports Linux servers. Although <a href="https://github.com/travis-ci/travis-ci/issues/216">Windows support seems to be on the way</a>.</p>
<p>Being a core committer for FluentMigrator, an OSS .NET project, this is actually just what I was looking for. We have a <a href="http://teamcity.codebetter.com/viewType.html?buildTypeId=bt82&amp;tab=buildTypeStatusDiv">Teamcity server</a> (thank you Jetbrains and Codebetter) but we don’t have any testing for Mono and Linux. I had seen that the <a href="https://github.com/git-tfs/git-tfs">git-tfs</a> project (also .NET and C#) was using Travis CI and thought I’d try and copy their build script. But it was not as simple as that! Here is my guide to getting a .NET project to build on Travis CI.</p>
<h2>Sign up for Travis CI</h2>
<p>The first step is to sign up on the <a href="https://travis-ci.org/">Travis CI website</a>. You can only sign up for Travis CI via your Github login which makes sense as the service focuses on CI for Github projects only. After signing in you should see your name in the top right corner so click on that to open your profile.</p>
<p><a href="http://danlimerick.files.wordpress.com/2013/02/travisenablerepo.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;" title="TravisEnableRepo" alt="TravisEnableRepo" src="http://danlimerick.files.wordpress.com/2013/02/travisenablerepo_thumb.png?w=616&#038;h=239" width="616" height="239" border="0" /></a></p>
<p>Enable the Github hook for Travis CI by selecting the appropriate repository (daniellee/FluentMigrator in my case). And that is all you need to do. If the repository contains a file called .travis.yml then it will try and build it. This is triggered after every push to the repo.</p>
<h2>XBuild</h2>
<p>The second step is to create an MSBuild Xml file that can be run with XBuild. XBuild is the Mono version of MSBuild and uses the same file format. The simplest build script describes which .NET version to build the project in, the platform (x86 or AnyCPU) and the name of the solution file. Here is the MSBuild file for FluentMigrator:</p>
<div class="wlWriterEditableSmartContent" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:04d0fd0a-c55a-4d45-83c8-3ec8f2b1e3ce" style="margin:0;display:inline;float:none;padding:0;">
<pre class="brush: xml; pad-line-numbers: true; title: ; notranslate">
&lt;?xml version=&quot;1.0&quot;?&gt;
&lt;Project ToolsVersion=&quot;4.0&quot; DefaultTargets=&quot;CI&quot; xmlns=&quot;http://schemas.microsoft.com/developer/msbuild/2003&quot;&gt;

  &lt;Target Name=&quot;CI&quot; DependsOnTargets=&quot;Build&quot; /&gt;

  &lt;Target Name=&quot;Build&quot;&gt;
    &lt;MSBuild Projects=&quot;FluentMigrator (2010).sln&quot; Properties=&quot;Configuration=Debug;Platform=x86&quot; /&gt;
  &lt;/Target&gt;

&lt;/Project&gt;
</pre>
</div>
<h2>Create A Travis YAML File</h2>
<p>The next step is to create a .travis.yml file. A file with the extension .yml is a <a href="http://en.wikipedia.org/wiki/YAML">YAML</a> file, a file format sort of like JSON but without all the curly braces. Check out the <a href="http://about.travis-ci.org/docs/">documentation</a> for all the options that can be defined in the YAML file. Here is the YAML file for FluentMigrator:</p>
<div class="wlWriterEditableSmartContent" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:bb7882ce-fb1d-4e62-a2e1-6d567220a505" style="margin:0;display:inline;float:none;padding:0;">
<pre class="brush: plain; title: ; notranslate">
language: c

install:
  - sudo apt-get install mono-devel mono-gmcs nunit-consolescript:
  - xbuild CI.proj
  - nunit-console ./src/FluentMigrator.Tests/bin/Debug/FluentMigrator.Tests.dll -exclude Integration,NotWorkingOnMono
</pre>
</div>
<p>This needs a bit of explanation. Travis CI runs on Ubuntu Linux so before running this script .NET/Mono is not installed so we have to install everything before trying to build and test the project.</p>
<p>As C# and .NET are not supported by Travis we set the language to C.</p>
<p>The install part of the script uses Ubuntu’s package manager, apt-get (<a href="http://chocolatey.org/">Chocolatey</a> is the Windows version) to fetch Mono, the Mono C# Compiler (MCS) and the NUnit console runner. We need MCS to be able to compile our C# code. We need the Mono Development Tools (<a title="Mono Development Tools" href="http://packages.ubuntu.com/precise-updates/mono-devel">mono-devel</a>) as it contains Mono 4.0, a CLR implementation that works on Linux. And the NUnit console runner is needed to run tests from the command line.</p>
<p>The first task in the script step is to use xbuild to build the MSBuild file. For FluentMigrator this builds the main solution file that contains all the projects.</p>
<p>The second task is to run all the NUnit tests from one of the test projects. I did try and run NUnit via the MSBuild script but gave up as it was much easier to do this way. There is one very important gotcha to note here. All the examples of using the NUnit console runner use a forward slash (/) for the switches even the man pages (Linux help pages) for nunit-console. It took me a while but I eventually noticed that in the NUnit documentation that it mentions that on Linux you should use a hyphen (-) instead and then either a space or colon after the switch. E.g.  I use the exclude switch to exclude some categories of tests like this: –exclude Integration,NotWorkingOnMono</p>
<h2>Deploy It!</h2>
<p>Now it is time to cross your fingers and do a git push to your repo on Github. I’m sorry but there is no way it is going to work first time unless you have already spent some time building it on Linux. <a title="Travis builds" href="https://travis-ci.org/daniellee/fluentmigrator/builds">It took me seven attempts to get it to build successfully and another five attempts before I got all the tests to pass.</a></p>
<h2>Potential Pitfalls</h2>
<p>Here is a list of all the problems I ran into. Though I’m sure that there are loads of other problems that could occur in your project.</p>
<h3>Linux is case sensitive</h3>
<p>There is a class named SqliteQuoter in FluentMigrator (with exactly that casing) and I got the following slightly baffling error on my first run:</p>
<p>error CS2001: Source file `Generators/SQLite/SqliteQuoter.cs&#8217; could not be found</p>
<p>When I looked at the actual filename (it looked perfectly correct in Visual Studio) I saw that it had this casing: SQLiteQuoter. As just changing the casing of the filename is not a change in Git you have to explicitly rename the file.</p>
<div class="wlWriterEditableSmartContent" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:659a4b6a-cb40-45c4-81f7-85a358d2cb5c" style="margin:0;display:inline;float:none;padding:0;">
<pre class="brush: bash; title: ; notranslate">
git mv -f SQLiteQuoter.cs SqliteQuoter.cs
</pre>
</div>
<p>The next casing problem was just as baffling. It turned out that in the csproj file a reference to System.Data.SQLite.dll looked like this: System.Data.SQLite.DLL. And that meant that Linux could not match the filenames. I fixed that by manually editing the csproj file and manually changing the case.</p>
<p>I got stuck on another issue for a while but it turned out that it was nothing to do with Travis CI or Linux. After that was fixed I got a green build but the test runner did not run. The problem was the one I talked about before with the NUnit console runner and using a hyphen instead of a forward slash.</p>
<h3>NewLine</h3>
<p>Travis CI now ran all of FluentMigrators’ tests (except for the integration tests) and had 21 failing tests out of 1254. Most of the failing tests were due to the new line problem. FluentMigrator is (was) littered with \r\n which is the Windows new line character (Carriage Return and Line Feed). In Linux a new line is \n (Line Feed) only. The rather tedious solution to this was to go through the code and replace all of instances of \r\n with <a href="http://msdn.microsoft.com/en-us/library/system.environment.newline.aspx">Environment.NewLine</a>.</p>
<h3>File Paths</h3>
<p>A much harder to solve issue is file paths. They are fundamentally different on Windows and Linux. For some tests I could use <a href="http://msdn.microsoft.com/en-us/library/system.io.path.combine.aspx">Path.Combine</a> and <a href="http://msdn.microsoft.com/en-us/library/system.io.path.directoryseparatorchar.aspx">Path.DirectorySeparatorChar</a> to get them to pass but others had to be ignored (for now).</p>
<p>And at attempt number twelve I had FluentMigrator being built and all the tests run successfully on Mono and Ubuntu Linux. And there are not a lot of open source .NET projects that can say that.</p>
<h2>Next Step</h2>
<p>Travis CI has support for MySql, Postgres and Sqlite and it would be fantastic if I could get all the integration tests running against them. Next week maybe.</p>
<p>Hope this helps out some of the other OSS .NET projects.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/danlimerick.wordpress.com/285/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/danlimerick.wordpress.com/285/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danlimerick.wordpress.com&#038;blog=17071466&#038;post=285&#038;subd=danlimerick&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://danlimerick.wordpress.com/2013/02/03/build-your-open-source-net-project-on-travis-ci/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/e0bec8348e8e58e43165159f67883aeb?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">danlimerick</media:title>
		</media:content>

		<media:content url="http://danlimerick.files.wordpress.com/2013/02/safetomergeprtravis_thumb.png" medium="image">
			<media:title type="html">SafeToMergePRTravis</media:title>
		</media:content>

		<media:content url="http://danlimerick.files.wordpress.com/2013/02/failedprtravis_thumb.png" medium="image">
			<media:title type="html">FailedPRTravis</media:title>
		</media:content>

		<media:content url="http://danlimerick.files.wordpress.com/2013/02/travisenablerepo_thumb.png" medium="image">
			<media:title type="html">TravisEnableRepo</media:title>
		</media:content>
	</item>
		<item>
		<title>Git merge commit with no fast forward</title>
		<link>http://danlimerick.wordpress.com/2013/01/30/git-merge-commit-with-no-fast-forward/</link>
		<comments>http://danlimerick.wordpress.com/2013/01/30/git-merge-commit-with-no-fast-forward/#comments</comments>
		<pubDate>Wed, 30 Jan 2013 13:20:46 +0000</pubDate>
		<dc:creator>Daniel Lee</dc:creator>
				<category><![CDATA[git]]></category>
		<category><![CDATA[Github]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[GitHub]]></category>

		<guid isPermaLink="false">http://danlimerick.wordpress.com/?p=221</guid>
		<description><![CDATA[When working in open source, it is quite common that I want to either manually merge in a pull request or refer to a Github issue when merging in one of my own branches. If you do a merge and &#8230; <a href="http://danlimerick.wordpress.com/2013/01/30/git-merge-commit-with-no-fast-forward/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danlimerick.wordpress.com&#038;blog=17071466&#038;post=221&#038;subd=danlimerick&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>When working in open source, it is quite common that I want to either <a title="Manual merge of Firebird PR" href="https://github.com/schambers/fluentmigrator/commit/1ef147709fd42e8b4d07b04e16c0c6cc634e0d3a">manually merge in a pull request</a> or refer to a Github issue when merging in one of my own branches. If you do a merge and there are no merge conflicts then Git will not create a commit. It does a fast-forward merge as this is the desired behaviour most of the time.</p>
<p>To create a merge commit when merge in a branch, I use this command:</p>
<div class="wlWriterEditableSmartContent" style="display:inline;float:none;margin:0;padding:0;">
<pre class="brush: bash; pad-line-numbers: true; title: ; notranslate">
git merge branchname --no-ff -m &quot;Merge pull request #999 from fork/branch&quot;
</pre>
</div>
<p>The &#8211;no-ff switch means no fast-forward while merging. There is some Github functionality in the commit message. Using # and the issue or pull request number will create an automatic link to this commit in the issue or pull request.</p>
<div id="attachment_275" class="wp-caption alignnone" style="width: 650px"><a href="http://danlimerick.files.wordpress.com/2013/01/githubpr.png"><img class="size-full wp-image-275" alt="Github PR" src="http://danlimerick.files.wordpress.com/2013/01/githubpr.png?w=640&#038;h=65" width="640" height="65" /></a><p class="wp-caption-text">Commit reference as seen in a Github Pull Request</p></div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/danlimerick.wordpress.com/221/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/danlimerick.wordpress.com/221/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danlimerick.wordpress.com&#038;blog=17071466&#038;post=221&#038;subd=danlimerick&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://danlimerick.wordpress.com/2013/01/30/git-merge-commit-with-no-fast-forward/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/e0bec8348e8e58e43165159f67883aeb?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">danlimerick</media:title>
		</media:content>

		<media:content url="http://danlimerick.files.wordpress.com/2013/01/githubpr.png" medium="image">
			<media:title type="html">Github PR</media:title>
		</media:content>
	</item>
		<item>
		<title>Øredev 2012 &#8211; Thursday Afternoon</title>
		<link>http://danlimerick.wordpress.com/2012/11/11/oredev-2012-thursday-afternoon/</link>
		<comments>http://danlimerick.wordpress.com/2012/11/11/oredev-2012-thursday-afternoon/#comments</comments>
		<pubDate>Sun, 11 Nov 2012 00:27:25 +0000</pubDate>
		<dc:creator>Daniel Lee</dc:creator>
				<category><![CDATA[Øredev]]></category>
		<category><![CDATA[Öredev]]></category>

		<guid isPermaLink="false">https://danlimerick.wordpress.com/?p=212</guid>
		<description><![CDATA[I had a fantastic morning and the afternoon was equally as good. Here we go. Katrina Owen &#8211; Therapeutic Refactoring I had to leave a bag at the hotel and ended up having to jog a bit to make this &#8230; <a href="http://danlimerick.wordpress.com/2012/11/11/oredev-2012-thursday-afternoon/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danlimerick.wordpress.com&#038;blog=17071466&#038;post=212&#038;subd=danlimerick&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p><a href="http://danlimerick.files.wordpress.com/2012/11/madstorgersen.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="MadsTorgersen" alt="MadsTorgersen" src="http://danlimerick.files.wordpress.com/2012/11/madstorgersen_thumb.jpg?w=635&#038;h=359" height="359" width="635" /></a></p>
<p>I had a fantastic morning and the afternoon was equally as good. Here we go.</p>
<h3>Katrina Owen &#8211; Therapeutic Refactoring</h3>
<p>I had to leave a bag at the hotel and ended up having to jog a bit to make this session after lunch and got there just before they closed the door. Lucky for me! The topic of refactoring legacy code is one that lies close to my heart and I totally fell in love with this presentation. I&#8217;ve done a presentation of my own at Techdays earlier this year so I know how hard it is to find a good (I mean bad) code sample and then refactor it into readable, maintainable code without losing your audience.</p>
<p>Katrina takes a gnarly method and refactors it into beautiful code in about 30 minutes or so. The code sample is ruby code for creating a filename but the techniques she uses are just as applicable to any statically typed language. Katrina put the code up on Github along with all the steps. Here is the <a href="https://github.com/kytrinyx/therapeutic-refactoring/blob/9cbd3bc4ca5ce273630558086168ec112db3501f/xyz/xyz_service.rb">original file</a> and here is what it looks like in the <a href="https://github.com/kytrinyx/therapeutic-refactoring/blob/master/xyz/xyz_file.rb">end</a> with <a href="https://github.com/kytrinyx/therapeutic-refactoring/blob/master/xyz/xyz_service_spec.rb">tests of course</a>.</p>
<p>What makes this session amazing is just how many techniques she crams into those 30 minutes but still does it in a very relaxed way. She almost makes it look too easy. If you can learn to refactor like this then you&#8217;ll be able to take on any legacy codebase. Lovely art on the slides as well. So what are you waiting for, starting watching <a href="http://oredev.org/2012/sessions/therapeutic-refactoring">here</a>.</p>
<h3>Sandi Metz &#8211; Less, The Path To Better Design</h3>
<p>Sandi is another Ruby programmer and someone who knows OO really well. She is the author of Practical Object Oriented Design in Ruby which I haven’t read (yet). Sandi starts by defining design as the art of arranging code. And that when writing code there is always tension between code that has to work today and change in the future. So the purpose of design is to reduce the cost of change. She goes through some possible ways to guide your code design: patterns and principles like SOLID or the Law of Demeter but concludes these are great but too broad to be of practical help at the code level.</p>
<p>So Sandi came up with her own way of diagnosing code which she calls TRUE:</p>
<ul>
<li>Transparent (easy to see consequences of changing it)</li>
<li>Reasonable (cost should be proportional to the size of the change)</li>
<li>Usable (should be able to reuse it)</li>
<li>Exemplary (leads other to change it in the right way)</li>
</ul>
<p>She then proceeds to go through some code samples and shows different ways to design the code and all the time applying TRUE diagnostics to check how good the solution is. Sandy gets to the core of OO programming as opposed to procedural programming. I think that I know a lot of this but mostly implicitly (I would have hard time explaining it clearly). For example, that the direction of a dependency is a choice and you should choose the direction that will cause the least changes in the future. But that you can’t know this at the start so decouple. I really liked how Sandi could analyse code and judge if it was good enough or if she needed to refactor more. That’s a skill I’d like to be better at.</p>
<p>Here is just some of the advice that I picked up from this session.</p>
<ul>
<li>Classes are more stable when they know less.</li>
<li>You cannot avoid dependencies. Depend on things that are more stable than you.</li>
<li>You cannot know what is unstable, guard against it, don’t guess. Decouple.</li>
<li>Abstractions are more stable</li>
</ul>
<p>It should be obvious by now that I really liked this session and that another book just got added to my reading list. You can watch the session <a href="http://oredev.org/2012/sessions/less--the-path-to-better-design">here</a>.</p>
<h3>Mads Torgersen – TypeScript: JavaScript At Scale</h3>
<p>Mads started his session with an extremely controversial statement.</p>
<p>“Application scale JavaScript development is hard”</p>
<p>I noticed on Twitter that this statement got absolutely hammered by a bunch of JS developers at the CascadiaJS conference. For me personally I’ve never built a large application in JavaScript so I can’t really judge the validity of this but the concept of converting a dynamic language into a static language seems strange.</p>
<p>However, Mads gave a really solid introduction to TypeScript and shows the advantages of being able to add extra tooling to aid in writing JavaScript. I’m still not totally sold but I have to admit it would be nice to be able to rename a class across several files.</p>
<p>I’d already taken a peek at TypeScript before but I learnt a lot at this session. For starters, TypeScript is not provably type safe. The reason for making JS static typed is for the tooling. All errors are actually warnings that are generated in Visual Studio but you can ignore them and the code will run anyway. For example, if I define a variable as a string but set it to be a number then Visual Studio will flag it as an error but won’t stop me from running the code.</p>
<p>To get this tooling for existing JS libraries a TS definition file has to be created that declares the mapping between JS and TS. And these will have to be hand-rolled as far as I can see. A quick googling produced these examples – <a href="https://github.com/marcinnajder/TypeScript-declaration-files/blob/master/angular.d.ts">AngularJS</a> and <a href="https://github.com/rarous/AngularJS-TypeScript/blob/master/Angular.d.ts">AngularJS again</a>. I’m seeing this as a potential problem, which version is the best version? Will these be kept up to date? Or will Microsoft take over this job?</p>
<p>TypeScript will work with Node. There is already a node.d.ts definition file and TypeScript has support for AMD for including other files. TypeScript is open source and on Codeplex so I will be having a look at the <a href="http://typescript.codeplex.com/">source code</a>. The fact that it the typing is optional and that I can have mostly JavaScript and then just sprinkle in some TypeScript where I feel I need it was definitely a plus for me. And even if I did have some quibbles about the generated code (the whole classic class with constructor thing), for the most part it looked very clean. And I don’t think it would be too hard to debug it.</p>
<p>If you want to know more about TypeScript then check out the <a href="http://www.typescriptlang.org/Playground/">Playground</a> which is a nice REPL that shows the automatic conversion to JavaScript. And the session is already up if you want to <a href="http://oredev.org/2012/sessions/typescript-javascript-development-at-scale">watch it</a>.</p>
<h3>Alexander Bard &#8211; The Rebels Come Out Online &#8211; What if the Internet is something much bigger than we think?</h3>
<p>I’m not going to write too much about this and I didn’t take any notes. I just allowed myself to sit back and be entertained. This keynote generated the most discussion afterwards and a ton of memorable quotes. Highly recommended and it would be equally entertaining for non-programmers. This made me think about Twitter and my smart phone in a whole new way.</p>
<h3>Summary of Thursday</h3>
<p>Me and Daniel got invited to Magnus’ annual meatball dinner along with people he has got to know over the years at Øredev. Gorgeous meatballs and great fun to be able meet some of the speakers in such a relaxed setting. And then after that we went to the evening keynote with Alexander Bard and had some cracking discussions with friends. A day to remember.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/danlimerick.wordpress.com/212/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/danlimerick.wordpress.com/212/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danlimerick.wordpress.com&#038;blog=17071466&#038;post=212&#038;subd=danlimerick&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://danlimerick.wordpress.com/2012/11/11/oredev-2012-thursday-afternoon/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/e0bec8348e8e58e43165159f67883aeb?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">danlimerick</media:title>
		</media:content>

		<media:content url="http://danlimerick.files.wordpress.com/2012/11/madstorgersen_thumb.jpg" medium="image">
			<media:title type="html">MadsTorgersen</media:title>
		</media:content>
	</item>
		<item>
		<title>Øredev 2012 &#8211; Thursday morning</title>
		<link>http://danlimerick.wordpress.com/2012/11/09/oredev-2012-thursday-morning/</link>
		<comments>http://danlimerick.wordpress.com/2012/11/09/oredev-2012-thursday-morning/#comments</comments>
		<pubDate>Fri, 09 Nov 2012 19:51:16 +0000</pubDate>
		<dc:creator>Daniel Lee</dc:creator>
				<category><![CDATA[Øredev]]></category>
		<category><![CDATA[Öredev]]></category>

		<guid isPermaLink="false">http://danlimerick.wordpress.com/?p=205</guid>
		<description><![CDATA[Today was simply fantastic. Every session I went to was really good or brilliant and the keynotes were really good too. I really want to say thank you to my employer Active Solution and my manager Magnus for sending me &#8230; <a href="http://danlimerick.wordpress.com/2012/11/09/oredev-2012-thursday-morning/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danlimerick.wordpress.com&#038;blog=17071466&#038;post=205&#038;subd=danlimerick&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-217" title="Oredev2012" alt="" src="http://danlimerick.files.wordpress.com/2012/11/oredev2012.jpg?w=640&#038;h=360" height="360" width="640" /></p>
<p>Today was simply fantastic. Every session I went to was really good or brilliant and the keynotes were really good too. I really want to say thank you to my employer Active Solution and my manager Magnus for sending me to Øredev. It is very much appreciated!</p>
<p><strong>Reginald Braithwaite &#8211; The Rebellion Imperative</strong></p>
<p>Compared to the keynote with Jim McCarthy on Wednesday, Reginald Braithwaite was much more lowkey (in a very charming way). His first sentence was to apologize for not being a professional speaker as he is just a programmer. But he displayed a lot of natural talent and inserted loads of subtle jokes.</p>
<p>&#8220;I&#8217;m lisping slightly. Just imagine that there are () around everything I&#8217;m saying, it&#8217;ll work out&#8221;<br />
- Reginald Braithwaite</p>
<p>Reg introduced himself as the child of two socialists and that he loves Cuba. And this led onto his vision of the dark future we live in where corporations don&#8217;t care about progress. Wealth breeds inefficiency amongst people and corporations as they have no incentive to change. In fact it&#8217;s just the opposite and they build moats to protect their interests e.g. patents.</p>
<p>&#8220;All those moments will lost in time, like tears in rain&#8221;<br />
- Roy Batty, Bladerunner</p>
<p>is the quote Reg used to illustrate the fate of many of the great innovaters. He showed us a picture of the inventor of Visicalc, Dan Bricklin, and asked how many of us recognized him. No hands went up. Same for Jef Raskin the creator of the Mac computer.</p>
<p>&#8220;Your ideas will go further if you don&#8217;t demand that you go along with them&#8221;<br />
- Reginald Braithwaite</p>
<p>Using ideas from the book <a title="Marketing Warfare book" href="http://www.goodreads.com/book/show/2595.Marketing_Warfare">Marketing Warfare</a>, Reg presented the four sustainable positions for a company:<br />
- The leader<br />
- the rival<br />
- the innovator/disrupter<br />
- the 99%</p>
<p>The rebels are the 99%. All these startups are trying to be the disrupter but that&#8217;s really hard to do and only a handful will succeed. So if you want to be a rebel and build a successful business then go and watch Reg&#8217;s keynote!<br />
He finishes the keynote with a dance to jitterbug music, so all in all this keynote is well worth your time.</p>
<p><strong>Fred George &#8211; Micro-Service Architecture</strong></p>
<p>This was the first session at Øredev this year where I felt really challenged by a new idea. I&#8217;d heard a little bit about micro services last year via Dan North but I haven&#8217;t read or heard much about it since. Fred George is a very experienced programmer (IBM and ThoughtWorks) and he used the timeline of his career to show how he evolved from using a layered architecture to micro services. The story starts with a 1 million line J2EE system with a layered architecture now in a pitiful state. Only 70% of the acceptance tests passed and not the same 70% after every run. They measured the amount of unit tests written every week and noticed that only a few programmers were writing all the tests. As an aside, weekly unit test count is really a interesting way to measure progress. The maintenance of the project had been outsourced and it was wallowing in technical debt. So how did it end up this way? Fred&#8217;s theory has four reasons for the existence of Technical Debt:</p>
<ul>
<li>Laziness</li>
<li>Sloppiness</li>
<li>Inexperience</li>
<li>No power to refuse</li>
</ul>
<p>Fred then continued along the timeline of his career through a series of shorter projects or prototypes where he started to move towards the pub/sub model of architecture. This led to Fred and his colleague, Jeff Bay coming up with the Baysian Service Principles (after Jeff Bays).</p>
<ul>
<li>It&#8217;s okay to run more than one version of a service at the same time</li>
<li>You can only deploy one service at a time</li>
</ul>
<p>These rules started to change how the team worked. They started deploying 3 times a day.</p>
<p>The next evolution and step in the timeline was a project where they tried out a technique that they called the Pinball Method. The project was to build a system to do batch processing of replacement parts for cars. Processing started with an empty order i.e. the pinball. The order then bounced around the system calling lots of tiny services to fill up the order object with all the information it needed. These services were around 100 lines of code each and did one thing. They did have some problems with this, it was hard to figure out where the order is and hard to understand, especially for inexperienced programmers.</p>
<p>They iterated this architecture more successfully after that, especially at the <a title="Forward Internet Group" href="http://www.forward.co.uk/">Forward Internet Group</a>. This resulted in services that were small and disposable. If a change needed to be made to a service then they rewrote them instead of modifying them. The services became self-monitoring and this replaced unit testing. Real-time business monitoring replaced acceptance testing. They used JSON as the message standard for communication between service which meant that the services became language agnostic (Ruby, C++, Clojure, Node). He also mentioned that they used LinkedIn&#8217;s pub/sub system <a title="Kafka on Apache Incubator" href="http://incubator.apache.org/kafka/index.html">Kafka</a>.</p>
<p>All this resulted in them killing off a lot of their agile practises and their technical debt pretty much disappearing. As the system consists of hundreds of small services instead of the usual layers, it is not monolithic but is still complex due having to manage the flow of all of these services. Fred mentioned that he was surprised about how large the impact of this technical change was. It changed the dynamic of the team and the company.</p>
<p>This session really got me thinking. It feels like there are both definite advantages and disadvantages to the micro service approach. Some businesses cannot afford to test in production in this way. The learning curve must be quite steep and would require very competent programmers. Companies like Github do something similar to this on their frontend (but not on their backend however). I&#8217;m also wondering how they solve all the potential performance problems. But I&#8217;m intrigued and I highly recommend this session. Should be up on Vimeo soon.</p>
<p><strong>Denise R. Jacobs &#8211; Scalable and Modular CSS FTW!</strong></p>
<p>Ivar and Daniel at work have both been talking about SMACSS as a better way to structure CSS files. I work on projects that use Twitter Bootstrap or similar grid frameworks and on legacy system with loads of horrible CSS but don&#8217;t feel that I really have control over the CSS in the same way as I do over the rest of the code. And Denise did a great introduction into not just SMACSS but also <a title="OOCSS" href="http://oocss.org/">OOCSS</a>, DRY CSS and CSS for Grown Ups. These are all style guides or rules that you can apply to your CSS architecture. Denise did a great job of making her presentation in to a fairytale with herself as a pirate that was helping to restructure the CSS foundation of a castle so that its foundations would be as beautiful as the outside. It might sound a bit strange but she pulled it off. Denise goes through the different style guides and describes both the differences and the similarities between them. This session is full of good tips to improve your CSS, things like writing better selectors, how to group them, naming conventions, layout helpers, leveraging the CSS cascade and how to modularize your CSS. These are tips that you can start applying tomorrow. And best of all, I won the <a title="SMACSS" href="http://smacss.com/">SMACSS book</a> by Jonathon Snook for being brave (or stupid) enough to answer a question from Denise at the end. I think my CSS skills are about to get dramatically better!</p>
<p><strong>Morning Summary</strong></p>
<p>I am going to have split this up in two parts, I just couldn&#8217;t stop myself writing about these sessions as they were so good. And the afternoon sessions were brilliant too. So lots more to come in part 2 &#8211; the afternoon.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/danlimerick.wordpress.com/205/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/danlimerick.wordpress.com/205/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danlimerick.wordpress.com&#038;blog=17071466&#038;post=205&#038;subd=danlimerick&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://danlimerick.wordpress.com/2012/11/09/oredev-2012-thursday-morning/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/e0bec8348e8e58e43165159f67883aeb?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">danlimerick</media:title>
		</media:content>

		<media:content url="http://danlimerick.files.wordpress.com/2012/11/oredev2012.jpg" medium="image">
			<media:title type="html">Oredev2012</media:title>
		</media:content>
	</item>
		<item>
		<title>Øredev 2012 &#8211; Wednesday</title>
		<link>http://danlimerick.wordpress.com/2012/11/09/oredev-2012-wednesday/</link>
		<comments>http://danlimerick.wordpress.com/2012/11/09/oredev-2012-wednesday/#comments</comments>
		<pubDate>Fri, 09 Nov 2012 15:04:46 +0000</pubDate>
		<dc:creator>Daniel Lee</dc:creator>
				<category><![CDATA[Øredev]]></category>
		<category><![CDATA[Öredev]]></category>

		<guid isPermaLink="false">http://danlimerick.wordpress.com/?p=198</guid>
		<description><![CDATA[I&#8217;m a bit late getting this out (compared to last year) but it&#8217;s all good. I am sitting in the Slagthuset building where Øredev is held drinking a lovely cappuccino at the espresso bar here. It was a bit of a &#8230; <a href="http://danlimerick.wordpress.com/2012/11/09/oredev-2012-wednesday/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danlimerick.wordpress.com&#038;blog=17071466&#038;post=198&#038;subd=danlimerick&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p><a href="http://danlimerick.files.wordpress.com/2012/11/2012-11-09-08-49-32.jpg"><img class="alignnone size-full wp-image-199" title="Gangnam Style" alt="" src="http://danlimerick.files.wordpress.com/2012/11/2012-11-09-08-49-32.jpg?w=640&#038;h=360" height="360" width="640" /></a></p>
<p>I&#8217;m a bit late getting this out (compared to last year) but it&#8217;s all good. I am sitting in the Slagthuset building where Øredev is held drinking a lovely cappuccino at the espresso bar here. It was a bit of a slow start this year and while most sessions were pretty good, it wasn&#8217;t the whirlwind start of 2011. They has a really cool meme theme here based on funny YouTube clips and I recommend watching some of them (Double Rainbows, the cat version of Grinding the Crack and Ken Lee). So here are the highlights of my first day at Øredev this year.</p>
<p><strong>Iris Classon &#8211; Stupid questions and n00bs &#8211; top ten intriguing things you need to do</strong></p>
<p>Iris&#8217; session was very interesting and totally amazing for someone who&#8217;s been in the branch for less than 2 years. If I was able to travel in time and redo the start of my career, I&#8217;d definitely do it more like Iris has done. Anyway, Iris has done a series of stupid questions on her <a title="Stupid Questions" href="http://www.irisclasson.com/category/365-stupid-questions/">blog</a> and some of them are really not that stupid at all (see <a title="Verbatim identifiers" href="http://www.irisclasson.com/2012/10/30/stupid-question-70-verbatim-identifiers-in-c-should-they-be-used-and-when/">here</a>). The idea is to ask stupid questions that other juniors might be afraid to ask. Asking stupid questions is a great habit to cultivate, there&#8217;s nothing stupider than sitting in a meeting and not knowing what people are talking about. Iris talked about integrating junior developers into teams and what senior developers can learn from them. An example would be to copy their curiosity and lust for learning new things, something that you might have lost a bit after years of working as a programmer.</p>
<p>The most interesting part of this session was when Iris talked about gender equity and showed statistics that the proportion of women to men in our branch is actually decreasing. This is a fascinating topic for me. I have a 3-year old daughter and notice this stuff much more these days. Iris recommended watching <a title="TedX" href="http://youtu.be/TYwI-qM20x4">Sapna Cheryan &#8211; Signaling Belonging</a>. So I&#8217;ll be watching that over the weekend.</p>
<p><strong>Pairing with Lisa Crispin</strong></p>
<p>Angela Harms was supposed to do this session but had to cancel. Luckily Lisa Crispin offered to do it instead. This was a decent session with pictures of Lisas&#8217; donkeys and a bunch of pair programming tips.</p>
<p><strong>Brian Foote &#8211; Software in the Age of Sampling</strong></p>
<p>This session was based around the metaphor of music which felt quite appropriate as Brian Foote is famous for his Ball Ball of Mud metaphor. Brian compared different eras and types of music with the different eras of computer programming. The Waterfall era is Frank Sinatra; first a composer wrote the music, then someone arranged and finally Sinatra sung the song. Next came the Agilists who are like the Beatles as they both wrote and played their music. Then came the Turntablists (Rap, Grandmaster Flash etc.) and they could create new music by changing the original music but without changing the source. Brian then mixed in even more metaphors (this session was chock full of them) and tied in the Mosiac browser as an example of a Turntablist project and as a Big Bucket of Glue. Mosiac was just mostly glue code, reusing code that others had already written but adding the ability to view images. And the final music metaphor was the Samplers, like electronic music, where you take small snippets and mix into your code/music and produce something original that way. Unfortunately, Brian had a bit of demo fail when doing his DJ show but a reasonable session anyway. There were a load of funny one-liners e.g. &#8220;tasteful, gourmet dumpster diving&#8221; to describe how you should work with legacy code. I know he redid it the day after to redo the DJ demo so I don&#8217;t know which version will be put up on Vimeo.</p>
<p><strong>Vicent Marti &#8211; My Mom told me that git doesn&#8217;t scale</strong></p>
<p>Vicent Marti works on the backend for Github (which I love by the way, in case you missed it). I reckon they have some sort of school or university at Github for making slides and practising presentation skills. Vicent (like all of them at Github) could easily find work as a stand-up comedian and his slides were so polished. I laughed the whole way through this despite it being all about the &#8220;boring&#8221; details of how they build the Github backend. Vicent started by saying the reasons to attend where either because you want to build a Github competitor or because you find this stuff interesting. He did a great job of making it interesting and now I know why the network and graph tabs in Github are slow sometimes and why Github doesn&#8217;t use the JVM (it&#8217;s too modern, they&#8217;re still focussed on using Unix tools as they&#8217;re the simplest way to do git stuff).</p>
<p><strong>Alex Papadimoulis &#8211; Ugly Code: Beauty is in the Eye of the Beholder</strong></p>
<p>Alex is the editor for the DailyWTF website (Worse Than Failure, apparently) and therefore has tons of ugly code to show. He started with Mumps and ended with the recommendation that if you ever have to work on Mumps code then find another job. In between all this, he should ugly code and code that could be considered ugly or not. His definition of ugly code is interesting; ugly code is code that costs more to maintain. Alex is a slick presenter and got lots of laughs out of the audience with all his samples from DailyWTF. He did give a few tips on how to improve your ugly code, the first being just don&#8217;t if you really don&#8217;t have to and his other message to us at Øredev was to stop writing clever code. So more funny than practical but well worth a watch.</p>
<p><strong>Closing Keynote with Jim McCarthy</strong></p>
<p>Don&#8217;t know what to say about this really. This was a real barnstorming, burn-down-the-barricades speech. Jim McCarthy has worked at Bell Labs, Borland and Microsoft and told the story of how he built the Microsoft Visual C++ team. This then morphed into his vision for the future with thousands of programmers doing great things, an era of magnificence. That we, the programmers can hack the culture of the world and that we hold the real power. He talked a lot about how important a shared vision is if you want your team to be high performing. Maybe even 10 times better than team without it. I got a bit lost at the end when he started talking about his new manifesto(maybe?) the Core Protocols (<a href="http://www.mccarthyshow.com/" rel="nofollow">http://www.mccarthyshow.com/</a>). His preacher style made the whole keynote a bit unsettling and I&#8217;m not sure he really managed to capture the audience. I&#8217;ll have to research this a bit more before giving an opinion.</p>
<p><strong>Meeting Interesting People</strong></p>
<p>I finally got to meet Kristoffer Ahl from DotnetMentor and one of the few OSS .NET devs in Sweden. He works on <a title="FluentSecurity" href="http://www.fluentsecurity.net/">FluentSecurity</a> so check that out and send him a pull request. Also met a bunch of former colleagues and had some really deep and involved discussions on programming. A visit to Øredev really triggers a lot of deep thinking that I don&#8217;t really have time for during the rest of the year. It gets me thinking a lot about the areas of learning I need to focus on and my core beliefs and values as a programmer. The discussions that triggered this were the best part of Day 1.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/danlimerick.wordpress.com/198/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/danlimerick.wordpress.com/198/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danlimerick.wordpress.com&#038;blog=17071466&#038;post=198&#038;subd=danlimerick&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://danlimerick.wordpress.com/2012/11/09/oredev-2012-wednesday/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/e0bec8348e8e58e43165159f67883aeb?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">danlimerick</media:title>
		</media:content>

		<media:content url="http://danlimerick.files.wordpress.com/2012/11/2012-11-09-08-49-32.jpg" medium="image">
			<media:title type="html">Gangnam Style</media:title>
		</media:content>
	</item>
		<item>
		<title>Øredev 2012</title>
		<link>http://danlimerick.wordpress.com/2012/11/06/oredev-2012/</link>
		<comments>http://danlimerick.wordpress.com/2012/11/06/oredev-2012/#comments</comments>
		<pubDate>Tue, 06 Nov 2012 17:50:15 +0000</pubDate>
		<dc:creator>Daniel Lee</dc:creator>
				<category><![CDATA[Øredev]]></category>

		<guid isPermaLink="false">http://danlimerick.wordpress.com/2012/11/06/oredev-2012/</guid>
		<description><![CDATA[I&#8217;m sitting on the train on my way to Malmö and Øredev 2012. This will be my second time attending and as an interesting exercise (for me at least!) I&#8217;m going to evaluate the impact of last year&#8217;s conference on &#8230; <a href="http://danlimerick.wordpress.com/2012/11/06/oredev-2012/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danlimerick.wordpress.com&#038;blog=17071466&#038;post=195&#038;subd=danlimerick&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>I&#8217;m sitting on the train on my way to Malmö and Øredev 2012. This will be my second time attending and as an interesting exercise (for me at least!) I&#8217;m going to evaluate the impact of last year&#8217;s conference on my programming life. I absolutely loved the experience but did it have a lasting effect?</p>
<p><strong>JavaScript Everywhere</strong></p>
<p>The first theme from last year&#8217;s Øredev that inspired me was Javascript/Node together with TDD. I&#8217;m pretty comfortable with C# and TDD even with horrible legacy code but TDDing JavaScript (especially for websites) is another kettle of fish. After Christian Johansen&#8217;s <a title="Test-driven Javascript" href="http://oredev.org/2011/sessions/test-driven-javascript">excellent session</a> where he wrote an autocomplete plugin for jQuery with TDD, I had to buy his book and start practising myself. I&#8217;m still a total beginner but starting to improve and am already seeing the benefits. I&#8217;ve also been digging into Node and watching James Shore&#8217;s <a title="Lets Code JavaScript" href="http://www.letscodejavascript.com/">screencast series on Node and JavaScript</a>. At work there is more and more JavaScript so I&#8217;m definitely going to keep at it and improve my JavaScript skills further.</p>
<p><strong>Dan North</strong></p>
<p>Dan North&#8217;s <a title="Keynote" href="http://oredev.org/2011/sessions/embracing-uncertainty--the-hardest-pattern-of-all">keynote</a> and <a title="Dan's session" href="http://oredev.org/2011/sessions/patterns-of-effective-delivery">session</a> were the two sessions that affected me the most. I think I went to Øredev last year expecting to be deluged in a wave of new technical stuff and hadn&#8217;t thought too much about the non-technical sessions. These two sessions emphasised how much I have left to learn before I can consider myself to be a really good programmer. I might be getting good in a few technical areas but it&#8217;s only a drop in the ocean of what is left to learn. The longer I work in this branch the more I notice how often the technical stuff is not the stumbling block, it&#8217;s the people stuff. Dan&#8217;s keynote reminded me of how easy it is to avoid the uncertainty of human communication and lose yourself in the more black-and-white domain of programming problems, often to the detriment of the project. The Agile Manifesto is as relevant today as when it was written and Dan made sure I won&#8217;t forget that.</p>
<p><strong>The Rest</strong></p>
<p>I went to loads of interesting sessions last year that I haven&#8217;t followed up and the primary reason for that is lack of time. But it was still worthwhile to have a deeper look at subjects like CoffeeScript, async in C#, agile testing practises, DDD and REST. I learnt a bit more about them and that is valuable in itself.</p>
<p><strong>Expectations for 2012</strong></p>
<p>So Øredev 2011 did change my programming life and I&#8217;m wondering if it is possible that I&#8217;ll be blown away again this year. There are some really interesting themes this year like refactoring (Brian Foote and Katrina Owen), NoSQL and Agile so I&#8217;m looking forward to those. Who knows what will influence me the most this time!</p>
<p>Last year I was too occupied with just being there to spend much energy meeting people so I&#8217;m hoping that I&#8217;ll be better at that this year. If anyone is interested in talking about Open Source in .NET or refactoring legacy code or TDD (or anything really) then please don&#8217;t hesitate to approach me.</p>
<p>I&#8217;m also looking forward to meeting former colleagues and people I follow on Twitter. And there might be a beer or two partaken as well. Me and the other <a title="Daniel Vinntreus" href="http://www.activesolution.se/bloggar/daniel-vinntreus/">Daniel</a> got invited to a meatball dinner by another colleague, <a title="Magnus Mårtensson" href="http://magnusmartensson.com/">Magnus</a>, from Active Solution who happens to live in Malmö, so that should be great too!</p>
<p>Looking forward to three exciting days!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/danlimerick.wordpress.com/195/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/danlimerick.wordpress.com/195/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danlimerick.wordpress.com&#038;blog=17071466&#038;post=195&#038;subd=danlimerick&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://danlimerick.wordpress.com/2012/11/06/oredev-2012/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/e0bec8348e8e58e43165159f67883aeb?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">danlimerick</media:title>
		</media:content>
	</item>
		<item>
		<title>Breaking Hidden Dependencies</title>
		<link>http://danlimerick.wordpress.com/2012/06/11/breaking-hidden-dependencies/</link>
		<comments>http://danlimerick.wordpress.com/2012/06/11/breaking-hidden-dependencies/#comments</comments>
		<pubDate>Sun, 10 Jun 2012 23:15:05 +0000</pubDate>
		<dc:creator>Daniel Lee</dc:creator>
				<category><![CDATA[Legacy Code]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Legacy code]]></category>
		<category><![CDATA[Michael Feathers]]></category>
		<category><![CDATA[Test-driven development]]></category>
		<category><![CDATA[Unit testing]]></category>

		<guid isPermaLink="false">https://danlimerick.wordpress.com/?p=182</guid>
		<description><![CDATA[This is a part of my series on practising TDD while working with legacy code. The first problem most developers encounter when trying to get a class under test is hidden dependencies. It is what usually forces most developers to &#8230; <a href="http://danlimerick.wordpress.com/2012/06/11/breaking-hidden-dependencies/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danlimerick.wordpress.com&#038;blog=17071466&#038;post=182&#038;subd=danlimerick&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>This is a part of my series on practising TDD while working with legacy code. The first problem most developers encounter when trying to get a class under test is hidden dependencies. It is what usually forces most developers to give up their TDD initiative and conclude that unit testing legacy code is next to impossible.</p>
<h3>Seams and Dependencies</h3>
<p>The main reason legacy code is hard to test is because it is hard to get at the hidden dependencies of a class. The class you are trying to change might depend on a database or file streams or an email server or on twenty modules with their own dependencies. The setup for a test trying to initialise all these dependencies might be 50 lines of code or involve setting up a new test database. To make unit testing viable, you have to break these dependencies and make the code under test more loosely coupled. I don’t want to log or save something to the database while testing a unit of code. I only want to test the logic in that unit. To achieve this I need to be able to create a fake database (or a fake logging class) that doesn’t interfere with my test.</p>
<p>Another reason to try and break dependencies is to use them for sensing. Sometimes the class under test affects other coupled classes but we have no way of seeing the result. If we can get at the dependent class then we can see what message the class under test tried to send.</p>
<p>The first problem is getting at the dependency so that I can swap it out or disable it. It could be buried a few levels down in the code and be inaccessible to me when I new up the object I want to test. I need to find a seam; a point in the code where I can write tests or make a change to enable testing. I work mostly with C# (and JavaScript but this stuff is way easier there) so if I want to test without changing the code then I usually have three options.</p>
<h3>The Easy Option</h3>
<p>The first option is to write a test for the class and see it if works. If it doesn&#8217;t then for all the parameters into the constructor I trying passing null instead of a value. And if there are still dependencies causing problems then I can try setting them to null via a property (if the dependency is a public property). This works very occasionally but usually I have to do more work than this to get the class under test.</p>
<div id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:58a45160-93c3-4edc-bb74-301bfc64b568" class="wlWriterEditableSmartContent" style="margin:0;display:inline;float:none;padding:0;">
<pre class="brush: csharp; pad-line-numbers: true; title: ; notranslate">
orderService = new OrderService(null, null, null, dependencyICareAbout);
</pre>
</div>
<h3>The Test Without Changing Any Code Option</h3>
<p>The second option is a pattern from Michael Feathers (again!) called Subclass and Override. This pattern uses inheritance to nullify the dependencies of a class that I don&#8217;t care about and allows me to get at dependencies I do care about. There are a lot of variations on this pattern so once you understand it then you can add a bunch of new tools to your refactoring toolbox.</p>
<p>To test a class I can create a new test class that inherits from it (a subclass) and then override methods to do something else. This test class is not part of the production code and is only for testing purposes. An example would be a class that has a dependency on the file system and that has a method that saves data to a file.</p>
<div id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:fbd3439b-27db-4794-99b2-28d2140ef772" class="wlWriterEditableSmartContent" style="margin:0;display:inline;float:none;padding:0;">
<pre class="brush: csharp; title: ; notranslate">
public void SaveOrder(int orderId)
{
    Order order = orderRepository.GetOrderById(orderId);
    GetOrderChanges();
    SaveOrderToFile(order);
}

public virtual void SaveOrderToFile(Order order)
{
    //File stream stuff
}
</pre>
</div>
<p>I could then override this method to do nothing and test the rest of class without worrying about data being written to files. So in my example, I can write a test for the SaveOrder method (using my new TestOrderService class) to test the first two lines and not worry about data being saved to a file in the SaveOrderToFile method.</p>
<div id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:7bc23719-df35-4566-8ba9-322e64b9dba3" class="wlWriterEditableSmartContent" style="margin:0;display:inline;float:none;padding:0;">
<pre class="brush: csharp; title: ; notranslate">
public class TestOrderService: OrderService
{
    public override void SaveOrderToFile(Order order)
    {
        //Do nothing
    }
}
</pre>
</div>
<p>A subtle variant of this pattern is changing the access modifier of a method from private to protected so that you can inherit the method in a test class and get access to it. In C# you will also have to make the method virtual to be able to override it.</p>
<p>The Subclass and Override pattern can also be used to inject a fake class instead of a dependency or to get at other internals to be able to sense if our test succeeded or failed. It is a very powerful pattern especially if you use one of the variations of it called Extract and Override (Call, Factory Method etc.).</p>
<h3>The Making Code Testable First Option</h3>
<p>The third option is to make the code testable by making some changes to the code that open up the class for testing but do not change any logic. This sounds risky and it is, so to avoid any unpleasant side-effects I try and make any changes as small and safe as possible. Using a tool like Resharper and methods like <a href="http://www.refactoring.com/catalog/extractMethod.html">Extract Method</a> (from Martin Fowler’s classic book, <a href="http://martinfowler.com/books.html#refactoring">Refactoring</a>) is how I usually accomplish this. There are lots of different techniques for making your code more testable but I will start us off by showing how to use the Extract and Override Call pattern (from Michael Feathers once again).</p>
<p>Here is a typical hard to test method. I need to write a test to check that the email subject and body are generated correctly but if I call this method it will try to send an email (or throw an exception if I don’t have an email server).</p>
<div id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:4edf2c9d-0632-4836-a97d-6f6cb5551b7c" class="wlWriterEditableSmartContent" style="margin:0;display:inline;float:none;padding:0;">
<pre class="brush: csharp; title: ; notranslate">
public void SendOrderConfirmationToCustomer(int orderId)
{
    Order order = orderRepository.GetOrderById(orderId);

    var email = new MailMessage(DefaultSender, order.CustomerEmailAddress)
                    {
                        Subject = &quot;Order Confirmation&quot;,
						Body = BuildOrderConfirmationMessage()
                    };
    smtpClient.Send(email);
}
</pre>
</div>
<p>The first step is to extract the last line into a new method. And then make this new SendEmail method protected and virtual.</p>
<div id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:c14756f8-3713-4eee-8e0f-67955b793049" class="wlWriterEditableSmartContent" style="margin:0;display:inline;float:none;padding:0;">
<pre class="brush: csharp; title: ; notranslate">
public void SendOrderConfirmationToCustomer(int orderId)
{
    Order order = orderRepository.GetOrderById(orderId);

    var email = new MailMessage(DefaultSender, order.CustomerEmailAddress)
                    {
                        Subject = &quot;Order Confirmation&quot;,
						Body = BuildOrderConfirmationMessage()
                    };
    SendEmail(email);
}

protected virtual void SendEmail(MailMessage email)
{
    smtpClient.Send(email);
}
</pre>
</div>
<p>The second step is to introduce a new testing subclass that records the message to be sent by saving it in the SentMessage property. This property is for testing purposes only.</p>
<div id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:30100042-c359-4296-9cbe-0a823376469d" class="wlWriterEditableSmartContent" style="margin:0;display:inline;float:none;padding:0;">
<pre class="brush: csharp; title: ; notranslate">
public class TestOrderService: OrderService
{
    public MailMessage SentMessage { get; set; }

    protected override void SendEmail(MailMessage email)
    {
        SentMessage = email;
    }
}
</pre>
</div>
<p>Now I can write a unit test for the SendOrderConfirmationToCustomer method and confirm that the Subject is set to “Order Confirmation”.</p>
<div id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:bdb2ba2b-ef1d-4d16-bd6d-ef356378dcbc" class="wlWriterEditableSmartContent" style="margin:0;display:inline;float:none;padding:0;">
<pre class="brush: csharp; title: ; notranslate">
[Test]
public void SendOrderConfirmationToCustomer_WithAnOrderThatExists_ShouldSendAnEmailWithSubjectSetToOrderConfirmation()
{
    var orderService = new TestOrderService();

    orderService.SendOrderConfirmationToCustomer(1);

    Assert.That(orderService.SentMessage.Subject, Is.EqualTo(&quot;Order Confirmation&quot;));
}
</pre>
</div>
<h3>Conclusion</h3>
<p>I have shown how to override a method to nullify it for testing purposes and also how to do sensing in an overridden method (recording the sent message). The Subclass and Override pattern allows me to test a class without changing anything and so is a very low risk. The Extract And Override Call pattern requires some changes to the code but I would still classify it as low risk. It has the added bonus of improving the code slightly and is the easiest way to break up large methods and the first step to extracting low level code into separate classes.</p>
<p>I use both the Subclass and Override pattern and the Extract and Override Call pattern quite often while working with Legacy Code. They are really great, both for beginners and for programmers used to working with legacy code. I use these patterns less now as I tend to use mocking frameworks and other techniques to help test my code. But all mocking frameworks are basically just a variation of the Subclass and Override pattern.</p>
<p>But we still have one problem left with our SendOrderConfirmationToCustomer method; it fetches an order from the database. How can we test that in a simple way? See my next blog post about Dependency Injection for a description of how we can build on our test/fake classes to make legacy code testable.</p>
<h6 class="zemanta-related-title" style="font-size:1em;">Related articles</h6>
<ul class="zemanta-article-ul">
<li class="zemanta-article-ul-li"><a href="http://danlimerick.wordpress.com/2012/04/25/tdd-when-up-to-your-neck-in-legacy-code/" target="_blank">TDD when up to your neck in Legacy Code</a> (danlimerick.wordpress.com)</li>
<li class="zemanta-article-ul-li"><a href="http://danlimerick.wordpress.com/2012/04/25/the-legacy-code-lifecycle/" target="_blank">The Legacy Code Lifecycle</a> (danlimerick.wordpress.com)</li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/danlimerick.wordpress.com/182/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/danlimerick.wordpress.com/182/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danlimerick.wordpress.com&#038;blog=17071466&#038;post=182&#038;subd=danlimerick&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://danlimerick.wordpress.com/2012/06/11/breaking-hidden-dependencies/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/e0bec8348e8e58e43165159f67883aeb?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">danlimerick</media:title>
		</media:content>
	</item>
		<item>
		<title>My Techdays Presentation</title>
		<link>http://danlimerick.wordpress.com/2012/06/07/my-techdays-presentation/</link>
		<comments>http://danlimerick.wordpress.com/2012/06/07/my-techdays-presentation/#comments</comments>
		<pubDate>Thu, 07 Jun 2012 21:23:27 +0000</pubDate>
		<dc:creator>Daniel Lee</dc:creator>
				<category><![CDATA[Legacy Code]]></category>
		<category><![CDATA[Techdays]]></category>

		<guid isPermaLink="false">http://danlimerick.wordpress.com/?p=176</guid>
		<description><![CDATA[I posted the slides to my Techdays presentation in a previous blog post but now a recording of my session is out on YouTube. Here is the link to the YouTube video: http://youtu.be/8hA8JlPd9Dg The title of my session was Become a &#8230; <a href="http://danlimerick.wordpress.com/2012/06/07/my-techdays-presentation/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danlimerick.wordpress.com&#038;blog=17071466&#038;post=176&#038;subd=danlimerick&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>I posted the slides to my Techdays presentation in a <a title="Techdays 2012 – Slides from my presentation" href="http://danlimerick.wordpress.com/2012/04/26/techdays-2012-slides-from-my-presentation/">previous blog post</a> but now a recording of my session is out on YouTube. Here is the link to the YouTube video: <a title="Techdays Presentation on YouTube" href="http://youtu.be/8hA8JlPd9Dg">http://youtu.be/8hA8JlPd9Dg</a></p>
<p>The title of my session was <em>Become a happier dev: Combat Legacy Code with tests </em>and is all about why you should unit test legacy and how you can get started.</p>
<p>Enjoy!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/danlimerick.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/danlimerick.wordpress.com/176/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danlimerick.wordpress.com&#038;blog=17071466&#038;post=176&#038;subd=danlimerick&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://danlimerick.wordpress.com/2012/06/07/my-techdays-presentation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/e0bec8348e8e58e43165159f67883aeb?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">danlimerick</media:title>
		</media:content>
	</item>
		<item>
		<title>Techdays 2012 &#8211; Slides from my presentation</title>
		<link>http://danlimerick.wordpress.com/2012/04/26/techdays-2012-slides-from-my-presentation/</link>
		<comments>http://danlimerick.wordpress.com/2012/04/26/techdays-2012-slides-from-my-presentation/#comments</comments>
		<pubDate>Thu, 26 Apr 2012 09:08:36 +0000</pubDate>
		<dc:creator>Daniel Lee</dc:creator>
				<category><![CDATA[Legacy Code]]></category>
		<category><![CDATA[Techdays]]></category>
		<category><![CDATA[Legacy code]]></category>
		<category><![CDATA[slides]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://danlimerick.wordpress.com/?p=172</guid>
		<description><![CDATA[I held a session at Techdays in Örebro, Sweden about TDD and Legacy Code. I&#8217;ve uploaded the slides to speakerdeck.com for those who want to look through them again. Thank you for coming to my session and I hope you &#8230; <a href="http://danlimerick.wordpress.com/2012/04/26/techdays-2012-slides-from-my-presentation/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danlimerick.wordpress.com&#038;blog=17071466&#038;post=172&#038;subd=danlimerick&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>I held a <a title="Techdays site" href="http://www.techdays.se/sessioner#/sessions/7354">session</a> at Techdays in Örebro, Sweden about TDD and Legacy Code. I&#8217;ve uploaded the slides to speakerdeck.com for those who want to look through them again.</p>
<p>Thank you for coming to my session and I hope you got something out of it! I had some great discussions afterwards about working with legacy code. So good luck to all of you with getting started with testing your legacy systems.</p>
<p>Here&#8217;s the <a title="Speakerdeck presentation" href="http://speakerdeck.com/u/daniellee/p/become-a-happier-developer-combat-legacy-code-with-tests">link</a> to the slides.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/danlimerick.wordpress.com/172/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/danlimerick.wordpress.com/172/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danlimerick.wordpress.com&#038;blog=17071466&#038;post=172&#038;subd=danlimerick&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://danlimerick.wordpress.com/2012/04/26/techdays-2012-slides-from-my-presentation/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/e0bec8348e8e58e43165159f67883aeb?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">danlimerick</media:title>
		</media:content>
	</item>
	</channel>
</rss>
