<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://codebetter.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Aaron Jensen</title><link>http://codebetter.com/blogs/aaron.jensen/default.aspx</link><description /><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>Simple site sanity testing with Cassini and friends</title><link>http://codebetter.com/blogs/aaron.jensen/archive/2009/11/22/simple-site-sanity-testing-with-cassini-and-friends.aspx</link><pubDate>Mon, 23 Nov 2009 00:11:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:444419</guid><dc:creator>aaronjensen</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/aaron.jensen/rsscomments.aspx?PostID=444419</wfw:commentRss><comments>http://codebetter.com/blogs/aaron.jensen/archive/2009/11/22/simple-site-sanity-testing-with-cassini-and-friends.aspx#comments</comments><description>&lt;p&gt;Recently I wanted to add a very simple sanity check to our sites’ build. Typically the Integration/Selenium RC tests would handle this sort of thing, but I wanted something light enough to go in continuous integration build so we would be protected from simple dll version mishaps, configuration errors, container issues, whatever. There’s probably plenty of ways to do this, and if any of you know of a better way, please let me know. In order to do it, I modified the Cassini source to run as more of a daemon, I created a simple rakefile to launch it and I use curl to verify a test url. For my test Url I simply made a Diagnostics Controller with an Ok action that returns a ContentResponse with “OK”. Pretty simple. If you need something like this, give it a shot and let me know what you think. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://github.com/aaronjensen/cassini-runner/raw/master/Out/site-sanity.zip"&gt;Download&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://github.com/aaronjensen/cassini-runner"&gt;Source&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=444419" width="1" height="1"&gt;</description><category domain="http://codebetter.com/blogs/aaron.jensen/archive/tags/asp.net+mvc/default.aspx">asp.net mvc</category><category domain="http://codebetter.com/blogs/aaron.jensen/archive/tags/teamcity/default.aspx">teamcity</category><category domain="http://codebetter.com/blogs/aaron.jensen/archive/tags/cassini/default.aspx">cassini</category></item><item><title>MSpec latest build download now available</title><link>http://codebetter.com/blogs/aaron.jensen/archive/2009/11/19/mspec-latest-build-download-now-available.aspx</link><pubDate>Thu, 19 Nov 2009 18:30:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:439212</guid><dc:creator>aaronjensen</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/aaron.jensen/rsscomments.aspx?PostID=439212</wfw:commentRss><comments>http://codebetter.com/blogs/aaron.jensen/archive/2009/11/19/mspec-latest-build-download-now-available.aspx#comments</comments><description>&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; &lt;a href="http://teamcity.codebetter.com/guestAuth/repository/download/bt44/.lastSuccessful/Machine.Specifications-release.zip"&gt;Here&amp;#39;s a direct link to download the latest build of MSpec.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Many thanks again to &lt;a href="http://twitter.com/agross"&gt;Alexander Gro&amp;#223;&lt;/a&gt; for adding packaging to MSpec. You can now download builds from &lt;a href="http://teamcity.codebetter.com/viewType.html?tab=buildTypeStatusDiv&amp;amp;buildTypeId=bt44"&gt;here&lt;/a&gt; without having to build it yourself! Just grab the Artifact from the latest build.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=439212" width="1" height="1"&gt;</description><category domain="http://codebetter.com/blogs/aaron.jensen/archive/tags/frameworks/default.aspx">frameworks</category><category domain="http://codebetter.com/blogs/aaron.jensen/archive/tags/machine/default.aspx">machine</category><category domain="http://codebetter.com/blogs/aaron.jensen/archive/tags/mspec/default.aspx">mspec</category></item><item><title>Call for help with MSpec</title><link>http://codebetter.com/blogs/aaron.jensen/archive/2009/11/18/call-for-help-with-mspec.aspx</link><pubDate>Thu, 19 Nov 2009 06:51:25 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:437877</guid><dc:creator>aaronjensen</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/aaron.jensen/rsscomments.aspx?PostID=437877</wfw:commentRss><comments>http://codebetter.com/blogs/aaron.jensen/archive/2009/11/18/call-for-help-with-mspec.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://codebetter.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/aaron.jensen/20091118_5F00_22401_5F00_65EC1067.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;margin-left:0px;border-top:0px;margin-right:0px;border-right:0px;" title="2009-11-18_2240[1]" border="0" alt="2009-11-18_2240[1]" align="right" src="http://codebetter.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/aaron.jensen/20091118_5F00_22401_5F00_thumb_5F00_4C17DA38.png" width="309" height="89" /&gt;&lt;/a&gt;Thankfully, the community has created a number of very helpful blog posts about MSpec. Unfortunately, I’ve been quite bad at aggregating them into a single authoritative source and documenting the few but somewhat obscure APIs and tools that make up MSpec. It is on my list of things to do but time has been rather… tight. I’d love to get it up sooner than later, as MSpec is getting more and more eyes on it and I want to make things as smooth as possible for new users.&lt;/p&gt;  &lt;p&gt;That’s where this plea comes in, I’m looking for someone to help put together some documentation in one place, probably the &lt;a href="http://github.com/machine/machine.specifications/blob/master/README.markdown"&gt;github README.markdown&lt;/a&gt;. I obviously don’t have anything to offer other than fame and fortune (minus the fortune and probably the fame). Rest assured, though, that myself and the rest of the community (like &lt;a href="http://twitter.com/kreiggers"&gt;kreiggers&lt;/a&gt;) would be forever grateful.&lt;/p&gt;  &lt;p&gt;I’d be happy to edit and keep up to date the documentation once created so this wouldn’t be an ongoing effort, but I could use some help getting started. Ping &lt;a href="http://twitter.com/aaronjensen"&gt;me on twitter&lt;/a&gt; if you’re interested and we can brainstorm a bit. Thanks in advance and sorry for the spam.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=437877" width="1" height="1"&gt;</description><category domain="http://codebetter.com/blogs/aaron.jensen/archive/tags/frameworks/default.aspx">frameworks</category><category domain="http://codebetter.com/blogs/aaron.jensen/archive/tags/machine/default.aspx">machine</category><category domain="http://codebetter.com/blogs/aaron.jensen/archive/tags/mspec/default.aspx">mspec</category></item><item><title>MSpec v0.3</title><link>http://codebetter.com/blogs/aaron.jensen/archive/2009/11/18/mspec-v0-3.aspx</link><pubDate>Wed, 18 Nov 2009 18:20:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:435888</guid><dc:creator>aaronjensen</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/aaron.jensen/rsscomments.aspx?PostID=435888</wfw:commentRss><comments>http://codebetter.com/blogs/aaron.jensen/archive/2009/11/18/mspec-v0-3.aspx#comments</comments><description>&lt;p&gt;&lt;strong&gt;IMPORTANT NOTE: &lt;/strong&gt;This is beta (still). The assertion library is new and may have bugs. I’d appreciate you testing it on your specs, but don’t fight specs breaking too hard if they do, &lt;a href="http://twitter.com/aaronjensen"&gt;let me know&lt;/a&gt; what happened and revert, I wouldn’t want to cost you your day chasing down a bug in MSpec. Thanks!&lt;/p&gt;  &lt;p&gt;It’s been &lt;a href="http://codebetter.com/blogs/aaron.jensen/archive/2008/09/02/mspec-v0-2.aspx"&gt;more or less forever&lt;/a&gt; since I’ve incremented the version number of MSpec so I went ahead and did it today. This is just a brief post to let you know what’s new and what I broke—maybe I’ll post some more detail later.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;MOST IMPORTANT NOTE:&lt;/strong&gt; v0.3 removes the dependency on NUnit/XUnit. If you’re upgrading, delete your Machine.Specifications.NUnit.dll and Machine.Specifications.XUnit.dll and remove their references from your projects. MSpec has an all new assertion library (with a bit of borrowed code from XUnit, turns out equality is hard). &lt;/p&gt;  &lt;p&gt;I’ve attempted to format the new error messages to minimize debugging, so they’re rather verbose. Please let me know if they are too verbose or if there’s anything else you’d like to see.&lt;/p&gt;  &lt;p&gt;You may need to tweak a few specs (ex. ShouldEquals is now generic, so you have to pass it the same type as the thing you’re observing) but most things should “just work”. Let me know if any of the new assertions give pain.&lt;/p&gt;  &lt;p&gt;I also added a &lt;a href="http://weblogs.asp.net/nunitaddin/archive/2009/11/05/testdriven-net-2-24-xcopy-deployable-test-runners.aspx"&gt;XCopy Deployable Test Runner manifest&lt;/a&gt; for TD.NET so no more fiddling with the registry or dealing with version issues. Pretty slick really. Thanks &lt;a href="http://twitter.com/jcansdale"&gt;Jamie&lt;/a&gt; for pointing this out to me.&lt;/p&gt;  &lt;p&gt;Of course there are plenty of other changes from 0.2 to 0.3 since it’s been like, a year. Here’s some others off the top of my head:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;R# runners for 4.0, 4.1, 4.5 and 5.0 and they’re better than ever thanks to &lt;a href="http://therightstuff.de/"&gt;Alexander&lt;/a&gt; &lt;a href="http://twitter.com/agross"&gt;Groß&lt;/a&gt;. &lt;/li&gt;    &lt;li&gt;Xml output from the command line runner with --xml for CC.NET/Hudson thanks to Barry Woods. &lt;/li&gt;    &lt;li&gt;Concern is now Subject &lt;/li&gt;    &lt;li&gt;There is no longer a difference between “Establish context” and “Establish context_once”, the context is always established only once. The idea is that observations are observations, they should not mutate state so there is no reason to execute the context more than once. Same for cleanup. If you *really* want to do execute the context for each specification, first try to change your mind, then if you still want it use: [SetupForEachSpecification] on your context class. &lt;/li&gt;    &lt;li&gt;You can implement an &lt;strong&gt;IAssemblyContext&lt;/strong&gt; in your spec assembly to set things up before or clean things up after all of your specs in that assembly have run. &lt;/li&gt;    &lt;li&gt;You can implement a &lt;strong&gt;ICleanupAfterEveryContextInAssembly&lt;/strong&gt; to perform cleanup after every context (think cleaning up static state, resetting your ServerClock/DateTime replacement for example. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://codebetter.com/blogs/aaron.jensen/archive/2009/10/19/advanced-selenium-logging-with-mspec.aspx"&gt;Selenium RC support&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Many thanks again to &lt;a href="http://twitter.com/agross"&gt;Alexander Gro&amp;#223;&lt;/a&gt; for adding packaging to MSpec. You can now download builds from &lt;a href="http://teamcity.codebetter.com/viewType.html?tab=buildTypeStatusDiv&amp;amp;buildTypeId=bt44"&gt;here&lt;/a&gt;without having to build it yourself! Just grab the Artifact from the latest build.&lt;/p&gt;  &lt;p&gt;And, as always, the best way to get me is on &lt;a href="http://twitter.com/aaronjensen"&gt;twitter&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=435888" width="1" height="1"&gt;</description><category domain="http://codebetter.com/blogs/aaron.jensen/archive/tags/bdd/default.aspx">bdd</category><category domain="http://codebetter.com/blogs/aaron.jensen/archive/tags/machine/default.aspx">machine</category><category domain="http://codebetter.com/blogs/aaron.jensen/archive/tags/mspec/default.aspx">mspec</category></item><item><title>Machine.Migrations changes</title><link>http://codebetter.com/blogs/aaron.jensen/archive/2009/10/24/machine-migrations-changes.aspx</link><pubDate>Sat, 24 Oct 2009 21:56:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:394459</guid><dc:creator>aaronjensen</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/aaron.jensen/rsscomments.aspx?PostID=394459</wfw:commentRss><comments>http://codebetter.com/blogs/aaron.jensen/archive/2009/10/24/machine-migrations-changes.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://codebetter.com/blogs/jacob.lewallen/archive/2008/04/25/a-first-look-at-machine-migrations.aspx"&gt;Jacob first introduced&lt;/a&gt; Machine.Migrations over a year ago. Since then, it&amp;#39;s been a solid part of our process and we&amp;#39;re up to nearly 500 migrations with it on one project.&lt;/p&gt; &lt;p&gt;Recently, I finally got around to making some changes I&amp;#39;ve been wanting to make and I wanted to call&amp;#39;em out:&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;We split the repostiory out to its own &lt;a href="http://github.com/machine/machine.migrations"&gt;on github&lt;/a&gt;. I did this similar to the &lt;a href="http://codebetter.com/blogs/aaron.jensen/archive/2009/03/07/machine-specifications-mspec-has-moved-and-git-rocks.aspx"&gt;way I did it for MSpec&lt;/a&gt; some time ago. Again, the advantage here is that change logs are localized to the project rather than the entire machine overarching project.&lt;/li&gt; &lt;li&gt;I added complaints if you have multiple migrations with the same number. This silently caused problems before as one of the migrations would not get applied. Now it just yells and dies like a good app. Of course, this is not as important because of the next change.&lt;/li&gt; &lt;li&gt;&lt;p&gt;Next I added support for timestamped migrations. This helps &lt;strong&gt;immensely&lt;/strong&gt; on active projects with multiple developers. You don&amp;#39;t have to deal with communicating migration numbers to the team when you add them, you just generate a new one and merge it when you feel like it. We actually had half of our topic on Campfire dedicated to our current migration number. The other half was who owed how many pushups for breaking the build.&lt;/p&gt; &lt;p&gt;Here&amp;#39;s the rake task we use to generate a new migration:&lt;/p&gt; &lt;pre class="ruby" name="code"&gt;
namespace :new do
  task :migration do
    raise &amp;quot;usage: rake new:migration name=\&amp;quot;Your migration name\&amp;quot;&amp;quot; unless ENV.include?(&amp;#39;name&amp;#39;)

    name = ENV[&amp;#39;name&amp;#39;]

    filepath = &amp;quot;db/migrate/#{Time.now.strftime(&amp;#39;%Y%m%d%H%M%S&amp;#39;)}_#{name.gsub(/ /,&amp;#39;_&amp;#39;)}.cs&amp;quot;

    text = File.read(&amp;quot;db/migrate/template.cs&amp;quot;)
    File.open(filepath, &amp;#39;w&amp;#39;) { |file|
      file.puts text.gsub(/\$MigrationName\$/,&amp;quot;#{name.gsub(/ /,&amp;#39;_&amp;#39;)}&amp;quot;)
    }
  end
end
&lt;/pre&gt;
&lt;p&gt;Usage is simple, just create a template.cs in the directory (we use db/migrate) and then type &lt;pre&gt;rake new:migration name=&amp;quot;this is my migration name&amp;quot;&lt;/pre&gt;
Example template:
&lt;/p&gt;
&lt;pre class="c-sharp" name="code"&gt;
using System;
using System.Collections.Generic;
using System.Text;
using Machine.Migrations;

public class $MigrationName$ : SimpleMigration
{
  public override void Up()
  {
    throw new System.NotImplementedException();
  }

  public override void Down()
  {
    throw new System.NotImplementedException();
  }
}
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Finally, I added a command line runner. As we&amp;#39;ve grown more and more sick of msbuild and more and more fond of rake, we&amp;#39;ve wanted to slowly all but eliminate our dependency on MSBuild. The command line tool is quite simple:&lt;/p&gt;
&lt;pre&gt;
Machine.Migrations
Copyright (C) 2007, 2008, 2009 Machine Project

  c, connection-string  Required. The connection string to the database to migrate
  t, to                 Applies or unapplies migrations to get to the specified migration
  u, up                 Applies migrations to the latest
  s, scope              The scope?
  d, directory          Required. Directory containing the migrations
  v, compiler-version   Version of the compiler to use
  debug                 Show Diagnostics
  r, references         Assemblies to reference while building migrations separated by commas
  t, timeout            Default command timeout for migrations
  ?, help               Display this help screen
&lt;/pre&gt;
&lt;p&gt;
The only two flags you usually need are -c and -d. Just pass in the connection string and the location of your migrations. Be sure to quote them: migrate.exe -c &amp;quot;my connection string&amp;quot; -d &amp;quot;my migration directory&amp;quot;.&lt;/p&gt;
&lt;/li&gt;

&lt;p&gt;Hopefully these changes help others. Grab the latest &lt;a href="http://github.com/machine/machine.migrations"&gt;here&lt;/a&gt; and just msbuild the sln to build it.&lt;/p&gt;

&lt;p&gt;I do wonder though, what other active .NET migration projects are people using and how do you like them?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=394459" width="1" height="1"&gt;</description><category domain="http://codebetter.com/blogs/aaron.jensen/archive/tags/machine/default.aspx">machine</category><category domain="http://codebetter.com/blogs/aaron.jensen/archive/tags/migrations/default.aspx">migrations</category></item><item><title>Building an iPhone app</title><link>http://codebetter.com/blogs/aaron.jensen/archive/2009/10/21/building-an-iphone-app.aspx</link><pubDate>Wed, 21 Oct 2009 20:12:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:390365</guid><dc:creator>aaronjensen</dc:creator><slash:comments>12</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/aaron.jensen/rsscomments.aspx?PostID=390365</wfw:commentRss><comments>http://codebetter.com/blogs/aaron.jensen/archive/2009/10/21/building-an-iphone-app.aspx#comments</comments><description>&lt;p&gt;Today we launched &lt;a href="http://www.pictranslator.com"&gt;PicTranslator&lt;/a&gt;, a free Picture Translator for the iPhone. Building it was quite an adventure. I wanted to share some of the technologies we used, you may be surprised.&lt;/p&gt;  &lt;h3&gt;On the iPhone:&lt;/h3&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;&lt;a href="http://www.devworld.apple.com/iphone/"&gt;iPhone SDK&lt;/a&gt;&lt;/strong&gt;: This one&amp;#39;s obvious. Unfortunately, &lt;a href="http://monotouch.net/"&gt;MonoTouch&lt;/a&gt; wasn&amp;#39;t out when we started to develop. It looks rather promising. &lt;br /&gt; To be perfectly honest though, Objective-C is pretty cool. Especially once you figure out it&amp;#39;s memory management scheme. It&amp;#39;s kind of fun to be back in pointer land again. Brings back fond memories. Oh, and though I did miss vim, xcode is a pretty darn good little editor.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;&lt;a href="http://code.google.com/p/json-framework/"&gt;json-framework&lt;/a&gt;&lt;/strong&gt;: This is a pretty slick JSON parser for the iPhone. Hand parsing JSON in obj-C would not have been fun. This made it easy. I&amp;#39;m pretty sure I followed &lt;a href="http://www.mobileorchard.com/tutorial-json-over-http-on-the-iphone/"&gt;this tutorial&lt;/a&gt; to get it up and running.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;&lt;a href="http://allseeing-i.com/ASIHTTPRequest/"&gt;ASIHttpRequest&lt;/a&gt;&lt;/strong&gt;: Nice Http framework, helpful for doing asynchronous requests and sending and receing files easily.&lt;/li&gt; &lt;li&gt;We also used a few random snippets found around the web. Here&amp;#39;s one on &lt;a href="http://iphonedevelopment.blogspot.com/2008/11/creating-transparent-uiviews-rounded.html"&gt;rounded corners&lt;/a&gt;. Also &lt;a href="http://stackoverflow.com"&gt;stackoverflow&lt;/a&gt; was invaluable.&lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;On the server:&lt;/h3&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;&lt;a href="http://nservicebus.com/"&gt;nServiceBus&lt;/a&gt;&lt;/strong&gt;: NSB is fantastic. It allows us to scale to any size machine or any number of machines. I&amp;#39;m realizing more and more than most reasonable size applications should leverage messaging in one way or another. We&amp;#39;re using MSMQ as the transport.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;&lt;a href="http://asp.net/mvc"&gt;ASP.NET MVC&lt;/a&gt;&lt;/strong&gt;: My web framework of choice.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;&lt;a href="http://github.com/machine/machine.specifications"&gt;MSpec&lt;/a&gt;&lt;/strong&gt;: Gotta test it somehow right, why not use my own framework.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;&lt;a href="http://code.google.com/p/topshelf/"&gt;Topshelf&lt;/a&gt;&lt;/strong&gt;: Best way I know of to create services in .NET. Makes it easy to run as a console app or a service. Love it.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;&lt;a href="http://logging.apache.org/log4net/index.html"&gt;log4net&lt;/a&gt;&lt;/strong&gt;: Another no brainer. log4net is how you log in .NET. Well, most of you any ways :).&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Not a bad stack, eh? Any surprises? Oh, and if you have an iPhone, be sure to give PicTranslator a shot, we&amp;#39;d love your feedback.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=390365" width="1" height="1"&gt;</description><category domain="http://codebetter.com/blogs/aaron.jensen/archive/tags/asp.net+mvc/default.aspx">asp.net mvc</category><category domain="http://codebetter.com/blogs/aaron.jensen/archive/tags/mspec/default.aspx">mspec</category><category domain="http://codebetter.com/blogs/aaron.jensen/archive/tags/list/default.aspx">list</category><category domain="http://codebetter.com/blogs/aaron.jensen/archive/tags/iphone/default.aspx">iphone</category></item><item><title>Advanced Selenium RC logging with MSpec</title><link>http://codebetter.com/blogs/aaron.jensen/archive/2009/10/19/advanced-selenium-logging-with-mspec.aspx</link><pubDate>Tue, 20 Oct 2009 01:30:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:387122</guid><dc:creator>aaronjensen</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/aaron.jensen/rsscomments.aspx?PostID=387122</wfw:commentRss><comments>http://codebetter.com/blogs/aaron.jensen/archive/2009/10/19/advanced-selenium-logging-with-mspec.aspx#comments</comments><description>&lt;p&gt;Today I pushed some new features to &lt;a&gt;MSpec&lt;/a&gt; to allow you to see this in MSpec’s html report when you get Selenium RC failures:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://codebetter.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/aaron.jensen/20091019_5F00_1810_5F00_53AFD739.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="2009-10-19_1810" border="0" alt="2009-10-19_1810" src="http://codebetter.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/aaron.jensen/20091019_5F00_1810_5F00_thumb_5F00_6BD34194.png" width="244" height="149" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;This is very similar to ruby’s selenium client’s rspec report. You can see a real example of that &lt;a href="http://ph7spot.com/examples/selenium_rspec_report.html"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;So how do you get this? It’s pretty easy. All you need to do is &lt;a&gt;grab&lt;/a&gt; and build the latest MSpec, add a reference to Machine.Specifications.SeleniumSupport.dll and add a class like the following to your assembly that contains your selenium specs in it:&lt;/p&gt;  &lt;pre class="c-sharp" name="code"&gt;
  public class SeleniumSupport : SeleniumResultSupplementer
  {
    protected override string ImagesPath
    {
      get { return GetTempPath(); }
    }

    protected override DefaultSelenium Selenium
    {
      get { return ...; } // Replace with the DefaultSelenium in use 
                          // by the current running spec
    }

    static string tempPath;

    private static string GetTempPath()
    {
      if (string.IsNullOrEmpty(tempPath))
      {
        tempPath = Path.Combine(Path.GetTempPath(), &amp;quot;selenium&amp;quot;);

        if (Directory.Exists(tempPath))
        {
          Directory.Delete(tempPath, true);
        }

        Directory.CreateDirectory(tempPath);
      }

      return tempPath;
    }
  }
&lt;/pre&gt;

&lt;p&gt;That&amp;#39;s pretty much it. Like I said, this is brand new, just got it up today so please let me know if you have any problems with it. You can do so on &lt;a href="http://twitter.com/aaronjensen"&gt;twitter&lt;/a&gt; or the &lt;a href="http://groups.google.com/group/machine_users"&gt;machine google group&lt;/a&gt;. Enjoy!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=387122" width="1" height="1"&gt;</description><category domain="http://codebetter.com/blogs/aaron.jensen/archive/tags/mspec/default.aspx">mspec</category><category domain="http://codebetter.com/blogs/aaron.jensen/archive/tags/selenium/default.aspx">selenium</category></item><item><title>A recent conversation about MSpec practices</title><link>http://codebetter.com/blogs/aaron.jensen/archive/2009/10/05/a-recent-conversation-about-mspec-practices.aspx</link><pubDate>Mon, 05 Oct 2009 21:12:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:367991</guid><dc:creator>aaronjensen</dc:creator><slash:comments>21</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/aaron.jensen/rsscomments.aspx?PostID=367991</wfw:commentRss><comments>http://codebetter.com/blogs/aaron.jensen/archive/2009/10/05/a-recent-conversation-about-mspec-practices.aspx#comments</comments><description>&lt;p&gt;Recently I&amp;#39;ve heard about more and more people checking out MSpec. A few days ago I got an email from a friend. He said he was having trouble with base class explosion while creating specs. Here is a snippet from his code:&lt;/p&gt;  &lt;pre class="c-sharp" name="code"&gt;public abstract class with_null_program
{
  protected static Program program;
}

public abstract class with_program_and_empty_args : with_null_program
{
  Establish context = () =&amp;gt; program = new Program(new string[]{});
}

public abstract class with_list_command
{

}

[Subject(&amp;quot;Program&amp;quot;)]
public class when_creating : with_program_and_empty_args
{
  private Because of = () =&amp;gt; program = new Program(new string[] {});

  It should_output_to_the_console =()=&amp;gt; 
   program.Out.ShouldEqual(Console.Out);
}

[Subject(&amp;quot;Program&amp;quot;)]
public class when_running_with_no_arguments : with_null_program
{
  private static StringBuilder outputBuilder;

  private Because of = () =&amp;gt;
  {
    outputBuilder = new StringBuilder();
    program = new Program(new string[] {}) {Out = new StringWriter(outputBuilder)};
    program.Run();
  };

  It should_print_usage =()=&amp;gt; outputBuilder.ToString().ShouldContain(&amp;quot;USAGE&amp;quot;);
}

[Subject(&amp;quot;Program&amp;quot;)]
public class when_running_without_database_args : with_list_command
{

}&lt;/pre&gt;

&lt;p&gt;And here&amp;#39;s my response:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Hey man, Glad to see you playing with MSpec. Definitely curious to get your feedback on the experience.&lt;/p&gt;

  &lt;p&gt;So there&amp;#39;s a few things I noticed about the specs. For one, you&amp;#39;re using the with_ pattern. I know I or Scott or someone started this... but I don&amp;#39;t like it now. I much more prefer to just have a base class that contains any utility/meaningless cruft my specs have. You also seem to have taken this to a bit of an extreme. Would you make a regular base class just to create a single instance variable and set it to null in the constructor? Probably not. Same stuff applies here. There&amp;#39;s no value in creating base classes unless they provide value. There&amp;#39;s no naming or understanding benefit. As a matter of fact, they *hinder* understanding more than anything. This is why I try to only put utter crap in base classes, and when it&amp;#39;s important crap, I put it in a method and name it something descriptive and call it in the context. If I were to rewrite these specs I *may* have a single base class called ProgramSpecs. It would probably just have the static program field, but be a place holder in case i needed any utility methods. Naming specs with the with_foo_bar implies that that name is important, which it isn&amp;#39;t. It&amp;#39;s not included in the report for a reason. Your context description should be fully encapsulated by the name of the context class.&lt;/p&gt;

  &lt;p&gt;Another thing I&amp;#39;m seeing... and I&amp;#39;m not sure if this is just circumstantial, but do you know that you can have more than one context in a class hierarchy? In other words, something like outputBuilder = new StringBuilder() would go in the subclasses establish context. They&amp;#39;re run in order from basiest to subbiest. The Because is *only* a way to highlight a line and say &amp;quot;this is the catalyst that makes the observations possible... everything else up to this point is also important, but this is the real meat&amp;quot;. Because is actually *part* of the context. The Context is the arrange and the act (if there is an act). Here&amp;#39;s an example of multiple context clauses (though i have no idea why i didn&amp;#39;t use because here, heh): &lt;a href="http://github.com/aaronjensen/compete/blob/master/Source/Compete.Specs/Model/Game/AggregateResultSpecs.cs"&gt;http://github.com/aaronjensen/compete/blob/master/Source/Compete.Specs/Model/Game/AggregateResultSpecs.cs&lt;/a&gt;&lt;/p&gt;

  &lt;p&gt;As an aside, I feel the Program class is a bit awkward. Personally, it&amp;#39;d make more sense if the StringBuilder was a constructor parameter and the args were parameters to the run method. That&amp;#39;s just my style though--i&amp;#39;m not saying it&amp;#39;s better. It would definitely make testing this less awkward. Actually, look at your context. &amp;quot;when running with no arguments&amp;quot;. Your code isn&amp;#39;t doing what you said it would do, at least not in the simplest fashion. I think I&amp;#39;ll change my position to &amp;quot;strongly prefer&amp;quot; the arguments to be passed to the Run method :) More often than not, when you&amp;#39;re feeling pain while testing it&amp;#39;s because your API can be improved.&lt;/p&gt;

  &lt;p&gt;You may, if you haven&amp;#39;t already, want to take a look at the mspec console runner specs: &lt;a href="http://github.com/machine/machine.specifications/blob/master/Source/Machine.Specifications.ConsoleRunner.Specs/ProgramSpecs.cs"&gt;http://github.com/machine/machine.specifications/blob/master/Source/Machine.Specifications.ConsoleRunner.Specs/ProgramSpecs.cs&lt;/a&gt;&lt;/p&gt;

  &lt;p&gt;They&amp;#39;re quite similar to the domain you were writing specs for and may help. Yes, I used with_runner there, they&amp;#39;re old ;)&lt;/p&gt;

  &lt;p&gt;Hope that helps a bit, let me know if you have any other questions or anything.&lt;/p&gt;

  &lt;p&gt;Thanks, Aaron&lt;/p&gt;&lt;/blockquote&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=367991" width="1" height="1"&gt;</description><category domain="http://codebetter.com/blogs/aaron.jensen/archive/tags/mspec/default.aspx">mspec</category></item><item><title>Check out Virtual ALT.NET</title><link>http://codebetter.com/blogs/aaron.jensen/archive/2009/06/30/check-out-virtual-alt-net.aspx</link><pubDate>Tue, 30 Jun 2009 23:14:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:249472</guid><dc:creator>aaronjensen</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/aaron.jensen/rsscomments.aspx?PostID=249472</wfw:commentRss><comments>http://codebetter.com/blogs/aaron.jensen/archive/2009/06/30/check-out-virtual-alt-net.aspx#comments</comments><description>&lt;p&gt;Several months ago a few people started hosting a &lt;a href="http://www.zachariahyoung.com/zy/post/2009/01/Introduction-to-Virtual-ALTNET.aspx"&gt;Virtual ALT.NET&lt;/a&gt; meeting right here on the information super highway. I&amp;#39;ve been to a few and they&amp;#39;re always packed with information and good conversation. It&amp;#39;s a great way to learn new things or show off cool stuff you&amp;#39;ve been working on. If you haven&amp;#39;t been to one, I&amp;#39;d recommend you check one out. There are two great looking meetings hosted by Ryan Svihla coming up soon:&lt;/p&gt;  &lt;p&gt;Development with Castle Project with Ryan Svihla July 1 and July 8   &lt;br /&gt;Ryan will be doing a two part series on the Castle Project.&amp;#160; Mark your calendar for some Castle Project fun.    &lt;br /&gt;Ryan Svihla has been working as a C# developer Farm Bureau Bank in San Antonio since September 2007. Before that he worked as&amp;#160; a Consultant in Lincoln, NE for 3 years, where he had working experience with Php, some Perl, Python and of course C#.&amp;#160; Attemping Agile since early 2008 as an eager student with a focus on making programming more useful and relevant for the end user.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;IoC and Dip through Castle Windsor&lt;/b&gt;    &lt;br /&gt;Ever wonder what acronyms like IoC and Dip mean? If you know what they mean do you wonder why anyone would use them in code?&amp;#160; This talk aims to deal primarily with those two questions through the use of Castle Windsor IoC container.&amp;#160; Intermediate level C# material with a couple of more advanced demos at the end for fun and pleasure.    &lt;br /&gt;Central Daylight Time    &lt;br /&gt;Start Time: Web, July 1, 2009 8:00 PM UTC/GMT -5 hours    &lt;br /&gt;End Time: Web, July 1, 2009 10:00 PM UTC/GMT -5 hours    &lt;br /&gt;Attendee URL: &lt;a href="http://snipr.com/virtualaltnet"&gt;http://snipr.com/virtualaltnet&lt;/a&gt; (Live Meeting) &lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&lt;b&gt;Web Development with Castle Monorail, Active Record and Brail view engine&lt;/b&gt;    &lt;br /&gt;Have a look at the first popular MVC .Net based web framework. Also will be covering persistance with ActiveRecord, and view templates using Brail.&amp;#160; Bonus, will demo a plugin framework for building CMS like applications.    &lt;br /&gt;Central Daylight Time    &lt;br /&gt;Start Time: Web, July 8, 2009 8:00 PM UTC/GMT -5 hours    &lt;br /&gt;End Time: Web, July 8, 2009 10:00 PM UTC/GMT -5 hours    &lt;br /&gt;Attendee URL: &lt;a href="http://snipr.com/virtualaltnet"&gt;http://snipr.com/virtualaltnet&lt;/a&gt; (Live Meeting)&lt;/p&gt;  &lt;p&gt;Hope to see you all there!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=249472" width="1" height="1"&gt;</description><category domain="http://codebetter.com/blogs/aaron.jensen/archive/tags/alt.net/default.aspx">alt.net</category><category domain="http://codebetter.com/blogs/aaron.jensen/archive/tags/van/default.aspx">van</category></item><item><title>MSpec... for Boo!</title><link>http://codebetter.com/blogs/aaron.jensen/archive/2009/06/27/mspec-for-boo.aspx</link><pubDate>Sun, 28 Jun 2009 05:41:50 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:249362</guid><dc:creator>aaronjensen</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/aaron.jensen/rsscomments.aspx?PostID=249362</wfw:commentRss><comments>http://codebetter.com/blogs/aaron.jensen/archive/2009/06/27/mspec-for-boo.aspx#comments</comments><description>&lt;p&gt;Jeffery Olson (a fellow Eleutian guy) has put in some good effort to create a very readable, very clean MSpec DSL for Boo. You should &lt;a href="http://github.com/olsonjeffery/machine.specifications.boo/tree/master"&gt;give it a gander&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=249362" width="1" height="1"&gt;</description><category domain="http://codebetter.com/blogs/aaron.jensen/archive/tags/mspec/default.aspx">mspec</category><category domain="http://codebetter.com/blogs/aaron.jensen/archive/tags/boo/default.aspx">boo</category></item><item><title>TeamCity.CodeBetter.com now has git support!</title><link>http://codebetter.com/blogs/aaron.jensen/archive/2009/03/21/teamcity-codebetter-com-now-has-git-support.aspx</link><pubDate>Sun, 22 Mar 2009 00:05:17 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:189574</guid><dc:creator>aaronjensen</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/aaron.jensen/rsscomments.aspx?PostID=189574</wfw:commentRss><comments>http://codebetter.com/blogs/aaron.jensen/archive/2009/03/21/teamcity-codebetter-com-now-has-git-support.aspx#comments</comments><description>&lt;p&gt;Just wanted to post quickly to let everyone know that I just finished adding git support to &lt;a href="http://teamcity.codebetter.com/"&gt;TeamCity.CodeBetter.com&lt;/a&gt;, so if you&amp;#39;ve got an OSS project on git (and if it isn&amp;#39;t, &lt;a href="http://codebetter.com/blogs/aaron.jensen/archive/2009/03/12/hosting-your-oss-project-on-github.aspx"&gt;you should consider moving it&lt;/a&gt;) you&amp;#39;ve been dying to get continuous integration going, please apply to have us host CI for your OSS project:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Register a user account &lt;a href="http://teamcity.codebetter.com/registerUser.html?init=1"&gt;here&lt;/a&gt;.&lt;/li&gt;    &lt;li&gt;Email &lt;a href="mailto:teamcity@codebetter.com"&gt;teamcity@codebetter.com&lt;/a&gt; with the following information:&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Your user account name, which you created above.&lt;/li&gt;      &lt;li&gt;Project name &amp;amp; URL.&lt;/li&gt;      &lt;li&gt;Link to your OSI-approved OSS license.&lt;/li&gt;      &lt;li&gt;URL and type (SVN, CVS, &lt;strong&gt;git&lt;/strong&gt;, ...) of your source control system.&lt;/li&gt;      &lt;li&gt;Build runner (NAnt, MSBuild, Rake, etc.) and default target.&lt;/li&gt;      &lt;li&gt;Any additional requirements you might have.&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=189574" width="1" height="1"&gt;</description><category domain="http://codebetter.com/blogs/aaron.jensen/archive/tags/git/default.aspx">git</category><category domain="http://codebetter.com/blogs/aaron.jensen/archive/tags/teamcity/default.aspx">teamcity</category><category domain="http://codebetter.com/blogs/aaron.jensen/archive/tags/codebetter/default.aspx">codebetter</category></item><item><title>Hosting your OSS project on github</title><link>http://codebetter.com/blogs/aaron.jensen/archive/2009/03/12/hosting-your-oss-project-on-github.aspx</link><pubDate>Thu, 12 Mar 2009 17:10:19 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:189180</guid><dc:creator>aaronjensen</dc:creator><slash:comments>19</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/aaron.jensen/rsscomments.aspx?PostID=189180</wfw:commentRss><comments>http://codebetter.com/blogs/aaron.jensen/archive/2009/03/12/hosting-your-oss-project-on-github.aspx#comments</comments><description>&lt;p&gt;Maybe you&amp;#39;ve heard me or others blather on about how great git is and how great github is to host git projects. Maybe you&amp;#39;ve heard it enough that you want to give it a shot or at least see what is involved in it and why us crazies think it&amp;#39;s so great. I&amp;#39;ll attempt to describe how one could go about moving their project to github and some tips for maintaining it. This is by no means a comprehensive guide, but it should be enough to get you started. Thankfully there is plenty of content on the net already so I&amp;#39;ll be doing a lot of linking.&lt;/p&gt;  &lt;h3&gt;Step 1 - Install Git and create your github account&lt;/h3&gt;  &lt;p&gt;Read through this &lt;a href="http://kylecordes.com/2008/04/30/git-windows-go/"&gt;awesome guide from Kyle Cordes&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Mac users - follow one of the &lt;a href="http://github.com/guides/get-git-on-mac"&gt;guides on github&lt;/a&gt; to get git installed, then follow the rest of Kyle&amp;#39;s guide.&lt;/p&gt;  &lt;h3&gt;Step 2 - Import your svn project onto github&lt;/h3&gt;  &lt;p&gt;There are a few ways you can do this. Github makes it very easy by allowing you to just import an svn repository from their UI. Here&amp;#39;s a &lt;a href="http://github.com/guides/import-from-subversion"&gt;guide on github&lt;/a&gt; on some ways to do this.&lt;/p&gt;  &lt;h3&gt;Step 3 - Clone your project locally&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://kylecordes.com/2008/04/30/git-windows-go/"&gt;Kyle&amp;#39;s guide&lt;/a&gt; talks about how to clone your repository. It&amp;#39;s pretty simple though, just type &amp;quot;git clone git@github.com:username/repositoryname.git&amp;quot;. You can see your public (read-only) and private (read/write, use this one) clone url here on your project&amp;#39;s page, like this: &lt;img src="http://content.screencast.com/users/ajensen/folders/Jing/media/88d01c64-5eee-4b3b-8dff-33f1baf79afa/2009-03-12_1009.png" alt="" /&gt; &lt;/p&gt;  &lt;h3&gt;Step 4 - Setup your .gitignore&lt;/h3&gt;  &lt;p&gt;Unlike SVN&amp;#39;s abomination of ignoring procedure, git sticks to a single .gitignore file in the root of your repository to specify ignored files. This makes it very easy to get things up and ignored and keep them clean. In SVN, every time you add a project you&amp;#39;d need to ignore the bin and the obj directories for instance. In git, you just have one rule that always ignores them. Here&amp;#39;s a sample of my baseline .gitignore file:&lt;/p&gt;  &lt;pre&gt;obj
bin
_ReSharper.*
*.csproj.user
*.resharper.user
*.resharper
*.suo
*.cache
*~
*.swp
/Build
NDependOut&lt;/pre&gt;

&lt;p&gt;Once you&amp;#39;ve got that file set up, you&amp;#39;ll need to commit it and push it. There&amp;#39;s lots of guides on committing and staging and such and I&amp;#39;ll link to those below, but for now just do this:&lt;/p&gt;

&lt;pre&gt;git add .gitignore
git commit -m &amp;quot;Adding .gitignore&amp;quot;
git push&lt;/pre&gt;

&lt;p&gt;So what did that do? The first line, git add..., staged the added file for commit. All changes, adds, deletes, etc, must be &amp;quot;staged&amp;quot; before they are committed. Staging is a powerful thing, but I&amp;#39;ll let the other guides go into that. The next line, git commit..., committed your staged change to your local repository. This is so quick because it doesn&amp;#39;t actually talk to github. The change is only local. The next line, git push, actually pushes your changes up to the remote repository (github).&lt;/p&gt;

&lt;h3&gt;Step 5 - Learn&lt;/h3&gt;

&lt;p&gt;Time to pause for some learning. Like I mentioned, there&amp;#39;s a lot of great material out there already. Here are a few resources:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://nathanj.github.com/gitguide/index.html"&gt;An Illustrated Guide to Git on Windows&lt;/a&gt; - Great guide to using git on windows and all of the gui tools available with msysgit &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://www.gitcasts.com/"&gt;GitCasts&lt;/a&gt; - Some great screencasts showing how to work with git. A lot of content here, some are a bit long but they&amp;#39;re great learning tools. &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://whygitisbetterthanx.com/"&gt;Why Git is Better than X&lt;/a&gt; - Great for showing people the difference between git and other source control solutions. Helpful sales tool if someone is on the fence. &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Step 6 - Maintain and accept contributions&lt;/h3&gt;

&lt;p&gt;So now the fun part. You get git. You have your project on github. Now what? How do people send you patches? Do they still email you patch files? Isn&amp;#39;t there a better way? I thought I said git was better! Never fear, yes there&amp;#39;s a *much* better way to accept contributions now that you&amp;#39;re using git and on github. Remember, git is a &lt;strong&gt;distributed&lt;/strong&gt; version control system. It was built for this stuff!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First, the benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One of the coolest things you&amp;#39;ll notice after accepting your first patch from someone in git is that not only will you have all of their individual granular commits in your timeline (rather than one giant patch) but those commits will still be attributed to the original author and even maintain their original change date!&lt;/p&gt;
&lt;img src="http://content.screencast.com/users/ajensen/folders/Jing/media/03e4c335-a5c1-49f0-9313-581f7d2271ff/2009-03-12_1000.png" alt="" /&gt; 

&lt;p&gt;&lt;strong&gt;Next, how to contribute:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Find your repository on github. &lt;/li&gt;

  &lt;li&gt;Fork it (click the little fork button). Forking on github is not necessarily claiming that you&amp;#39;re going to go your own way with a project. I&amp;#39;ve seen people new to github get concerned when their project was forked, but really it&amp;#39;s just the beginning of the contribution cycle.&lt;img src="http://content.screencast.com/users/ajensen/folders/Jing/media/5aaf0587-9fc0-4d59-b826-9982eaa3d30b/2009-03-11_1145.png" alt="" /&gt; &lt;/li&gt;

  &lt;li&gt;Clone your fork locally. For example, 
    &lt;pre&gt;git clone git@github.com:aaronjensen/machine.git&lt;/pre&gt;
  &lt;/li&gt;

  &lt;li&gt;Add a remote for the original repository, this way you can get any changes to that repository locally. 
    &lt;pre&gt;git remote add machine git://github.com/machine/machine.git
git fetch machine&lt;/pre&gt;
  &lt;/li&gt;

  &lt;li&gt;Make local changes. Commit them. Push them. &lt;/li&gt;

  &lt;li&gt;Send a pull request. This will notify the original repository&amp;#39;s owner that you want them to pull your changes and merge them into their repository. Here&amp;#39;s a &lt;a href="http://github.com/guides/pull-requests"&gt;github guide on the subject&lt;/a&gt;. &lt;/li&gt;

  &lt;li&gt;Sit back and wait for the project owner to accept your patch! &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Finally, how to accept patches:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As a project owner when one of these pull requests come in you&amp;#39;ll get a message in your inbox on github. From there, you can either manually pull from the command line like mentioned in the above &lt;a href="http://github.com/guides/pull-requests"&gt;github guide&lt;/a&gt; or, if there would be no merge conflicts, you can use github&amp;#39;s swanky Fork Queue UI to merge changes in from the site itself! Check out a &lt;a href="http://github.com/blog/270-the-fork-queue"&gt;post and a video about that&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Step 7 - Enjoy the pretty pictures&lt;/h3&gt;

&lt;p&gt;Github has some really cool graphs for all of the projects. I encourage you to check them out. here are a few from machine:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://content.screencast.com/users/ajensen/folders/Jing/media/0953aaf8-fc8b-40fd-ad1a-241362847a51/2009-03-12_1004.png"&gt;&lt;img style="border-top-style:none;border-right-style:none;border-left-style:none;border-bottom-style:none;" height="182" src="http://content.screencast.com/users/ajensen/folders/Jing/media/0953aaf8-fc8b-40fd-ad1a-241362847a51/2009-03-12_1004.png" width="603" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://content.screencast.com/users/ajensen/folders/Jing/media/2c632b04-5eef-471e-b0d8-13209c7c3a37/2009-03-12_1004.png"&gt;&lt;img style="border-top-style:none;border-right-style:none;border-left-style:none;border-bottom-style:none;" height="270" src="http://content.screencast.com/users/ajensen/folders/Jing/media/2c632b04-5eef-471e-b0d8-13209c7c3a37/2009-03-12_1004.png" width="607" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://content.screencast.com/users/ajensen/folders/Jing/media/d7340d19-5ede-45ef-a92a-54749a5062ae/2009-03-12_1005.png"&gt;&lt;img style="border-top-style:none;border-right-style:none;border-left-style:none;border-bottom-style:none;" height="116" src="http://content.screencast.com/users/ajensen/folders/Jing/media/d7340d19-5ede-45ef-a92a-54749a5062ae/2009-03-12_1005.png" width="611" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=189180" width="1" height="1"&gt;</description><category domain="http://codebetter.com/blogs/aaron.jensen/archive/tags/training/default.aspx">training</category><category domain="http://codebetter.com/blogs/aaron.jensen/archive/tags/git/default.aspx">git</category></item><item><title>Machine.Specifications (MSpec) has moved (and git rocks)</title><link>http://codebetter.com/blogs/aaron.jensen/archive/2009/03/07/machine-specifications-mspec-has-moved-and-git-rocks.aspx</link><pubDate>Sat, 07 Mar 2009 16:22:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:189037</guid><dc:creator>aaronjensen</dc:creator><slash:comments>16</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/aaron.jensen/rsscomments.aspx?PostID=189037</wfw:commentRss><comments>http://codebetter.com/blogs/aaron.jensen/archive/2009/03/07/machine-specifications-mspec-has-moved-and-git-rocks.aspx#comments</comments><description>&lt;p&gt;&lt;strong&gt;EDIT:The actual clone url is here, the original link is to the github page. Sorry for the confusion:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;git clone git://github.com/machine/machine.specifications.git&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;I just completed breaking Machine.Specifications into its own repository. It is now here:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://github.com/machine/machine.specifications"&gt;http://github.com/machine/machine.specifications&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Why did I do this? Many reasons, for one, git is better suited for many smaller repositories. There is support for submodules so that you can combine and nest repositories. As soon as I finish breaking out all of the various pieces of Machine I will make Machine the root of all Machine projects so you only have to grab the one. Also, having MSpec in its own repository allows you to keep its history in one place. This is helpful if you want to listen to/care about changes only to MSpec and not the rest of the Machine library.&lt;/p&gt;  &lt;p&gt;If you&amp;#39;ll notice, Machine.Specification&amp;#39;s &lt;a href="http://github.com/machine/machine.specifications/commits/master"&gt;commit log&lt;/a&gt; is fully intact. Not only that, but it doesn&amp;#39;t have any of the commits for non-related libraries. Yep, I was able to cleanly split it into its own branch and preserve history. Like I said, git rocks. How did I do this? &lt;a href="http://loupgaroublond.blogspot.com/2007/12/how-to-split-repository-in-git.html"&gt;Check out this awesome guide.&lt;/a&gt; After following that guide, I used a &lt;a href="http://github.com/jwiegley/git-scripts/blob/6ba3184d7b9f6dae3d10379a6bac29a01ceef190/git-remove-empty-commits"&gt;script to prune empty commits&lt;/a&gt;. Quite painless and powerful. I love git.&lt;/p&gt;  &lt;p&gt;Oh and be sure to take a look at the latest stuff in there, &lt;a href="http://www.therightstuff.de/"&gt;Alexander Gro&amp;#223;&lt;/a&gt; added a ReSharper 4.1 and 4.5 runner and &lt;a href="http://abombss.com/"&gt;Adam Tybor&lt;/a&gt; added TeamCity support to the console runner. Thanks guys!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=189037" width="1" height="1"&gt;</description><category domain="http://codebetter.com/blogs/aaron.jensen/archive/tags/machine/default.aspx">machine</category><category domain="http://codebetter.com/blogs/aaron.jensen/archive/tags/mspec/default.aspx">mspec</category></item><item><title>The ALT.NET Programming Contest</title><link>http://codebetter.com/blogs/aaron.jensen/archive/2009/03/05/the-alt-net-programming-contest.aspx</link><pubDate>Thu, 05 Mar 2009 17:16:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:188978</guid><dc:creator>aaronjensen</dc:creator><slash:comments>7</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/aaron.jensen/rsscomments.aspx?PostID=188978</wfw:commentRss><comments>http://codebetter.com/blogs/aaron.jensen/archive/2009/03/05/the-alt-net-programming-contest.aspx#comments</comments><description>&lt;p&gt;Several months ago, &lt;a href="http://twitter.com/justin_wilcox"&gt;Justin Wilcox&lt;/a&gt; introduced me to the idea of a live programming contest. The basic idea is that you get a bunch of programmers together, form teams of two if you wish, and set them off to write a bot for some sort of game (think Rock, Paper, Scissors) with the ultimate goal of them pitting their bots against each other to determine a winner. Check out a &lt;a href="http://flickr.com/photos/aaronjensen/2662294081/in/set-72157606134459359/"&gt;video of the first event&lt;/a&gt;. &lt;/p&gt; 



 &lt;a href="http://content.screencast.com/users/ajensen/folders/Jing/media/59984f7d-9d3c-4254-8a97-a3ac392381ce/2009-03-05_0824.png"&gt;&lt;img src="http://content.screencast.com/users/ajensen/folders/Jing/media/beea21b9-ef62-44ee-87e1-2decbf08bc4c/2009-03-05_0842.png" style="float:right;border:none;margin-left:1em;" alt="" /&gt;&lt;/a&gt;  &lt;p&gt;Not too long ago, &lt;a href="http://codebetter.com/blogs/glenn.block/default.aspx"&gt;Glenn Block&lt;/a&gt; convinced me to put on a similar contest for ALT.NET Seattle. We held the contest on Saturday evening and got around 14 participants. The event was a lot of fun. The first hour ended up being more of a contest for Jacob and I than the actual participants while we practiced extreme agile just-in-time development on the competition framework we were using and fought off multiple hack attempts from the &amp;quot;participants&amp;quot;, but after things settled down and we got some show stopping bugs fixed things progressed and we were able to see some great competition between a bunch of smart people.&lt;/p&gt;  &lt;p&gt;Ultimately, John Rudolf Lewis was victorious; you can see his team &amp;quot;More Beer Driven Development&amp;quot; went an awe-inspiring 9-0 in the final round. I should also mention a few other achievements. &lt;a href="http://agilology.blogspot.com/"&gt;Jeff Tucker&lt;/a&gt; won Round 2, but apparently couldn&amp;#39;t keep up when water balloons were introduced. &lt;a href="http://jrwren.wrenfam.com/blog/"&gt;Jay R. Wren&lt;/a&gt; successfully html injected a lovely image into everyone&amp;#39;s game logs. &lt;a href="http://kohari.org/"&gt;Nate Kohari&lt;/a&gt; tried &lt;strong&gt;really&lt;/strong&gt; hard to hack the game itself and invent an unbeatable move. Unfortunately, he only succeeded in silently bringing IIS down without any sort of error messages with his Mono.Cecil magic and craziness. And finally, Eleutian&amp;#39;s very own Jeff Olson managed to thread bomb the server forcing us to reboot. Lesson learned, make sure and bullet proof your server if you&amp;#39;re going to give any of these guys access your ip.&lt;/p&gt;  &lt;p&gt;In the next post I&amp;#39;ll detail the framework we wrote to make the competition happen and describe how you can run your own!&lt;/p&gt;  &lt;img src="http://farm4.static.flickr.com/3110/3331305762_5ebc98efa1.jpg?v=0" alt="" /&gt; &lt;img src="http://farm4.static.flickr.com/3372/3330466087_ed81426f5b.jpg?v=0" alt="" /&gt; &lt;img src="http://farm4.static.flickr.com/3384/3331306988_55fc492b89.jpg?v=1236273094" alt="" /&gt; &lt;img src="http://farm4.static.flickr.com/3307/3331308602_d620f64d79.jpg?v=0" alt="" /&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=188978" width="1" height="1"&gt;</description><category domain="http://codebetter.com/blogs/aaron.jensen/archive/tags/alt.net/default.aspx">alt.net</category><category domain="http://codebetter.com/blogs/aaron.jensen/archive/tags/compete/default.aspx">compete</category></item><item><title>Rapid UI Mockups with Balsamiq</title><link>http://codebetter.com/blogs/aaron.jensen/archive/2008/10/26/rapid-ui-mockups-with-balsamiq.aspx</link><pubDate>Mon, 27 Oct 2008 01:12:39 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:184332</guid><dc:creator>aaronjensen</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/aaron.jensen/rsscomments.aspx?PostID=184332</wfw:commentRss><comments>http://codebetter.com/blogs/aaron.jensen/archive/2008/10/26/rapid-ui-mockups-with-balsamiq.aspx#comments</comments><description>&lt;p&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="166" alt="myImage (1)" src="http://codebetter.com/blogs/aaron.jensen/WindowsLiveWriter/RapidUIMockupswithBalsamiq_10007/myImage%20(1)_3.png" width="231" align="right" border="0" /&gt;I recently came across &lt;a href="http://balsamiq.com/"&gt;Balsamiq&lt;/a&gt;, a very well done application for quickly mocking up UI prototypes. With simple drag and drops you can quickly create some pretty slick prototypes. The prototypes have a sketch like look which allows the viewer to use more of their imagination, something I think is a subtle, yet powerful advantage.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right:0px;border-top:0px;margin:0px;border-left:0px;border-bottom:0px;" height="158" alt="mockups_fpa" src="http://codebetter.com/blogs/aaron.jensen/WindowsLiveWriter/RapidUIMockupswithBalsamiq_10007/mockups_fpa_3.jpg" width="204" align="left" border="0" /&gt;It&amp;#39;s been a while since I&amp;#39;ve been so impressed with an app right out of the box... especially a Flash app. Just about everything works as I&amp;#39;d expect, right down to common keyboard shortcuts. It&amp;#39;s got good organization in it&amp;#39;s &amp;quot;ribbon&amp;quot; and so far it&amp;#39;s had just about every type of thing I need. It looks like it has JIRA and Confluence support, though that&amp;#39;s a bit on the pricey side. The Desktop version is reasonably priced though, and the web version seems to be free to use if you can put up with a nag every 5 minutes.&lt;/p&gt;  &lt;p&gt;Nothing beats a whiteboard if you&amp;#39;re all in the same office, but I&amp;#39;d say this is a close second. Certainly better than Visio :)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=184332" width="1" height="1"&gt;</description><category domain="http://codebetter.com/blogs/aaron.jensen/archive/tags/random/default.aspx">random</category></item></channel></rss>