<?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>Tue, 06 Dec 2011 22:41:42 +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>Öredev 2011 &#8211; The Last Day</title>
		<link>http://danlimerick.wordpress.com/2011/11/11/oredev-2011-the-last-day/</link>
		<comments>http://danlimerick.wordpress.com/2011/11/11/oredev-2011-the-last-day/#comments</comments>
		<pubDate>Fri, 11 Nov 2011 22:10:24 +0000</pubDate>
		<dc:creator>Daniel Lee</dc:creator>
				<category><![CDATA[Øredev]]></category>
		<category><![CDATA[Öredev]]></category>

		<guid isPermaLink="false">https://danlimerick.wordpress.com/?p=131</guid>
		<description><![CDATA[Öredev 2011 has come to an end. It is hard to describe in words the impact Öredev has made on me. I watched a lot of the videos from Öredev 2010 but it is definitely not the same as attending &#8230; <a href="http://danlimerick.wordpress.com/2011/11/11/oredev-2011-the-last-day/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danlimerick.wordpress.com&amp;blog=17071466&amp;post=131&amp;subd=danlimerick&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Öredev 2011 has come to an end. It is hard to describe in words the impact Öredev has made on me. I watched a lot of the videos from Öredev 2010 but it is definitely not the same as attending the conference in person. I have never experienced an atmosphere like it before. An intimate, friendly environment coupled with everyone’s intensive lust for learning was just really special to be a part of. I felt I that I mentally lifted my head and looked around and ahead in a way that is really hard to do while at work. Very inspiring and I would recommend the experience to any programmer.</p>
<p><a href="http://danlimerick.files.wordpress.com/2011/11/oredevlogo.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="OredevLogo" src="http://danlimerick.files.wordpress.com/2011/11/oredevlogo_thumb.jpg?w=633&#038;h=347" alt="OredevLogo" width="633" height="347" border="0" /></a></p>
<p>The keynote today was from Jeff Atwood of Coding Horror and Stack Overflow fame. I’ve been reading Coding Horror for ages and listened to a lot of the Stack Overflow podcasts so this was just a rehash for me. But probably interesting if you hadn’t heard it before.</p>
<h3>Agile Testing: Advanced Topics</h3>
<p>Janet Gregory (<a href="https://twitter.com/#!/janetgregoryca">@janetgregoryca</a>) started her session by talking about the <a href="http://www.amazon.com/Agile-Testing-Practical-Guide-Testers/dp/0321534468">Agile Testing</a> book she had written together with Lisa Crispin 3 years ago. Janet reflected that the book has held up pretty well but that she wanted this session to be about what has changed in the last 3 years; a of summary of the latest ideas about Agile testing.</p>
<p>The first topic was Feature Acceptance; when you are not meeting your customers’ expectations you can try to build the features that matter, that make the customer happy. Janet had a great jigsaw puzzle story to illustrate this point. She had taken a jigsaw puzzle with her to build while supervising kids at a summer camp, and didn’t get as much time as she had planned to finish it. But because she chose to build her favourite parts of the picture on the jigsaw first, she felt pretty happy about it anyway. She had completed enough to see the soul of picture and that she hadn’t completed all the boring blue sky bits didn’t really matter.</p>
<p>Janet told another story that also intrigued me. She bought a toy pirate ship for her team and told them it was a symbol for their legacy codebase. The team then proceeded to mess up the ship with Play-doh and markers until it looked as ugly as their codebase. Then after every sprint they tidied up the ship a bit just like they were tidying up their code. It’s amazing how the human brain works but this physical stuff really helps with motivation.</p>
<p>All-in-all a nice little summary of Agile Testing.</p>
<h3>Domain Models and Composite Applications</h3>
<p>Udi Dahan (<a href="https://twitter.com/#!/udidahan">@udidahan</a>), one of the lead developers on NServiceBus and a DDD expert, had a session for us DDD beginners. First he described a traditional domain model, just like the ones all of us have seen in our projects. These models typically have huge, interconnected database schemas and are really hard to change and understand. Udi recommended a mind shift to get around this. Don’t focus on the entities, focus on the field instead.</p>
<p>He used a really good example to show this, the customer entity. What is a customer in business terms? Sales works with leads, as soon as they have sold their product, then they move onto the next lead. So they don’t use the word customer and don’t really work with or care about the customer. Accounting sees the customer as an account, so a customer isn’t a term they use either. Not even Customer Support sees the customer in the same way as the typical customer entity in a model. So it is basically just us developers that believe there is such thing called a customer due to us focussing on entities (nouns) instead of fields.</p>
<p>The point being that we should not have one model that fits everything. We should have different models for different fields. When we do this then we can split up the database into independent mini-databases. These bounded contexts (DDD word) communicate with each other by sending the id of the aggregate root and not by sharing state. This makes it possible to have a mixture of relational and NoSql databases. The motto being use the right tool for the job.</p>
<p>Udi did a great job with this presentation. Recommended for watching when the videos come out.</p>
<h3>Credit Crunch Code</h3>
<p>Gary Short (<a href="https://twitter.com/#!/garyshort">@garyshort</a>) had it tough being both heckled by Mark Rendle and a baby (the baby seemed to quite enjoy the session) while doing this session on Technical Debt. But he managed it so well, I started wondering if he’d also been a stand-up comedian (as Mark was). Before going into this session I wasn’t sure if I’d learn anything new about Technical Debt. But I did!</p>
<p>The first interesting new concept Gary talked about was interest on Technical Debt. Once Technical Debt is incurred it also accrues interest. He defined interest in these terms:</p>
<ul>
<li>The time is takes to get back up to speed on the code where the Technical Debt was incurred</li>
<li>The cost of the damage to your brand due to Technical Debt</li>
<li>Possible loss of market share</li>
<li>Low morale in the team</li>
</ul>
<p>Then he took this even further with a mathematical formula for calculating Technical Debt. This could be used to put an actual number (in kronor, euros or dollars) on the value of your Technical Debt.</p>
<p>He ran out of time at the end and had to skip a bunch of slides but he did it in such an entertaining way that it didn’t affect the quality of the session. I had fun at this one.</p>
<h3>Transforming Data into Pixels: Visualization with Canvas and Coffeescript</h3>
<p>Trevor Burnham did a live coding session on using Canvas in HTML 5 to visualize data. This wasn’t what I thought it would be. It was more a presentation of Coffeescript than HTML 5. Trevor did some low level Canvas rendering of data points (with x and y values) which could eventually be a data visualization tool.</p>
<p>Unfortunately, compared to Christian Johansen’s TDD Javascript session this was distinctly unimpressive. Trevor struggled a bit with the live coding and it did not showcase Coffeescript in a good way.</p>
<h3>Patterns of Effective Delivery</h3>
<p>This was a follow up to Dan North’s keynote yesterday. Dan presented some new patterns that he is currently figuring out. First Dan defined the three words Pattern, Effective and Delivery. The definition of Effective was extremely interesting. Effective only has meaning in a context, it depends on what you are optimising for. Today, quite a lot of us optimise for security in our processes. Processes like Scrum optimise for teachability. This is a very deep question, what are you optimising for in your current project?</p>
<p>Dan then presented a bunch of new patterns that developers could use depending on what they are optimising for. I don’t know what to make of these really. I’ll have to let them sink in and try think about them for myself. Some of them are really controversial and go against the current thinking in the Agile community. This session made me feel like a novice again. I don’t think I can use most of these patterns, I am just not good enough yet to judge if they have value. Unbelievably thought provoking, totally wrecked my head as we say in Ireland. Great way to end Öredev really. My cheese is moved.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/danlimerick.wordpress.com/131/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/danlimerick.wordpress.com/131/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/danlimerick.wordpress.com/131/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/danlimerick.wordpress.com/131/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/danlimerick.wordpress.com/131/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/danlimerick.wordpress.com/131/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/danlimerick.wordpress.com/131/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/danlimerick.wordpress.com/131/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/danlimerick.wordpress.com/131/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/danlimerick.wordpress.com/131/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/danlimerick.wordpress.com/131/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/danlimerick.wordpress.com/131/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/danlimerick.wordpress.com/131/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/danlimerick.wordpress.com/131/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danlimerick.wordpress.com&amp;blog=17071466&amp;post=131&amp;subd=danlimerick&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://danlimerick.wordpress.com/2011/11/11/oredev-2011-the-last-day/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.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/2011/11/oredevlogo_thumb.jpg" medium="image">
			<media:title type="html">OredevLogo</media:title>
		</media:content>
	</item>
		<item>
		<title>Öredev 2011- Day 2 (Rollercoaster Ride)</title>
		<link>http://danlimerick.wordpress.com/2011/11/10/redev-2011-day-2-rollercoaster-ride/</link>
		<comments>http://danlimerick.wordpress.com/2011/11/10/redev-2011-day-2-rollercoaster-ride/#comments</comments>
		<pubDate>Thu, 10 Nov 2011 21:25:39 +0000</pubDate>
		<dc:creator>Daniel Lee</dc:creator>
				<category><![CDATA[Øredev]]></category>
		<category><![CDATA[Öredev Oredev Øredev]]></category>

		<guid isPermaLink="false">https://danlimerick.wordpress.com/?p=127</guid>
		<description><![CDATA[Today was a real rollercoaster ride with extreme ups and downs. Sessions by Dan North, Gojko Adzic, Mark Rendle and Greg Young were really fantastic. If any of you plan on watching the Öredev videos, then all of these are &#8230; <a href="http://danlimerick.wordpress.com/2011/11/10/redev-2011-day-2-rollercoaster-ride/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danlimerick.wordpress.com&amp;blog=17071466&amp;post=127&amp;subd=danlimerick&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Today was a real rollercoaster ride with extreme ups and downs. Sessions by Dan North, Gojko Adzic, Mark Rendle and Greg Young were really fantastic. If any of you plan on watching the Öredev videos, then all of these are worth watching. Unfortunately, I also had two sessions that didn’t come anywhere near the standard of those. But 4 is greater than 2, so still a fantastic ride overall.</p>
<h3>Keynote</h3>
<p>Dan North delivered the keynote today with the title Embracing Uncertainty (the Hardest Pattern of All). I was really looking forward to this as I’d seen some of Dans’ talks on InfoQ before and they were all really good and really thought provoking. The theme was uncertainty and how we as humans will do almost anything to avoid it. To get a really good summary of the keynote check out Gojko Adzic’s <a href="http://gojko.net/2011/11/10/dan-north-at-oredev-embrace-uncertainty/">review</a>.</p>
<p>The <a href="http://agilemanifesto.org/">Agile Manifesto</a> is all about embracing change (uncertainty) but we are not living up to it. Process and tools are still winning over individuals and interactions. It’s the same thing with the other principles in the manifesto. It is so hard to fight against human nature and to accept that some things are uncertain, that some risks are unforeseeable, that some tasks cannot be estimated. It is so easy to fall back into waterfall even if we say we are doing Agile/Scrum/Kanban. So true, so deep. Dan has a solution with <a href="http://dannorth.net/2010/08/30/introducing-deliberate-discovery/">Deliberate Discovery</a>, not an easy solution by any means and a tough sell to customers and colleagues. A brilliant keynote that will stay with me for a long time.</p>
<p><a href="http://danlimerick.files.wordpress.com/2011/11/imag0881.jpg"><img class="alignnone size-full wp-image-135" title="Embracing Uncertainty" src="http://danlimerick.files.wordpress.com/2011/11/imag0881.jpg?w=640&#038;h=383" alt="" width="640" height="383" /></a></p>
<h3>Domain Driven Design and Agile</h3>
<p>This was one of my dips today. A session by Tomas Karlsson from <a href="http://www.fra.se/">FRA</a> (Sweden’s version of the NSA) on DDD and Scrum that just never grabbed me. As everything from FRA is classified, he couldn’t use real examples from their domain models and instead used a sample model. This really lessened the impact of his talk.</p>
<p>He had a few interesting points about mixing Scrum and DDD and how they sometimes clash. Both in interactions with other teams and when refactoring the domain model. And he had neat little whirlpool model of development for the domain model. First Harvest requirement –&gt; Model them –&gt; do a Code Probe to test the model’s api –&gt; challenge the Model with a new scenario. Rinse, repeat.</p>
<p>Maybe I am not in the target audience for this type of session but it I didn’t get much out of this. Don’t recommend watching this on video.</p>
<h3>Sleeping with the Enemy</h3>
<p>Another real high with Gojko Adzic. All about trust issues and tearing down the artificial walls between developers and testers. He talked about how mistrust manifests itself in the development process through processes like Requirement Signoffs and Change Requests. Alibi generators – ways to point the finger at someone else and say it wasn’t my fault. Gojko has worked with some companies that haven’t had a bug in months/years and none of them use these processes.</p>
<p>At this point Gojko challenged the audience with this question: Who should be responsible for functional tests; programmers or testers? There were some testers in the audience that voted testers and some that tried to answer both. The right answer according to Gojko (and I agree) is programmers. Tear down the walls, programmers have to be able to test and they have to write the functional tests. Testing and quality should be a part of the process from the first line of code to the last. Testers should be more like test architects advising programmers on what they should be testing and instead focussing on high value activities like usability and exploratory testing. Check this out when the videos for Öredev are released. Compulsory viewing for all programmers.</p>
<h3>Zen and the Art of Programming</h3>
<p>Mark Rendle (<a href="https://twitter.com/#!/markrendle">@markrendle</a>)  did a reading of Zen and the Art of Motorcycle Maintenance and applied it to software development. A deep, philosophical talk that tried to get to the core of why we develop software and how we should practise it. About being a professional and producing quality. He used the concept of Gumption (get up and go, motivation) from the book and how not to lose it. There are a list of gumption traps, some internal and some external, that we all experience at some time or other.</p>
<p>For example, boredom is one I have personally fought against a few times. You’re doing yet another &lt;insert boring project type here&gt; and just can’t wait to get it done so that you go home. In to work at 9 and out at 5, and leaving your brain at home. Mark then gave the advice to think of this in a different way. Put yourself in the user’s shoes, they are going to be using this system for 8 hours a day and if you don’t do the best job you can then you are ruining a third of their life. So be a professional and make the system as user-friendly and brilliant as you can. You’ll be happier in the long run this way.</p>
<p>Mark was previously a stand-up comedian and he timed it perfectly with his line when someone’s mobile started ringing during his closing. I can’t (or don’t want to) quote it here but that alone makes it worth watching this session on video. Recommended.</p>
<h3>Cloud First Services</h3>
<p>Marc Mercuri from Microsoft did a session on the cloud. I really don’t have anything (or anything constructive) to say about this. The worst session I have been at by far.</p>
<h3></h3>
<h3>How to get productive in a project in 24 hours</h3>
<p>Greg Young started the session by explaining why he was wearing a Celine Dion t-shirt. A bet is a bet and he keeps his promises. This was yet another tremendous (I have to find some more superlatives for Friday) talk. He explained his tricks and techniques to get going fast when consulting for a new customer.</p>
<p>The first trick, find the bug hive in the code of the customer’s system. By analyzing the source control history to find the places in the code that change frequently due to bug fixes. Valuable information to kick-start interesting conversations with your customer.</p>
<p>The next tip was to use Continuous Integration even if your customer doesn’t. Install Teamcity locally and you’ll see when your fellow developers break the build.</p>
<p>After that Greg showed us how to do a quick dive into an unfamiliar codebase with NDepend. Find cycles in the dependencies, examine the coupling of classes and for things like <a href="http://en.wikipedia.org/wiki/Cyclomatic_complexity">cyclomatic complexity</a>. NDepend has its own query language where you can query the code to find methods that have more than 8 parameters or a lot of coupling for example.</p>
<p>Greg did a demo of Mighty Moose (Continuous Tests) his own product for continuous testing and code analysis. I’m beta testing this at the moment so that will be a future blog post (I promise!).</p>
<p>I’m skipping a bit here as there were a lot of valuable nuggets in this talk. This was a fantastic finish to a great day. Thanks again <a href="http://www.activesolution.se/">Active Solution</a> for sending me!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/danlimerick.wordpress.com/127/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/danlimerick.wordpress.com/127/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/danlimerick.wordpress.com/127/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/danlimerick.wordpress.com/127/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/danlimerick.wordpress.com/127/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/danlimerick.wordpress.com/127/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/danlimerick.wordpress.com/127/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/danlimerick.wordpress.com/127/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/danlimerick.wordpress.com/127/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/danlimerick.wordpress.com/127/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/danlimerick.wordpress.com/127/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/danlimerick.wordpress.com/127/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/danlimerick.wordpress.com/127/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/danlimerick.wordpress.com/127/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danlimerick.wordpress.com&amp;blog=17071466&amp;post=127&amp;subd=danlimerick&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://danlimerick.wordpress.com/2011/11/10/redev-2011-day-2-rollercoaster-ride/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.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/2011/11/imag0881.jpg" medium="image">
			<media:title type="html">Embracing Uncertainty</media:title>
		</media:content>
	</item>
		<item>
		<title>&#214;redev 2011&#8211;My Summary of Day 1</title>
		<link>http://danlimerick.wordpress.com/2011/11/09/redev-2011my-summary-of-day-1/</link>
		<comments>http://danlimerick.wordpress.com/2011/11/09/redev-2011my-summary-of-day-1/#comments</comments>
		<pubDate>Wed, 09 Nov 2011 16:58:43 +0000</pubDate>
		<dc:creator>Daniel Lee</dc:creator>
				<category><![CDATA[Øredev]]></category>
		<category><![CDATA[Öredev Oredev Øredev]]></category>

		<guid isPermaLink="false">https://danlimerick.wordpress.com/?p=123</guid>
		<description><![CDATA[Today, Wednesday, was day 1 for me at Öredev (there were two tutorial days on Monday and Tuesday which I did not attend). It’s been really great so far, so thank you Active Solution for sending me. I have taken &#8230; <a href="http://danlimerick.wordpress.com/2011/11/09/redev-2011my-summary-of-day-1/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danlimerick.wordpress.com&amp;blog=17071466&amp;post=123&amp;subd=danlimerick&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Today, Wednesday, was day 1 for me at Öredev (there were two tutorial days on Monday and Tuesday which I did not attend). It’s been really great so far, so thank you <a href="http://www.activesolution.se/">Active Solution</a> for sending me. I have taken tons of notes so hopefully I can squeeze all of those into an interesting summary. It started with a fun keynote from Alexis Ohanian, a co-founder of Reddit, about starting a company and delighting your customers. And ended with a thought provoking keynote by Neal Ford from Thoughtworks entitled the Abstraction Distraction. Very relevant for all programmers, as we work daily with abstractions and most (or all) of them leak. I absolutely loved his onion skin api concept. He used Active Record in Ruby on Rails and Git as examples, the idea being that you can used Active Record at the highest level for 80% of all cases but for the other 20% it leaks the layer underneath in a good way so that it is easy to dive directly into writing SQL if needed.</p>
<p>All the sessions were good but I think my favourite session was Christian Johansen’s session on Test-driven Javascript (see review below).</p>
<p>So here is my summary in chronological order of all the sessions I attended.</p>
<h3>C# 5: Async 101</h3>
<p>Jon Skeet investigated the new async feature keywords coming in .NET 5. He did this by using following the spec for .NET 5 and implementing it himself using .NET 4. Impressively geeky. Check out his blog series describing his <a href="http://msmvps.com/blogs/jon_skeet/archive/2011/05/08/eduasync-part-1-introduction.aspx">EduAsync</a> project. Jon is very English in a Black Adder/Monty Python fashion which when combined with the geekiness of deep-diving into how the C# compiler works, made for a strange and interesting session.</p>
<h3>SproutCore</h3>
<p>Yehuda Katz, a core committer on the jQuery, Ruby on Rails and SproutCore projects, gave an introduction on just <a href="http://www.sproutcore.com/">SproutCore</a>. SproutCore is a Javascript MVC framework and a competitor to projects such as <a href="http://documentcloud.github.com/backbone/">Backbone</a> and <a href="http://knockoutjs.com/">KnockOut.js</a>. Yehuda was pretty low-key and took the programming approach to showing off SproutCore. He had a really cool slide deck build with SproutCore which had an inbuilt console for live coding of SproutCore examples. And this, more than what he said, really showcased SproutCore. It builds on bindings to SproutCore objects or raw Javascript objects which make it really easy to make views update automatically. I could definitely see the benefits and will probably be using this or one of the other similar projects in the near future.</p>
<h3>Resty Galore</h3>
<p>I follow Sebastien Lambla (<a href="https://twitter.com/#!/serialseb">@serialseb</a> ) on Twitter and chose to go this session because I was intrigued by this quote “Now, time to take pictures of that unicorn&#8230;” at 3 o’clock at night. I felt I couldn’t miss REST combined with unicorns and it was even better than I imagined. Sebastien used a secret agent unicorn named Resty Galore to illustrate links and forms in REST. Resty Galore had a mission to get to Malmö from Paris implemented as a series of http requests and responses. The first implementation was very procedural and rigid so Sebastien proceeded to introduce links and forms to reduce coupling in the workflow. At the beginning of the session I was wondering how would I ever apply this in my real life projects but by the end I had a few ideas about where I could use it. Any project with a lot of jQuery ajax calls and callbacks could potentially reap benefits of this approach. Intriguing is the right word here. More investigation required on my part.</p>
<h3>Building mobile web apps using ASP.NET MVC 4, HTML 5 and jQuery Mobile</h3>
<p>Phil Haack from the ASP.NET MVC team at Microsoft presented on the new mobile features coming in ASP.NET MVC 4. He started with Adaptive Rendering of current web pages so that they look better on mobile devices. MVC 4 will have a new default template which by using CSS 3 will change the layout automatically when the viewing device’s screen  is narrower than 850 pixels. Next up was a new DisplayMode features with which you can create pages specifically for a mobile device i.e. Iphone or Android. Phil then showed some jQuery Mobile stuff which is very interesting and feels like it will be how I get started with mobile development. And then lastly he showed off some of the new HTML 5 offline capabilities of jQuery Mobile. See this <a href="http://oredev2011.haacked.com/">website here</a>, connect once and then go offline to test it yourself!</p>
<h3>Test Driving Javascript</h3>
<p>Christian Johansen from Gitorious showed off some mad Javascript skills at this session. The programmer in me was very impressed. He built a jQuery plugin for autocomplete of a search for film database using TDD. Using <a href="http://code.google.com/p/js-test-driver/">js-test-driver</a>, a unit testing framework, and <a href="http://sinonjs.org/">sinon</a>, a mocking framework, Christian used a fine-grained Test Driven approach to coding the plugin. He started with one large functional test that failed and then wrote around 10 unit tests to drive the design. And the revelation was that the process was exactly the same as using TDD in any other language. He used constructor injection to get rid of a jQuery ajax dependency in a class and he used sinon to stub out the ajax calls and to stub out the timing issues. I will be buying his new <a href="http://tddjs.com/">Test-Driven Javascript Development book</a>. js-test-driver works well with Continuous Integration servers so no excuses; it’s time for me to TDD my Javascript as well.</p>
<h3>Node.js</h3>
<p>The last session of the day was about Node with Felix Geisendörfer, one of the core committers. It was a nice little introduction to Node where Felix showed off the various killer features of Node; Websockets, proxying data streams and parallelizing I/O and more. It has just been ported to Windows and the integration with IIS has begun so I will probably be using this sometime in the future. But not this year, so this is one technology that I’ll look at again when it is a bit more established on the Windows platform.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/danlimerick.wordpress.com/123/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/danlimerick.wordpress.com/123/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/danlimerick.wordpress.com/123/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/danlimerick.wordpress.com/123/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/danlimerick.wordpress.com/123/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/danlimerick.wordpress.com/123/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/danlimerick.wordpress.com/123/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/danlimerick.wordpress.com/123/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/danlimerick.wordpress.com/123/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/danlimerick.wordpress.com/123/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/danlimerick.wordpress.com/123/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/danlimerick.wordpress.com/123/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/danlimerick.wordpress.com/123/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/danlimerick.wordpress.com/123/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danlimerick.wordpress.com&amp;blog=17071466&amp;post=123&amp;subd=danlimerick&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://danlimerick.wordpress.com/2011/11/09/redev-2011my-summary-of-day-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.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>&#216;redev 2011</title>
		<link>http://danlimerick.wordpress.com/2011/11/09/redev-2011/</link>
		<comments>http://danlimerick.wordpress.com/2011/11/09/redev-2011/#comments</comments>
		<pubDate>Wed, 09 Nov 2011 12:05:05 +0000</pubDate>
		<dc:creator>Daniel Lee</dc:creator>
				<category><![CDATA[Øredev]]></category>
		<category><![CDATA[Öredev]]></category>

		<guid isPermaLink="false">https://danlimerick.wordpress.com/?p=120</guid>
		<description><![CDATA[I’m here in Malmö at Øredev 2011. First impressions are very positive; great locale at Slagthuset and a really cosy, intimate atmosphere despite the large number of developers here. The celebrity-spotting is pretty fun too, (if you can call developers &#8230; <a href="http://danlimerick.wordpress.com/2011/11/09/redev-2011/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danlimerick.wordpress.com&amp;blog=17071466&amp;post=120&amp;subd=danlimerick&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I’m here in Malmö at Øredev 2011. First impressions are very positive; great locale at Slagthuset and a really cosy, intimate atmosphere despite the large number of developers here. The celebrity-spotting is pretty fun too, (if you can call developers like Yehuda Katz, Gary Short or Phil Haack celebrities) it means you keep your eyes open and look around.</p>
<p>I will be blogging more about the sessions that I have attended later on this evening. See you then.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/danlimerick.wordpress.com/120/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/danlimerick.wordpress.com/120/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/danlimerick.wordpress.com/120/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/danlimerick.wordpress.com/120/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/danlimerick.wordpress.com/120/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/danlimerick.wordpress.com/120/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/danlimerick.wordpress.com/120/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/danlimerick.wordpress.com/120/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/danlimerick.wordpress.com/120/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/danlimerick.wordpress.com/120/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/danlimerick.wordpress.com/120/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/danlimerick.wordpress.com/120/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/danlimerick.wordpress.com/120/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/danlimerick.wordpress.com/120/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danlimerick.wordpress.com&amp;blog=17071466&amp;post=120&amp;subd=danlimerick&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://danlimerick.wordpress.com/2011/11/09/redev-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.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>Getting around Nuget&#8217;s External Package dependency problem</title>
		<link>http://danlimerick.wordpress.com/2011/10/01/getting-around-nugets-external-package-dependency-problem/</link>
		<comments>http://danlimerick.wordpress.com/2011/10/01/getting-around-nugets-external-package-dependency-problem/#comments</comments>
		<pubDate>Fri, 30 Sep 2011 22:01:48 +0000</pubDate>
		<dc:creator>Daniel Lee</dc:creator>
				<category><![CDATA[Nuget]]></category>
		<category><![CDATA[PowerShell]]></category>
		<category><![CDATA[FluentMigrator]]></category>
		<category><![CDATA[NuGet]]></category>
		<category><![CDATA[Windows PowerShell]]></category>

		<guid isPermaLink="false">https://danlimerick.wordpress.com/?p=109</guid>
		<description><![CDATA[I’ve already blogged about how to create simple Nuget packages using Rake and Albacore, now to the advanced part. I used FluentMigrator as the example in my previous post and it was while creating the second package for FluentMigrator that &#8230; <a href="http://danlimerick.wordpress.com/2011/10/01/getting-around-nugets-external-package-dependency-problem/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danlimerick.wordpress.com&amp;blog=17071466&amp;post=109&amp;subd=danlimerick&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I’ve already blogged about <a href="http://danlimerick.wordpress.com/2011/09/30/creating-nuget-packages-with-rake-and-albacore-2/">how to create simple Nuget packages using Rake and Albacore</a>, now to the advanced part.</p>
<p>I used <a href="https://github.com/schambers/fluentmigrator">FluentMigrator</a> as the example in my previous post and it was while creating the second package for FluentMigrator that I ran into a ‘feature’ of Nuget.</p>
<p>We had decided to divide the FluentMigrator package into two packages, the main core package and a new <a href="http://nuget.org/List/Packages/FluentMigrator.Tools">FluentMigrator.Tools</a> package. FluentMigrator.Tools contains all the extra dlls that we didn’t want to put in the core package. Basically, there are four versions of the tools directory, one for each supported .NET version and per platform (.NET 3.5 and 4.0, x86 and x64). The idea is that if you need the x86 3.5 version of the migration runners then the core package is sufficient otherwise you need to fetch the FluentMigrator.Tools Nuget package.</p>
<p>The core package has a lib directory which contains the FluentMigrator dll. So I created a dependency on the core package in the Tools package so that when you download the Tools package from Nuget it also downloads the core package. This meant that the Tools package only contained a tools directory at the root, no lib and no content directory.</p>
<h3>Side Note on how to test your Nuget package</h3>
<p>To test your newly created Nuget package (always a good idea!) point your Nuget source in Visual Studio to your nupkg file. In Visual Studio 2010 go to Tools-&gt;Library Package Manager-&gt;Package Manager Settings then choose Package Sources in the left hand menu and add the directory which contains the nupkg file to be tested. Then when adding a package from the Package Manager Console, in the Package Source dropdown menu to the upper left you should have two choices now; Nuget official package source and your new test source. So choose your test source and <em>install-package NameOfYourPackage</em> and test it out.</p>
<h3>To the heart of the matter</h3>
<p>While testing the Tools package in the Package Manager Console I got the following incomprehensible error:</p>
<p><em>External packages cannot depend on packages that target projects</em></p>
<p><a href="http://twitter.com/#!/stevensanderson">Steve Sanderson</a> ran into this problem first and filed an <a href="http://nuget.codeplex.com/workitem/595">issue</a> on Codeplex in which he also mentions a workaround (Thank you Steve!). The reason for this error is that my new FluentMigrator.Tools package only contains a tools directory and no content or lib directory and Nuget has decided that it therefore may not be dependent on a package that does contain a lib or content directory.</p>
<p>The solution is a big, fat hack. Add a content directory with a dummy text file and then use a powershell script to remove it from the target project after you have installed the Nuget package.</p>
<h3>Diving into PowerShell</h3>
<p>At this stage you will want to have the <a href="http://docs.nuget.org/docs/creating-packages/creating-and-publishing-a-package">Nuget documentation</a> open so that you check out the different conventions around powershell and Nuget. I created a text file named InstallationDummyFile.txt and placed it in the <strong>content</strong> directory and a powershell file named install.ps1 and placed it in the root of the <strong>tools</strong> directory. install.ps1 looks like this:</p>
<div id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:bee9ffbe-a51e-40cc-bca3-a1196472c1e5" class="wlWriterEditableSmartContent" style="display:inline;float:none;margin:0;padding:0;"><pre class="brush: powershell; pad-line-numbers: true;">
param($installPath, $toolsPath, $package, $project)

$project.ProjectItems | ForEach { if ($_.Name -eq &quot;InstallationDummyFile.txt&quot;) { $_.Remove() } }
$projectPath = Split-Path $project.FullName -Parent
Join-Path $projectPath &quot;InstallationDummyFile.txt&quot; | Remove-Item
</pre></p>
</div>
<p>It does two things:</p>
<ul>
<li>Removes the reference to InstallationDummyFile.txt from the project by looping through ProjectItems until it finds the text file.</li>
<li>Deletes the InstallationDummyFile.txt file. First I get the path to the project file and store it in $projectPath and create a new path by joining it with the file name and then remove it from the project directory.</li>
</ul>
<p>I am a total beginner when it comes to powershell so this was a bit of a struggle (and maybe will be for others?). The above calls are pipelines and start on the left with a bar (|) separating the different stages. E.g. The Join-Path function takes in two parameters and returns a new path to the text file, this is then passed on the next stage in the pipeline as a parameter. Remove-Item takes in the newly generated path as a parameter and deletes the file. Read the <a href="http://docs.nuget.org/docs/creating-packages/creating-and-publishing-a-package">Nuget documentation</a> for more info on the parameters passed in on the first line.</p>
<h3>The Result</h3>
<p>Now when you install the Tools package it first downloads its dependency, the core package, and adds a reference to the FluentMigrator dll in the target project. As the Tools package now has a content file, Nuget no longer classes it as an “external package”. Next Nuget installs the Tools package in the packages directory alongside the core package and calls install.ps1. This removes the dummy file from the project (both as a reference and by physically deleting the file from the project folder) and now there is no incriminating evidence left of us fooling Nuget. When creating my <a href="http://danlimerick.wordpress.com/2011/06/01/migrations-with-rake-albacore-and-fluentmigrator/">Rake script to run migrations</a>, I can now refer to the console runner in the FluentMigrator.Tools directory in the Nuget package directory. Mission accomplished.</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/2011/09/30/creating-nuget-packages-with-rake-and-albacore-2/">Creating Nuget packages with Rake and Albacore</a> (danlimerick.wordpress.com)</li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/danlimerick.wordpress.com/109/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/danlimerick.wordpress.com/109/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/danlimerick.wordpress.com/109/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/danlimerick.wordpress.com/109/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/danlimerick.wordpress.com/109/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/danlimerick.wordpress.com/109/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/danlimerick.wordpress.com/109/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/danlimerick.wordpress.com/109/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/danlimerick.wordpress.com/109/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/danlimerick.wordpress.com/109/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/danlimerick.wordpress.com/109/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/danlimerick.wordpress.com/109/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/danlimerick.wordpress.com/109/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/danlimerick.wordpress.com/109/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danlimerick.wordpress.com&amp;blog=17071466&amp;post=109&amp;subd=danlimerick&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://danlimerick.wordpress.com/2011/10/01/getting-around-nugets-external-package-dependency-problem/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.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>Creating Nuget packages with Rake and Albacore</title>
		<link>http://danlimerick.wordpress.com/2011/09/30/creating-nuget-packages-with-rake-and-albacore-2/</link>
		<comments>http://danlimerick.wordpress.com/2011/09/30/creating-nuget-packages-with-rake-and-albacore-2/#comments</comments>
		<pubDate>Fri, 30 Sep 2011 21:10:31 +0000</pubDate>
		<dc:creator>Daniel Lee</dc:creator>
				<category><![CDATA[Albacore]]></category>
		<category><![CDATA[FluentMigrator]]></category>
		<category><![CDATA[Nuget]]></category>
		<category><![CDATA[Rake]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[NuGet]]></category>

		<guid isPermaLink="false">https://danlimerick.wordpress.com/?p=100</guid>
		<description><![CDATA[Creating a Nuget package is quite simple in theory and creating one manually can be done in a few minutes. But simple, repetitive tasks are easy to mess up and a tested build script will never include the wrong config &#8230; <a href="http://danlimerick.wordpress.com/2011/09/30/creating-nuget-packages-with-rake-and-albacore-2/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danlimerick.wordpress.com&amp;blog=17071466&amp;post=100&amp;subd=danlimerick&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Creating a Nuget package is quite simple in theory and creating one manually can be done in a few minutes. But simple, repetitive tasks are easy to mess up and a tested build script will never include the wrong config file because it was thinking about coffee and cinnamon buns. Besides who wants to do this by hand every release, it’s a perfect task to be automated.</p>
<p>I helped to change FluentMigrator’s <a href="https://github.com/schambers/fluentmigrator/blob/master/packages/packaging.rb">packaging script</a> to create a Nuget package a while ago, so I’ll use that to illustrate how to create a Nuget package with Rake and Albacore.</p>
<p>All Nuget packages need a nuspec file and there are two ways to script this. The first way is to just create a nuspec file manually and then update the version with the build script. Nancy uses this approach, see <a href="https://github.com/NancyFx/Nancy/blob/master/rakefile.rb">here</a>. They parse the nuspec files with an XML parser to find the right nodes, such as version, to update. Nancy has a lot of packages so they search after nuspec files and create a package when they find one. With FluentMigrator we only have two packages so I used Albacore and the <a href="https://github.com/derickbailey/Albacore/wiki/Nuspec-Task">Nuspec task</a> to create the nuspec file:</p>
<div id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:07d962ca-273a-4864-bbf7-af16ee376384" class="wlWriterEditableSmartContent" style="display:inline;float:none;margin:0;padding:0;"><pre class="brush: ruby;">
desc &quot;create the FluentMigrator nuspec file&quot;
  nuspec :create_spec do |nuspec|
     version = &quot;#{ENV['version']}&quot;

     nuspec.id = &quot;FluentMigrator&quot;
     nuspec.version = version.length == 7 ? version : FLUENTMIGRATOR_VERSION
     nuspec.authors = &quot;Josh Coffman&quot;
     nuspec.owners = &quot;Sean Chambers&quot;
     nuspec.description = &quot;FluentMigrator description which is really long.&quot;
     nuspec.title = &quot;Fluent Migrator&quot;
     nuspec.language = &quot;en-US&quot;
     nuspec.projectUrl = &quot;https://github.com/schambers/fluentmigrator/wiki/&quot;
     nuspec.working_directory = &quot;packages/FluentMigrator&quot;
     nuspec.output_file = &quot;FluentMigrator.nuspec&quot;
  end
</pre></p>
</div>
<p>The only bit of logic here is for setting the version. There is a default version defined as constant but this can be overwritten by passing in a command line parameter.</p>
<p>FluentMigrator has a working directory for packaging where I copied in the files to be included in the Nuget package. Nuget uses conventions for the directory names in the working directory. The three conventions are:</p>
<ol>
<li><strong>lib</strong>for the assembly references to be installed into the target project,</li>
<li><strong>tools</strong>for the command line tools and powershell scripts and</li>
<li><strong>content </strong>for files that are copied into the root of the target project.</li>
</ol>
<p>The main FluentMigrator package only uses lib and tools. Lib contains two subdirectories one for .NET 3.5 and one for 4.0. So the FluentMigrator dlls are copied into the appropriate lib subdirectories, the .NET 3.5 dll into lib\35 and the 4.0 dll into lib\40. Into the tools directory go all the different runners: the command line runner, the MSBuild runner and the Nant runner as well as all the dlls for the supported sql providers.</p>
<p>Then you just need to run the Nuget command line and call the pack command to create a nupkg file:</p>
<div id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:decadb57-c48b-4d0e-81b7-505b1d227956" class="wlWriterEditableSmartContent" style="display:inline;float:none;margin:0;padding:0;"><pre class="brush: ruby;">
def nuget_pack(base_folder, nuspec_path)
    cmd = Exec.new
    output = 'nuget/'
    cmd.command = 'tools/NuGet.exe'
    cmd.parameters = &quot;pack #{nuspec_path} -basepath #{base_folder} -outputdirectory #{output}&quot;
    cmd.execute
  end
</pre></p>
</div>
<p>There is an Albacore task for this but I’ve gone with the Exec task instead here.  And this is called like this:</p>
<div id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:bc87b53e-a227-410a-bbfb-2609328871b2" class="wlWriterEditableSmartContent" style="display:inline;float:none;margin:0;padding:0;"><pre class="brush: ruby;">
nuget_pack('packages/FluentMigrator/', 'packages/FluentMigrator/FluentMigrator.nuspec')
</pre></p>
</div>
<p>So to recap; the script creates a nuspec file, copies in the relevant files into the convention based working directory and then finally calls NuGet.exe with the pack command to create a Nuget package.</p>
<p>Pretty easy so far, it did get a bit more complicated building the second FluentMigrator package that is dependent on the first package. But I’ll leave that for another post.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/danlimerick.wordpress.com/100/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/danlimerick.wordpress.com/100/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/danlimerick.wordpress.com/100/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/danlimerick.wordpress.com/100/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/danlimerick.wordpress.com/100/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/danlimerick.wordpress.com/100/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/danlimerick.wordpress.com/100/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/danlimerick.wordpress.com/100/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/danlimerick.wordpress.com/100/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/danlimerick.wordpress.com/100/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/danlimerick.wordpress.com/100/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/danlimerick.wordpress.com/100/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/danlimerick.wordpress.com/100/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/danlimerick.wordpress.com/100/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danlimerick.wordpress.com&amp;blog=17071466&amp;post=100&amp;subd=danlimerick&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://danlimerick.wordpress.com/2011/09/30/creating-nuget-packages-with-rake-and-albacore-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.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>Review of The Art of Unit Testing</title>
		<link>http://danlimerick.wordpress.com/2011/07/26/review-of-the-art-of-unit-testing/</link>
		<comments>http://danlimerick.wordpress.com/2011/07/26/review-of-the-art-of-unit-testing/#comments</comments>
		<pubDate>Mon, 25 Jul 2011 23:40:21 +0000</pubDate>
		<dc:creator>Daniel Lee</dc:creator>
				<category><![CDATA[Book Review]]></category>
		<category><![CDATA[Roy Osherove]]></category>
		<category><![CDATA[The Art of Unit Testing: With Examples in .Net]]></category>
		<category><![CDATA[Unit testing]]></category>

		<guid isPermaLink="false">https://danlimerick.wordpress.com/?p=93</guid>
		<description><![CDATA[The Art of Unit Testing With Examples in .NET by Roy Osherove, published by Manning. ISBN: 1933988274 Introduction The Art of Unit Testing aims to teach developers how to write maintainable, readable and trustworthy unit tests. The author Roy Osherove &#8230; <a href="http://danlimerick.wordpress.com/2011/07/26/review-of-the-art-of-unit-testing/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danlimerick.wordpress.com&amp;blog=17071466&amp;post=93&amp;subd=danlimerick&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a class="zem_slink" title="The Art of Unit Testing: With Examples in .Net" href="http://www.amazon.com/Art-Unit-Testing-Examples-Net/dp/1933988274%3FSubscriptionId%3D0G81C5DAZ03ZR9WH9X82%26tag%3Dzemanta-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1933988274" rel="amazon">The Art of Unit Testing</a> With Examples in .NET by Roy Osherove, published by Manning. ISBN: 1933988274</p>
<h3>Introduction</h3>
<p>The Art of Unit Testing aims to teach developers how to write maintainable, readable and trustworthy unit tests. The author <a href="http://osherove.com/">Roy Osherove</a> has recently moved over to the Ruby community but is well-known in the .NET world for his TDD courses and <a href="http://osherove.com/tdd-kata-1/">TDD katas</a>. He previously worked at <a href="http://www.typemock.com/">TypeMock</a> as Chief Architect so he lived and breathed unit tests for a few years.</p>
<p>This book is not what I had expected after reading all the online reviews. It is most definitely a beginner’s book, a book for someone just starting out with TDD. The first two books I read when getting started with TDD were <em>Working Effectively with Legacy Cod</em>e by Michael Feathers and<em> Growing Object-Oriented Software, Guided by Tests</em> by Steve Freeman and Nat Pryce. The Art of Unit Testing refers heavily to them and I would describe it as an introduction to unit testing. I noticed that The Art of Unit Testing placed above them on Jurgen Appelo&#8217;s <a title="Top 100 Agile Books" href="http://www.noop.nl/2010/08/top-100-agile-books.html">Top 100 Agile Books list</a> and I do not understand that to be honest. It would have been the perfect text for me during the first month of beginning TDD but feels mostly redundant after reading the two afore mentioned books.</p>
<h3>The Meat of the Book</h3>
<p>The Art of Unit Testing is well-written and easy to read, I flew through it in a few sessions. The first three chapters are a very basic introduction to unit testing. It gets a bit more interesting after that with nice, clear explanations of stubbing and mocking in chapters 4 to 6. Chapter 6 also contains a section on creating a test API that I really liked. It is the section of the book that I am most likely to reread later. Chapter 7 goes a bit deeper into writing tests and is the most interesting part of the book. It manages to gather together most of the good tips on unit testing that I have seen before e.g. enforcing test isolation, practising DRY even in your tests, keep setup code simple, avoiding overspecification. Chapter 8 is non-technical and is about getting your organisation to start unit testing. The rest of the book lists the various unit testing tools and frameworks available as well as the classic TDD books that you should read.</p>
<h3>The parts that could be better</h3>
<p>The lists of tools has not dated too well. The book is written in 2009 and a lot has changed in two years. Mocking frameworks like NSubstitute and FakeItEasy are not included and Rhino Mocks gets a lot of attention. The newer BDD tools like Specflow are also not included. Those sections will be near worthless in a couple of years time.</p>
<p>The last chapter on working with legacy code is very skimpy for a subject that is both huge and difficult. And generally, a lot more could have been written about unit testing. Nothing about Object Mothers or Test Builders (check out <a href="http://lostechies.com/derekgreer/2011/07/19/effective-tests-avoiding-context-obscurity/">this article</a> from Los Techies or read Growing Object-Oriented Software, Guided by Tests). Not much on GUI testing with Selenium or integration testing the database or the BDD-style of testing. When I write code I do not really separate writing production code and writing unit tests, the two go hand in hand. And this makes the book less valuable than a good book on TDD even if I can understand why the author chose to do so. There are a lot of .NET developers out there who know nothing about unit testing or TDD and something like <a href="http://www.growing-object-oriented-software.com/">GOOS</a> would scare off most of them.</p>
<p>The formatting of the code samples is dreadful, the alignment is off in almost half of them. You can still read and understand them but it feels low quality. I am reading another Manning book at the moment and its formatting is fine so I cannot understand how that got in to the final version.</p>
<h3>And the verdict is…</h3>
<p>I would recommend The Art of Unit Testing for anyone getting started with writing unit tests but not if you have been doing TDD for a while and have already read some of the recommended texts on TDD. It’s a nice, smooth read and very easy to absorb but it is only about unit testing and not TDD (a minus for me) and there is almost nothing about writing testable code, a huge part of testing in my opinion.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/danlimerick.wordpress.com/93/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/danlimerick.wordpress.com/93/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/danlimerick.wordpress.com/93/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/danlimerick.wordpress.com/93/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/danlimerick.wordpress.com/93/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/danlimerick.wordpress.com/93/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/danlimerick.wordpress.com/93/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/danlimerick.wordpress.com/93/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/danlimerick.wordpress.com/93/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/danlimerick.wordpress.com/93/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/danlimerick.wordpress.com/93/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/danlimerick.wordpress.com/93/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/danlimerick.wordpress.com/93/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/danlimerick.wordpress.com/93/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danlimerick.wordpress.com&amp;blog=17071466&amp;post=93&amp;subd=danlimerick&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://danlimerick.wordpress.com/2011/07/26/review-of-the-art-of-unit-testing/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.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>Git for Windows tip: How to copy and paste into Bash</title>
		<link>http://danlimerick.wordpress.com/2011/07/23/git-for-windows-tip-how-to-copy-and-paste-into-bash/</link>
		<comments>http://danlimerick.wordpress.com/2011/07/23/git-for-windows-tip-how-to-copy-and-paste-into-bash/#comments</comments>
		<pubDate>Sat, 23 Jul 2011 21:36:29 +0000</pubDate>
		<dc:creator>Daniel Lee</dc:creator>
				<category><![CDATA[git]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[msysgit]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">https://danlimerick.wordpress.com/?p=91</guid>
		<description><![CDATA[Per default the only way to copy and paste into the Git Bash is to click on the git icon in the top left corner and select Edit-&#62;Mark/Copy/Paste. This is actually not a property of Git Bash. It is just &#8230; <a href="http://danlimerick.wordpress.com/2011/07/23/git-for-windows-tip-how-to-copy-and-paste-into-bash/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danlimerick.wordpress.com&amp;blog=17071466&amp;post=91&amp;subd=danlimerick&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Per default the only way to copy and paste into the Git Bash is to click on the git icon in the top left corner and select Edit-&gt;Mark/Copy/Paste. This is actually not a property of Git Bash. It is just how the Windows console runner works i.e. the standard command prompt.</p>
<p>There are two solutions to be able to copy/paste with the keyboard and directly with the mouse. The first is to use a different console, see Scott Hanselman’s <a href="http://www.hanselman.com/blog/Console2ABetterWindowsCommandPrompt.aspx">post on Console2</a>. I haven’t tried this yet so let me know in the comments if you use Console2 and can recommend it.</p>
<p>The other solution is to enable QuickEdit Mode under Options-&gt;Edit Options in the properties for the console. To open the Properties dialog, click the Git icon in the top left corner of the console and choose Properties in the menu.</p>
<p><a href="http://danlimerick.files.wordpress.com/2011/07/msysgitpropertiescapture.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="msysgitPropertiesCapture" src="http://danlimerick.files.wordpress.com/2011/07/msysgitpropertiescapture_thumb.png?w=415&#038;h=508" alt="msysgitPropertiesCapture" width="415" height="508" border="0" /></a></p>
<p>Now you can select text with the mouse and right click to copy. Pasting is done by either right clicking with the mouse or pressing the Insert key. Still more awkward than using Ctrl-C and Crtl-V so maybe it is time to check out Console2.</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/2011/06/10/git-for-windows-tip-setting-shell-aliases-with-msysgit/">Git for Windows tip: Setting shell aliases with msysgit</a> (danlimerick.wordpress.com)</li>
<li class="zemanta-article-ul-li"><a href="http://danlimerick.wordpress.com/2011/07/11/git-for-windows-tip-setting-home-and-the-startup-directory/">Git for Windows tip: Setting $HOME and the startup directory</a> (danlimerick.wordpress.com)</li>
<li class="zemanta-article-ul-li"><a href="http://danlimerick.wordpress.com/2011/06/12/git-for-windows-tip-setting-an-editor/">Git for Windows tip: setting an editor</a> (danlimerick.wordpress.com)</li>
<li class="zemanta-article-ul-li"><a href="http://danlimerick.wordpress.com/2011/06/19/git-for-window-tip-use-p4merge-as-mergetool/">Git for Window tip: Use P4Merge as mergetool</a> (danlimerick.wordpress.com)</li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/danlimerick.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/danlimerick.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/danlimerick.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/danlimerick.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/danlimerick.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/danlimerick.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/danlimerick.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/danlimerick.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/danlimerick.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/danlimerick.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/danlimerick.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/danlimerick.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/danlimerick.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/danlimerick.wordpress.com/91/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danlimerick.wordpress.com&amp;blog=17071466&amp;post=91&amp;subd=danlimerick&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://danlimerick.wordpress.com/2011/07/23/git-for-windows-tip-how-to-copy-and-paste-into-bash/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.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/2011/07/msysgitpropertiescapture_thumb.png" medium="image">
			<media:title type="html">msysgitPropertiesCapture</media:title>
		</media:content>
	</item>
		<item>
		<title>Git for Windows tip: Setting $HOME and the startup directory</title>
		<link>http://danlimerick.wordpress.com/2011/07/11/git-for-windows-tip-setting-home-and-the-startup-directory/</link>
		<comments>http://danlimerick.wordpress.com/2011/07/11/git-for-windows-tip-setting-home-and-the-startup-directory/#comments</comments>
		<pubDate>Mon, 11 Jul 2011 16:38:52 +0000</pubDate>
		<dc:creator>Daniel Lee</dc:creator>
				<category><![CDATA[git]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[Environment variable]]></category>
		<category><![CDATA[msysgit]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">https://danlimerick.wordpress.com/?p=78</guid>
		<description><![CDATA[Git for Windows opens bash in the the user profile directory per default and I wanted to change it to the directory with my Github projects instead. I had to try a couple of approaches before finding the solution. Setting &#8230; <a href="http://danlimerick.wordpress.com/2011/07/11/git-for-windows-tip-setting-home-and-the-startup-directory/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danlimerick.wordpress.com&amp;blog=17071466&amp;post=78&amp;subd=danlimerick&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Git for Windows opens bash in the the user profile directory per default and I wanted to change it to the directory with my Github projects instead. I had to try a couple of approaches before finding the solution.</p>
<h3>Setting $HOME</h3>
<p>The first approach I tried was setting the $HOME environment variable. There are a couple different ways of doing this (like messing around with the <em>etc/profile</em> file) but easiest for me was using Windows’ environment variables as Git for Windows/msysgit has access to them. The Home directory for msysgit is set to the <a href="http://en.wikipedia.org/wiki/Environment_variable#Default_Values_on_Microsoft_Windows">Windows environment variable</a> %USERPROFILE%  if no $HOME variable exists. So just create a $HOME environment variable in Windows (see screenshot below)  and msysgit bash will use that as the default. Now you can use the command cd $HOME to go directly to your new home directory.</p>
<p><a href="http://danlimerick.files.wordpress.com/2011/07/evcapture.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="EVCapture" src="http://danlimerick.files.wordpress.com/2011/07/evcapture_thumb.png?w=362&#038;h=396" alt="EVCapture" width="362" height="396" border="0" /></a></p>
<h1></h1>
<h3>But msysgit still opens up in my user profile directory…</h3>
<p>Unfortunately, this does not help with the startup directory problem. The solution is actually really simple. Right-click on the msysgit shortcut and in the <em>Start in</em> field, enter your desired startup directory. Easy if you know how.</p>
<p><a href="http://danlimerick.files.wordpress.com/2011/07/msysgitcapture.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="msysgitCapture" src="http://danlimerick.files.wordpress.com/2011/07/msysgitcapture_thumb.png?w=356&#038;h=477" alt="msysgitCapture" width="356" height="477" border="0" /></a></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/2011/06/10/git-for-windows-tip-setting-shell-aliases-with-msysgit/">Git for Windows tip: Setting shell aliases with msysgit</a> (danlimerick.wordpress.com)</li>
<li class="zemanta-article-ul-li"><a href="http://danlimerick.wordpress.com/2011/06/12/git-for-windows-tip-setting-an-editor/">Git for Windows tip: setting an editor</a> (danlimerick.wordpress.com)</li>
<li class="zemanta-article-ul-li"><a href="http://danlimerick.wordpress.com/2011/06/19/git-for-window-tip-use-p4merge-as-mergetool/">Git for Window tip: Use P4Merge as mergetool</a> (danlimerick.wordpress.com)</li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/danlimerick.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/danlimerick.wordpress.com/78/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/danlimerick.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/danlimerick.wordpress.com/78/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/danlimerick.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/danlimerick.wordpress.com/78/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/danlimerick.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/danlimerick.wordpress.com/78/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/danlimerick.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/danlimerick.wordpress.com/78/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/danlimerick.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/danlimerick.wordpress.com/78/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/danlimerick.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/danlimerick.wordpress.com/78/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danlimerick.wordpress.com&amp;blog=17071466&amp;post=78&amp;subd=danlimerick&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://danlimerick.wordpress.com/2011/07/11/git-for-windows-tip-setting-home-and-the-startup-directory/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.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/2011/07/evcapture_thumb.png" medium="image">
			<media:title type="html">EVCapture</media:title>
		</media:content>

		<media:content url="http://danlimerick.files.wordpress.com/2011/07/msysgitcapture_thumb.png" medium="image">
			<media:title type="html">msysgitCapture</media:title>
		</media:content>
	</item>
		<item>
		<title>Git for Windows tip: Use P4Merge as mergetool</title>
		<link>http://danlimerick.wordpress.com/2011/06/19/git-for-window-tip-use-p4merge-as-mergetool/</link>
		<comments>http://danlimerick.wordpress.com/2011/06/19/git-for-window-tip-use-p4merge-as-mergetool/#comments</comments>
		<pubDate>Sun, 19 Jun 2011 20:53:48 +0000</pubDate>
		<dc:creator>Daniel Lee</dc:creator>
				<category><![CDATA[git]]></category>
		<category><![CDATA[Diff]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[Merge (revision control)]]></category>
		<category><![CDATA[P4Merge]]></category>
		<category><![CDATA[Perforce]]></category>

		<guid isPermaLink="false">https://danlimerick.wordpress.com/?p=73</guid>
		<description><![CDATA[I recently found P4Merge (thank you Twitter and Git Immersion) and instantly dropped WinMerge as my standard diff/merge tool. I really like the way it visualises the differences and the 3-way merge is really nicely done. P4Merge is the merge &#8230; <a href="http://danlimerick.wordpress.com/2011/06/19/git-for-window-tip-use-p4merge-as-mergetool/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danlimerick.wordpress.com&amp;blog=17071466&amp;post=73&amp;subd=danlimerick&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I recently found <a href="http://www.perforce.com/perforce/products/merge.html">P4Merge</a> (thank you Twitter and <a href="http://gitimmersion.com/lab_30.html#main_content">Git Immersion</a>) and instantly dropped WinMerge as my standard diff/merge tool. I really like the way it visualises the differences and the 3-way merge is really nicely done. P4Merge is the merge tool for Perforce (which I have never used) and is both free and can be downloaded separately from the rest of Perforce.</p>
<p>The download can be found <a href="http://www.perforce.com/perforce/downloads/component.html">here</a>. Choose Browse by component-&gt;Clients-&gt;Visual Merge Tool as you do not want to download the whole Perforce client package. In the installer for P4Merge you can choose which components you wish to install, you only need the Visual Merge Tool (P4Merge).</p>
<p><a href="http://danlimerick.files.wordpress.com/2011/06/p4merge.png"><img class="alignnone size-full wp-image-116" title="P4MergeInstall" src="http://danlimerick.files.wordpress.com/2011/06/p4merge.png?w=640" alt=""   /></a></p>
<p>Install p4merge and then set it as your merge tool for git by running the following two config commands:</p>
<div id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:031d4513-990d-4656-902e-4976504cb209" class="wlWriterEditableSmartContent" style="display:inline;float:none;margin:0;padding:0;"><pre class="brush: bash; pad-line-numbers: true; wrap-lines: false;">
git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge.exe \&quot;$BASE\&quot; \&quot;$LOCAL\&quot; \&quot;$REMOTE\&quot; \&quot;$MERGED\&quot;'
</pre></p>
</div>
<p>P4Merge can be used for doing diffs and merges. If using P4Merge for diffs then call:</p>
<div id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:889d1d68-61a5-450a-a9d8-4aa79bc8c4e0" class="wlWriterEditableSmartContent" style="display:inline;float:none;margin:0;padding:0;"><pre class="brush: bash; pad-line-numbers: true;">
git difftool
</pre></p>
</div>
<p>If the file you want to compare is already staged then use the –cached switch after that command.</p>
<p>When Git tells you that there has been conflict, to resolve it type:</p>
<div id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:7f307e9b-3c2b-4559-88c8-683a0c32367c" class="wlWriterEditableSmartContent" style="display:inline;float:none;margin:0;padding:0;"><pre class="brush: bash; pad-line-numbers: true;">
git mergetool
</pre></p>
</div>
<p>This will open P4Merge and show three different versions of the file; your local version, the version you are trying to merge in (probably the master branch) and the base version. The base version is the common ancestor of the local version and the remote version. Choose which version wins or edit the merge manually and then save and quit P4Merge. Finally commit the merge and then remove any .orig files that may be left over. It should be possible to have git remove the .orig file automatically by setting mergetool.keepBackup to false in git config but I have not succeeded in getting that to work for me yet.</p>
<h3>An example of using P4Merge</h3>
<p>And this is what a 3-way merge looks like. The local version on the left, the base version in the middle and the remote version (the master branch) on the right. In the merge window at the bottom all three versions are currently selected. To select the local version, for example, I would click the blue diamond icon and then save and quit.</p>
<p><a href="http://danlimerick.files.wordpress.com/2011/06/p4mergecapture.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;" title="p4mergeCapture" src="http://danlimerick.files.wordpress.com/2011/06/p4mergecapture_thumb.png?w=644&#038;h=387" alt="p4mergeCapture" width="644" height="387" border="0" /></a></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/2011/06/12/git-for-windows-tip-setting-an-editor/">Git for Windows tip: setting an editor</a> (danlimerick.wordpress.com)</li>
<li class="zemanta-article-ul-li"><a href="http://danlimerick.wordpress.com/2011/06/10/git-for-windows-tip-setting-shell-aliases-with-msysgit/">Git for Windows tip: Setting shell aliases with msysgit</a> (danlimerick.wordpress.com)</li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/danlimerick.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/danlimerick.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/danlimerick.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/danlimerick.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/danlimerick.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/danlimerick.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/danlimerick.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/danlimerick.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/danlimerick.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/danlimerick.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/danlimerick.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/danlimerick.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/danlimerick.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/danlimerick.wordpress.com/73/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danlimerick.wordpress.com&amp;blog=17071466&amp;post=73&amp;subd=danlimerick&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://danlimerick.wordpress.com/2011/06/19/git-for-window-tip-use-p4merge-as-mergetool/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.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/2011/06/p4merge.png" medium="image">
			<media:title type="html">P4MergeInstall</media:title>
		</media:content>

		<media:content url="http://danlimerick.files.wordpress.com/2011/06/p4mergecapture_thumb.png" medium="image">
			<media:title type="html">p4mergeCapture</media:title>
		</media:content>
	</item>
	</channel>
</rss>
