<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>The Dynamic Programmer</title>
    <link>http://blog.dynamicprogrammer.com/</link>
    <description>-</description>
    <language>en-us</language>
    <copyright>Hernan Garcia</copyright>
    <lastBuildDate>Wed, 10 Mar 2010 19:00:16 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.1.8102.813</generator>
    <managingEditor>hernifootball@yahoo.com</managingEditor>
    <webMaster>hernifootball@yahoo.com</webMaster>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/TheDynamicProgrammer" /><feedburner:info uri="thedynamicprogrammer" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
      <trackback:ping>http://blog.dynamicprogrammer.com/Trackback.aspx?guid=b3238ce0-14f5-4bdb-a671-118b9804e389</trackback:ping>
      <pingback:server>http://blog.dynamicprogrammer.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.dynamicprogrammer.com/PermaLink,guid,b3238ce0-14f5-4bdb-a671-118b9804e389.aspx</pingback:target>
      <dc:creator>Hernan</dc:creator>
      <wfw:comment>http://blog.dynamicprogrammer.com/CommentView,guid,b3238ce0-14f5-4bdb-a671-118b9804e389.aspx</wfw:comment>
      <wfw:commentRss>http://blog.dynamicprogrammer.com/SyndicationService.asmx/GetEntryCommentsRss?guid=b3238ce0-14f5-4bdb-a671-118b9804e389</wfw:commentRss>
      
      <title>MongoDB provider for Blogengine.net, saving a Post – Part 2</title>
      <guid isPermaLink="false">http://blog.dynamicprogrammer.com/PermaLink,guid,b3238ce0-14f5-4bdb-a671-118b9804e389.aspx</guid>
      <link>http://feedproxy.google.com/~r/TheDynamicProgrammer/~3/UUSuJJi3x0U/MongoDBProviderForBlogenginenetSavingAPostPart2.aspx</link>
      <pubDate>Wed, 10 Mar 2010 19:00:16 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
Yesterday we created our first method in the MongoDbProvider, our implementation of&#xD;
BlogProvider. We created a few supporting classes, but we don’t have test for those&#xD;
classes. We recognize that we went a little bit too far in our coding. We got carry&#xD;
away and we started to implement a little bit more than needed to make the test pass.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
So let’s fix that. First we need to see our first test passing. We run it expecting&#xD;
to fail to save and load the post but we have a different Exception thrown.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/MongoDBproviderforBl.netsavingaPostPart2_8480/server_null_failing_test.png"&gt;&#xD;
            &lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="server_null_failing_test" border="0" alt="server_null_failing_test" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/MongoDBproviderforBl.netsavingaPostPart2_8480/server_null_failing_test_thumb.png" width="545" height="182"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
If we look at the code we notice that we made a big mistake in the Mongo class. We&#xD;
declared a _server private field but we are initializing a local server variable. &#xD;
&lt;br&gt;&#xD;
So when calling Disconnect on _server inside the Dispose method we get the NullReferenceException. &#xD;
&lt;br&gt;&#xD;
Let’s write a test to reproduce that bug at the unit level and see what else we can&#xD;
fix in that class.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Looking at it we discover a few dependencies that can be brake. First we create an&#xD;
IMongoMapperFactory interface and we make MongoMapperFactory to implement it. &#xD;
&lt;br&gt;&#xD;
There is another dependency, the name of the database to use. We made both parameters&#xD;
for the constructor &lt;a href="http://en.wikipedia.org/wiki/Dependency_inversion_principle" target="_blank"&gt;inverting&#xD;
the dependencies&lt;/a&gt;.&#xD;
&lt;/p&gt;&#xD;
        &lt;pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  1:         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; MongoDb(IMongoMapperFactory&#xD;
mongoMapperFactory, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; dbName) &lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  2:         {&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  3:             _mongoMapperFactory = mongoMapperFactory;&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  4:             _dbName = dbName;&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  5:         }&lt;/pre&gt;&#xD;
        &lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
We also changed the Insert method:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  1:         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Insert&amp;lt;TEntity&amp;gt;(TEntity&#xD;
entity) &lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  2:         {&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  3:             var document = _mongoMapperFactory.GetMapper&amp;lt;TEntity&amp;gt;().Map(entity);&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  4:             Db(db=&amp;gt; db.GetCollection(entity.GetType().Name+"&lt;span style="color: #8b0000"&gt;Docs&lt;/span&gt;").Insert(document)); &lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  5:         }&lt;/pre&gt;&#xD;
        &lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
Notice that the private Db method now takes an Action&amp;lt;Database&amp;gt;&#xD;
&lt;/p&gt;&#xD;
        &lt;pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  1:         &lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Db(Action&amp;lt;Database&amp;gt;&#xD;
action) &lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  2:         {&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  3:             &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; (var&#xD;
server = getServer()) &lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  4:             {&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  5:                 var db = server.getDB(_dbName);&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  6:                 action.Invoke(db);&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  7:             }&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  8:         }&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  9: &#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 10:         &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; Mongo&#xD;
getServer() &lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 11:         {&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 12:             var server = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Mongo(); &lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 13:             server.Connect();&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 14:             &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; server; &lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 15:         }&lt;/pre&gt;&#xD;
        &lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
And the newly created getServer() helper method to clean up the code. We also made&#xD;
some changes on the query method but I will leave that for the next post.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Our passing test result indicates some success.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/MongoDBproviderforBl.netsavingaPostPart2_8480/passing_test.png"&gt;&#xD;
            &lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="passing_test" border="0" alt="passing_test" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/MongoDBproviderforBl.netsavingaPostPart2_8480/passing_test_thumb.png" width="576" height="108"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Next: Mapping from Document to Entity and back.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://blog.dynamicprogrammer.com/aggbug.ashx?id=b3238ce0-14f5-4bdb-a671-118b9804e389"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/BzgRT4UrFOw3bjSITuwdNCsgly0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BzgRT4UrFOw3bjSITuwdNCsgly0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/BzgRT4UrFOw3bjSITuwdNCsgly0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BzgRT4UrFOw3bjSITuwdNCsgly0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TheDynamicProgrammer/~4/UUSuJJi3x0U" height="1" width="1"/&gt;</description>
      <comments>http://blog.dynamicprogrammer.com/CommentView,guid,b3238ce0-14f5-4bdb-a671-118b9804e389.aspx</comments>
      <category>MongoDB</category>
      <category>Programming</category>
    <feedburner:origLink>http://blog.dynamicprogrammer.com/2010/03/10/MongoDBProviderForBlogenginenetSavingAPostPart2.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://blog.dynamicprogrammer.com/Trackback.aspx?guid=01dde697-ee9d-4fd9-905e-93c2ab782ac2</trackback:ping>
      <pingback:server>http://blog.dynamicprogrammer.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.dynamicprogrammer.com/PermaLink,guid,01dde697-ee9d-4fd9-905e-93c2ab782ac2.aspx</pingback:target>
      <dc:creator>Hernan</dc:creator>
      <wfw:comment>http://blog.dynamicprogrammer.com/CommentView,guid,01dde697-ee9d-4fd9-905e-93c2ab782ac2.aspx</wfw:comment>
      <wfw:commentRss>http://blog.dynamicprogrammer.com/SyndicationService.asmx/GetEntryCommentsRss?guid=01dde697-ee9d-4fd9-905e-93c2ab782ac2</wfw:commentRss>
      
      <title>Creating a MongoDB provider for Blogengine.Net – Part 1</title>
      <guid isPermaLink="false">http://blog.dynamicprogrammer.com/PermaLink,guid,01dde697-ee9d-4fd9-905e-93c2ab782ac2.aspx</guid>
      <link>http://feedproxy.google.com/~r/TheDynamicProgrammer/~3/uoBZvhY06Uc/CreatingAMongoDBProviderForBlogengineNetPart1.aspx</link>
      <pubDate>Tue, 09 Mar 2010 04:31:11 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;blockquote&gt;&#xD;
          &lt;p&gt;&#xD;
            &lt;em&gt;The code in this post is of demo quality and should not be taken as production&#xD;
ready code. It’s a first take on the project and will evolve during a series of posts.&lt;/em&gt;&#xD;
          &lt;/p&gt;&#xD;
        &lt;/blockquote&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://www.dotnetblogengine.net/" target="_blank"&gt;Blogengine.net&lt;/a&gt; is an&#xD;
open source blogging platform written in asp.net. The engine comes with two Data store&#xD;
providers a DB provider and an XML provider. Since the engine is using the provider&#xD;
model, it should be fairly easy to write a new data store provider.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
As you may have noticed by some of my previous posts, I’m really interested in alternatives&#xD;
to relational databases, the so called NoSql movement. &#xD;
&lt;/p&gt;&#xD;
        &lt;h5&gt;Getting all the pieces together.&#xD;
&lt;/h5&gt;&#xD;
        &lt;p&gt;&#xD;
First download the Blogengine.net source code from &lt;a href="http://www.codeplex.com/blogengine" target="_blank"&gt;codeplex.com&lt;/a&gt;,&#xD;
a &lt;a href="http://github.com/samus/mongodb-csharp/downloads" target="_blank"&gt;mongodb&#xD;
driver&lt;/a&gt; for .net and &lt;a href="http://www.mongodb.org/display/DOCS/Downloads" target="_blank"&gt;mongodb&lt;/a&gt;.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
At the moment I’m aware of two drivers for .net, the more mature &lt;a href="http://github.com/samus/mongodb-csharp/downloads" target="_blank"&gt;mongodb-csharp&lt;/a&gt; and&#xD;
a more resent one &lt;a href="http://github.com/atheken/NoRM" target="_blank"&gt;NoRM&lt;/a&gt;.&#xD;
NoRM is trying to provide a more OO experience, avoiding the use of strings as much&#xD;
as possible and embracing Linq, it’s still very young but very promising. You can&#xD;
check &lt;a href="http://blog.wekeroad.com/2010/03/04/using-mongo-with-linq" target="_blank"&gt;an&#xD;
article by Rob Connery&lt;/a&gt; to learn some of the capabilities. We will be using mongodb-csharp&#xD;
in this example. (Build from 2010-03-01).&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Be certain of download the proper version of MongoDB for your OS 32 or 64 bits.&#xD;
&lt;/p&gt;&#xD;
        &lt;h5&gt;Installing MongoDB&#xD;
&lt;/h5&gt;&#xD;
        &lt;p&gt;&#xD;
Unzip the files downloaded into a folder of your choice. I’m using c:\MongoDB.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Create a data and db folders under c, you should have something like c:\data\db&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Run mongod.exe from the mobogodb bin folder.&#xD;
&lt;/p&gt;&#xD;
        &lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #000000; min-height: 40px; padding-left: 5px; width: 690px; padding-right: 5px; height: 150px; color: #fff; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&#xD;
          &lt;pre style="background-color: #000000; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;c:\MongoDB\bin&amp;gt;mongod.exe&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #000000; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;mongod.exe --help for help and startup options&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #000000; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;Fri Mar 05 23:09:29 Mongo DB : starting : pid = 0 port = 27017 dbpath = /data/db/ master = 0 slave = 0  64-bit&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #000000; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;Fri Mar 05 23:09:29 db version v1.2.4, pdfile version 4.5&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #000000; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;Fri Mar 05 23:09:29 git version: 5cf582d3d96b882c400c33e7670b811ccd47f477&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #000000; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;Fri Mar 05 23:09:29 sys info: windows (6, 0, 6002, 2, 'Service Pack 2') BOOST_LIB_VERSION=1_39&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #000000; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;Fri Mar 05 23:09:29 waiting for connections on port 27017&lt;/pre&gt;&#xD;
        &lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
To stop the daemon just type Ctrl+c.&#xD;
&lt;/p&gt;&#xD;
        &lt;h5&gt;Setting up the project.&#xD;
&lt;/h5&gt;&#xD;
        &lt;p&gt;&#xD;
You can download the project as I have it set from &lt;a href="http://nosqlproviders.codeplex.com/" target="_blank"&gt;my&#xD;
codeplex repo&lt;/a&gt; using Mercurial to save you some time.(Changeset &lt;a href="http://nosqlproviders.codeplex.com/SourceControl/changeset/view/59b63f72169f"&gt;59b63f72169f&lt;/a&gt;)&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
What I did was to create a new folder \lib under the solution root (of the BlogEngine.Net&#xD;
code), added Nunit, Rhino Mocks and the MongoDb drivers libraries. Them from within&#xD;
VS I added an Specs project to hold my test and a second project to hold the code&#xD;
for the provider.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
You should have something like this right now.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/CreatingaMongoDBproviderforBlogengin.Net_14694/initial_solution_set_up.png"&gt;&#xD;
            &lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="initial_solution_set_up" border="0" alt="initial_solution_set_up" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/CreatingaMongoDBproviderforBlogengin.Net_14694/initial_solution_set_up_thumb.png" width="244" height="168"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
And the following directory structure.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/CreatingaMongoDBproviderforBlogengin.Net_14694/initial_dir_structure.png"&gt;&#xD;
            &lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="initial_dir_structure" border="0" alt="initial_dir_structure" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/CreatingaMongoDBproviderforBlogengin.Net_14694/initial_dir_structure_thumb.png" width="288" height="275"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
You may not have the Resharper files and folders, that depends if you have Resharper&#xD;
installed or not.&#xD;
&lt;/p&gt;&#xD;
        &lt;h5&gt;Lets write the first test for our MongoDBProvider and generate the class, it needs&#xD;
to inherit from BlogProvider.&#xD;
&lt;/h5&gt;&#xD;
        &lt;p&gt;&#xD;
Even when I have the source I’m treating BlogEngine.Net as a close system. This change&#xD;
a little bit the way I will develop such a provider. I have control of the code there&#xD;
are a bunch of stuff that I will probably refactor or move around. But in this case&#xD;
I can’t since I don’t want to fork the project.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The first test will be to insert a new post. The code will look something like this.&#xD;
&lt;/p&gt;&#xD;
        &lt;pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&#xD;
            &lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&#xD;
            &lt;span style="color: #0000ff"&gt;override&lt;/span&gt;&#xD;
            &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; InsertPost(Post&#xD;
post) &lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        {&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&#xD;
            &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; (var&#xD;
db = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; MongoDB()) &lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            {&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                db.Insert(post);&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            }&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        }&lt;/pre&gt;&#xD;
        &lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
Let’s take a look at the MongoDB class.&#xD;
&lt;/p&gt;&#xD;
        &lt;pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  1:     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt; MongoDB&#xD;
: IDisposable &lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  2:     {&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  3:         &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; Mongo&#xD;
_server; &lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  4:         &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; Database&#xD;
_db; &lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  5: &#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  6:         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; MongoDB() &lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  7:         {&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  8:             _server = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Mongo(); &lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  9:         }&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 10: &#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 11:         &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; Database&#xD;
Db() &lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 12:         {&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 13:             &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (_db&#xD;
!= &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; _db; &lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 14:             var server = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Mongo(); &lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 15:             server.Connect();&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 16:             _db = server.getDB(BlogSettings.Instance.Name.Replace("&lt;span style="color: #8b0000"&gt;&lt;/span&gt;",&#xD;
"&lt;span style="color: #8b0000"&gt;_&lt;/span&gt;")); &lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 17:             &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; _db; &lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 18:         }&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 19:         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Insert&amp;lt;TEntity&amp;gt;(TEntity&#xD;
entity) &lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 20:         {&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 21:             Document document = DocumentMapperFactory.GetMapper&amp;lt;TEntity&amp;gt;().Map(entity);&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 22:             Db().GetCollection(entity.GetType().Name+"&lt;span style="color: #8b0000"&gt;Docs&lt;/span&gt;").Insert(document); &lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 23:         }&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 24:         &#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 25:         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Dispose() &lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 26:         {&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffff80; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 27:             _server.Disconnect();&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 28:             _server.Dispose();&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 29:         }&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 30:     }&lt;/pre&gt;&#xD;
        &lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
In line 27 I made sure we disconnect from the db. Note in line 21 that I’m getting&#xD;
a mapper from a factory. This is an obvious requirement since we need a mechanism&#xD;
to map from our objects to the documents and back.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
In the next article we will take a look at the Mapper class for Post, save and update&#xD;
our first entity.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://blog.dynamicprogrammer.com/aggbug.ashx?id=01dde697-ee9d-4fd9-905e-93c2ab782ac2"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/cEOh9mJb_9_QyzFUqZz1UtbR2Bs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cEOh9mJb_9_QyzFUqZz1UtbR2Bs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/cEOh9mJb_9_QyzFUqZz1UtbR2Bs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cEOh9mJb_9_QyzFUqZz1UtbR2Bs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TheDynamicProgrammer/~4/uoBZvhY06Uc" height="1" width="1"/&gt;</description>
      <comments>http://blog.dynamicprogrammer.com/CommentView,guid,01dde697-ee9d-4fd9-905e-93c2ab782ac2.aspx</comments>
      <category>MongoDB</category>
      <category>Programming</category>
    <feedburner:origLink>http://blog.dynamicprogrammer.com/2010/03/09/CreatingAMongoDBProviderForBlogengineNetPart1.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://blog.dynamicprogrammer.com/Trackback.aspx?guid=c7c2b4c2-a8ca-4aa9-8a0c-2e06d059995d</trackback:ping>
      <pingback:server>http://blog.dynamicprogrammer.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.dynamicprogrammer.com/PermaLink,guid,c7c2b4c2-a8ca-4aa9-8a0c-2e06d059995d.aspx</pingback:target>
      <dc:creator>Hernan</dc:creator>
      <wfw:comment>http://blog.dynamicprogrammer.com/CommentView,guid,c7c2b4c2-a8ca-4aa9-8a0c-2e06d059995d.aspx</wfw:comment>
      <wfw:commentRss>http://blog.dynamicprogrammer.com/SyndicationService.asmx/GetEntryCommentsRss?guid=c7c2b4c2-a8ca-4aa9-8a0c-2e06d059995d</wfw:commentRss>
      <slash:comments>1</slash:comments>
      
      <title>Clone a project on Codeplex to your own Codeplex repo with Mercurial.</title>
      <guid isPermaLink="false">http://blog.dynamicprogrammer.com/PermaLink,guid,c7c2b4c2-a8ca-4aa9-8a0c-2e06d059995d.aspx</guid>
      <link>http://feedproxy.google.com/~r/TheDynamicProgrammer/~3/eCoF7YJNtUk/CloneAProjectOnCodeplexToYourOwnCodeplexRepoWithMercurial.aspx</link>
      <pubDate>Wed, 03 Mar 2010 04:48:20 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
If you use Github (Git) or Bitbucket (Mercurial) you are familiar with the ability&#xD;
to fork a project into your own repository in those sites.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/Cloneaprojectoncodeplextoyourowncodeple_14BF6/github_fork.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="github_fork" border="0" alt="github_fork" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/Cloneaprojectoncodeplextoyourowncodeple_14BF6/github_fork_thumb.png" width="510" height="145"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/Cloneaprojectoncodeplextoyourowncodeple_14BF6/bitbucket_fork.png"&gt;&#xD;
            &lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="bitbucket_fork" border="0" alt="bitbucket_fork" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/Cloneaprojectoncodeplextoyourowncodeple_14BF6/bitbucket_fork_thumb.png" width="513" height="174"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Once forked you can start working in your own repo and once you are ready to integrate&#xD;
you will send a pull request to the master repository. &#xD;
&lt;br&gt;&#xD;
Codeplex recently started using Mercurial but it doesn’t have (or I couldn’t find)&#xD;
a way to clone a project directly from inside Codeplex.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;strong&gt;UPDATED March 5: Yesterday Codeplex added support for forks, check &lt;/strong&gt;&#xD;
          &lt;a href="http://blogs.msdn.com/codeplex/archive/2010/03/05/codeplex-mercurial-support-for-forks.aspx" target="_blank"&gt;&#xD;
            &lt;strong&gt;this&#xD;
article here&lt;/strong&gt;&#xD;
          &lt;/a&gt;&#xD;
          &lt;strong&gt;.&lt;/strong&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;h3&gt;&#xD;
        &lt;/h3&gt;&#xD;
        &lt;p&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;h4&gt;First, cloning to your local computer&#xD;
&lt;/h4&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;em&gt;You need to have &lt;a href="http://bitbucket.org/tortoisehg/stable/wiki/download" target="_blank"&gt;TortoiseHg&lt;/a&gt; installed&#xD;
on your computer before going forward with this tutorial.&lt;/em&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
First you need to check out the project you want to fork using the clone url:&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Go to the source control page of the project and click on the source control connection&#xD;
instructions.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/Cloneaprojectoncodeplextoyourowncodeple_14BF6/sc_connection_instructions.png"&gt;&#xD;
            &lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="sc_connection_instructions" border="0" alt="sc_connection_instructions" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/Cloneaprojectoncodeplextoyourowncodeple_14BF6/sc_connection_instructions_thumb.png" width="556" height="135"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Copy the clone url and open the TortoiseHg clone window.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/Cloneaprojectoncodeplextoyourowncodeple_14BF6/hg_clone.png"&gt;&#xD;
            &lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="hg_clone" border="0" alt="hg_clone" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/Cloneaprojectoncodeplextoyourowncodeple_14BF6/hg_clone_thumb.png" width="578" height="159"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Enter the repository url as the source path and select a folder where to clone the&#xD;
repository. If you don’t have a folder already created for this repo, just add the&#xD;
name in the destination path text field and the folder will be create.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/Cloneaprojectoncodeplextoyourowncodeple_14BF6/clone_dialog.png"&gt;&#xD;
            &lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clone_dialog" border="0" alt="clone_dialog" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/Cloneaprojectoncodeplextoyourowncodeple_14BF6/clone_dialog_thumb.png" width="552" height="196"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &#xD;
&lt;/p&gt;&#xD;
        &lt;h4&gt;Second create a project on Codeplex and add as a Sync source. &#xD;
&lt;/h4&gt;&#xD;
        &lt;p&gt;&#xD;
Log into Codeplex (or create an account) and create a project where you want to work&#xD;
on, make sure you select Mercurial as your source control. &#xD;
&lt;br&gt;&#xD;
You should be able to also use Google code to host your clone, everything should work&#xD;
the same, just make sure you use Mercurial as well.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Once the project is created go to your new project source control page and copy the&#xD;
address to your repository.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
In your computer open the properties of your cloned repository (the one we cloned&#xD;
in the previous step).&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/Cloneaprojectoncodeplextoyourowncodeple_14BF6/repo_settings.png"&gt;&#xD;
            &lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="repo_settings" border="0" alt="repo_settings" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/Cloneaprojectoncodeplextoyourowncodeple_14BF6/repo_settings_thumb.png" width="488" height="383"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Go to the sync tab and click in the Add button.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/Cloneaprojectoncodeplextoyourowncodeple_14BF6/sync_dialog.png"&gt;&#xD;
            &lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="sync_dialog" border="0" alt="sync_dialog" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/Cloneaprojectoncodeplextoyourowncodeple_14BF6/sync_dialog_thumb.png" width="304" height="438"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Notice that the default (an only) repository is the original one, we want to add the&#xD;
repo to our newly created project and set it as default.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/Cloneaprojectoncodeplextoyourowncodeple_14BF6/add_remote_source.png"&gt;&#xD;
            &lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="add_remote_source" border="0" alt="add_remote_source" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/Cloneaprojectoncodeplextoyourowncodeple_14BF6/add_remote_source_thumb.png" width="516" height="232"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
If you are using https authentication make sure you add your username and password&#xD;
following this form: &lt;a href="https://username:password@hg01.codeplex.com/repository"&gt;https://username:password@hg01.codeplex.com/repository&lt;/a&gt;&lt;br&gt;&#xD;
Add any Alias name but not “default”, not now. Click Ok.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Select the Remote repository marked as default and click the edit button, change the&#xD;
alias from default to “origin”&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/Cloneaprojectoncodeplextoyourowncodeple_14BF6/change_default_to_origin.png"&gt;&#xD;
            &lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="change_default_to_origin" border="0" alt="change_default_to_origin" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/Cloneaprojectoncodeplextoyourowncodeple_14BF6/change_default_to_origin_thumb.png" width="505" height="179"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Now in the sync dialog select the new repository (the one pointing to your project)&#xD;
and click the Set as default button.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/Cloneaprojectoncodeplextoyourowncodeple_14BF6/click_default.png"&gt;&#xD;
            &lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="click_default" border="0" alt="click_default" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/Cloneaprojectoncodeplextoyourowncodeple_14BF6/click_default_thumb.png" width="185" height="91"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Once done you should have something like this, the name of the projects should reflect&#xD;
the projects you are working with.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/Cloneaprojectoncodeplextoyourowncodeple_14BF6/default_sets_1.png"&gt;&#xD;
            &lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="default_sets" border="0" alt="default_sets" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/Cloneaprojectoncodeplextoyourowncodeple_14BF6/default_sets_thumb_1.png" width="657" height="165"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
At this moment you are ready to push the code to your new project, just open the synchronize&#xD;
window from TortoiseHg and click push.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/Cloneaprojectoncodeplextoyourowncodeple_14BF6/commit_to_your_project.png"&gt;&#xD;
            &lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="commit_to_your_project" border="0" alt="commit_to_your_project" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/Cloneaprojectoncodeplextoyourowncodeple_14BF6/commit_to_your_project_thumb.png" width="520" height="320"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Once this is done, go to the source code tab in Codeplex and take a look, notice that&#xD;
you should have all commits from the original project plus any new commits done into&#xD;
your clone, in this case I added three commits after cloning.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/Cloneaprojectoncodeplextoyourowncodeple_14BF6/new_changeset.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="new_changeset" border="0" alt="new_changeset" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/Cloneaprojectoncodeplextoyourowncodeple_14BF6/new_changeset_thumb.png" width="503" height="291"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/Cloneaprojectoncodeplextoyourowncodeple_14BF6/blog_engine_sc.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="blog_engine_sc" border="0" alt="blog_engine_sc" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/Cloneaprojectoncodeplextoyourowncodeple_14BF6/blog_engine_sc_thumb.png" width="486" height="281"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
        &lt;h4&gt;From inside Visual Studio&#xD;
&lt;/h4&gt;&#xD;
        &lt;p&gt;&#xD;
Or course this works from inside Visual Studio as well if you have &lt;a href="http://blog.dynamicprogrammer.com/2010/02/20/MercurialIntegrationWithVisualStudio.aspx"&gt;the&#xD;
Hg plug-in installed&lt;/a&gt;&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/Cloneaprojectoncodeplextoyourowncodeple_14BF6/from_inside_vs.png"&gt;&#xD;
            &lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="from_inside_vs" border="0" alt="from_inside_vs" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/Cloneaprojectoncodeplextoyourowncodeple_14BF6/from_inside_vs_thumb.png" width="486" height="275"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://blog.dynamicprogrammer.com/aggbug.ashx?id=c7c2b4c2-a8ca-4aa9-8a0c-2e06d059995d"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/FrYN4Dv2rakh66JIwEzPQ1Wss3I/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FrYN4Dv2rakh66JIwEzPQ1Wss3I/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/FrYN4Dv2rakh66JIwEzPQ1Wss3I/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FrYN4Dv2rakh66JIwEzPQ1Wss3I/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TheDynamicProgrammer/~4/eCoF7YJNtUk" height="1" width="1"/&gt;</description>
      <comments>http://blog.dynamicprogrammer.com/CommentView,guid,c7c2b4c2-a8ca-4aa9-8a0c-2e06d059995d.aspx</comments>
      <category>Programming</category>
      <category>Tools</category>
    <feedburner:origLink>http://blog.dynamicprogrammer.com/2010/03/03/CloneAProjectOnCodeplexToYourOwnCodeplexRepoWithMercurial.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://blog.dynamicprogrammer.com/Trackback.aspx?guid=68bda724-29a4-427a-98ff-803e4d56a713</trackback:ping>
      <pingback:server>http://blog.dynamicprogrammer.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.dynamicprogrammer.com/PermaLink,guid,68bda724-29a4-427a-98ff-803e4d56a713.aspx</pingback:target>
      <dc:creator>Hernan</dc:creator>
      <wfw:comment>http://blog.dynamicprogrammer.com/CommentView,guid,68bda724-29a4-427a-98ff-803e4d56a713.aspx</wfw:comment>
      <wfw:commentRss>http://blog.dynamicprogrammer.com/SyndicationService.asmx/GetEntryCommentsRss?guid=68bda724-29a4-427a-98ff-803e4d56a713</wfw:commentRss>
      
      <title>Videos of the PyCon 2010 sessions.</title>
      <guid isPermaLink="false">http://blog.dynamicprogrammer.com/PermaLink,guid,68bda724-29a4-427a-98ff-803e4d56a713.aspx</guid>
      <link>http://feedproxy.google.com/~r/TheDynamicProgrammer/~3/HgXlti6-ACM/VideosOfThePyCon2010Sessions.aspx</link>
      <pubDate>Thu, 25 Feb 2010 14:15:03 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
If you, like me, haven’t been able to go to PyCon don’t despair. The videos of the&#xD;
sessions are available at &lt;a href="http://blip.tv" target="_blank"&gt;blip.tv&lt;/a&gt;, just&#xD;
visited &lt;a title="http://pycon.blip.tv/" href="http://pycon.blip.tv/"&gt;http://pycon.blip.tv/&lt;/a&gt; or &lt;a title="http://pycon.blip.tv/posts?view=archive&amp;amp;nsfw=dc" href="http://pycon.blip.tv/posts?view=archive&amp;amp;nsfw=dc"&gt;http://pycon.blip.tv/posts?view=archive&amp;amp;nsfw=dc&lt;/a&gt; for&#xD;
a list of all the videos.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Some of my recommendation so far.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Test and Testability, &lt;a title="http://pycon.blip.tv/file/3261272/" href="http://pycon.blip.tv/file/3261272/"&gt;http://pycon.blip.tv/file/3261272/&lt;/a&gt;&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Selenium RC with Python, &lt;a title="http://pycon.blip.tv/file/3264579/" href="http://pycon.blip.tv/file/3264579/"&gt;http://pycon.blip.tv/file/3264579/&lt;/a&gt;&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
What every developer should know about database scalability: &lt;a title="http://pycon.blip.tv/file/3261223/" href="http://pycon.blip.tv/file/3261223/"&gt;http://pycon.blip.tv/file/3261223/&lt;/a&gt;&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://blog.dynamicprogrammer.com/aggbug.ashx?id=68bda724-29a4-427a-98ff-803e4d56a713"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/hxhFJcM5IMOiQyttufMQZMwx6IY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hxhFJcM5IMOiQyttufMQZMwx6IY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/hxhFJcM5IMOiQyttufMQZMwx6IY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hxhFJcM5IMOiQyttufMQZMwx6IY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TheDynamicProgrammer/~4/HgXlti6-ACM" height="1" width="1"/&gt;</description>
      <comments>http://blog.dynamicprogrammer.com/CommentView,guid,68bda724-29a4-427a-98ff-803e4d56a713.aspx</comments>
      <category>General</category>
      <category>Programming</category>
    <feedburner:origLink>http://blog.dynamicprogrammer.com/2010/02/25/VideosOfThePyCon2010Sessions.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://blog.dynamicprogrammer.com/Trackback.aspx?guid=0ab2eb65-fd64-411a-842f-2f2a957fa87d</trackback:ping>
      <pingback:server>http://blog.dynamicprogrammer.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.dynamicprogrammer.com/PermaLink,guid,0ab2eb65-fd64-411a-842f-2f2a957fa87d.aspx</pingback:target>
      <dc:creator>Hernan</dc:creator>
      <wfw:comment>http://blog.dynamicprogrammer.com/CommentView,guid,0ab2eb65-fd64-411a-842f-2f2a957fa87d.aspx</wfw:comment>
      <wfw:commentRss>http://blog.dynamicprogrammer.com/SyndicationService.asmx/GetEntryCommentsRss?guid=0ab2eb65-fd64-411a-842f-2f2a957fa87d</wfw:commentRss>
      
      <title>Going mobile with Mippin.</title>
      <guid isPermaLink="false">http://blog.dynamicprogrammer.com/PermaLink,guid,0ab2eb65-fd64-411a-842f-2f2a957fa87d.aspx</guid>
      <link>http://feedproxy.google.com/~r/TheDynamicProgrammer/~3/ZClnqpBn93A/GoingMobileWithMippin.aspx</link>
      <pubDate>Thu, 25 Feb 2010 13:35:11 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
This blog is going mobile. I will be using the services of &lt;a href="http://mippin.com" target="_blank"&gt;Mippin&lt;/a&gt;.&#xD;
To visit the mobile version of the site just go to: &lt;a href="http://mippin.com/dynamicprogrammer" target="_blank"&gt;http://mippin.com/dynamicprogrammer&lt;/a&gt;&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://blog.dynamicprogrammer.com/aggbug.ashx?id=0ab2eb65-fd64-411a-842f-2f2a957fa87d"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/9XfR8BLtwEgEey57jGVZDm8Ddgk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9XfR8BLtwEgEey57jGVZDm8Ddgk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/9XfR8BLtwEgEey57jGVZDm8Ddgk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9XfR8BLtwEgEey57jGVZDm8Ddgk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TheDynamicProgrammer/~4/ZClnqpBn93A" height="1" width="1"/&gt;</description>
      <comments>http://blog.dynamicprogrammer.com/CommentView,guid,0ab2eb65-fd64-411a-842f-2f2a957fa87d.aspx</comments>
      <category>General</category>
    <feedburner:origLink>http://blog.dynamicprogrammer.com/2010/02/25/GoingMobileWithMippin.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://blog.dynamicprogrammer.com/Trackback.aspx?guid=d31ddbdd-0d5a-49b3-9546-f74cdf554f03</trackback:ping>
      <pingback:server>http://blog.dynamicprogrammer.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.dynamicprogrammer.com/PermaLink,guid,d31ddbdd-0d5a-49b3-9546-f74cdf554f03.aspx</pingback:target>
      <dc:creator>Hernan</dc:creator>
      <wfw:comment>http://blog.dynamicprogrammer.com/CommentView,guid,d31ddbdd-0d5a-49b3-9546-f74cdf554f03.aspx</wfw:comment>
      <wfw:commentRss>http://blog.dynamicprogrammer.com/SyndicationService.asmx/GetEntryCommentsRss?guid=d31ddbdd-0d5a-49b3-9546-f74cdf554f03</wfw:commentRss>
      
      <title>Digging SpecFlow, misspelling Gerkhin files</title>
      <guid isPermaLink="false">http://blog.dynamicprogrammer.com/PermaLink,guid,d31ddbdd-0d5a-49b3-9546-f74cdf554f03.aspx</guid>
      <link>http://feedproxy.google.com/~r/TheDynamicProgrammer/~3/JM1YfvKf9Sk/DiggingSpecFlowMisspellingGerkhinFiles.aspx</link>
      <pubDate>Tue, 23 Feb 2010 15:39:55 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
I’m a proponent of dynamic languages and I love Ruby and Cucumber but I have to admit&#xD;
that this is cool. I was writing a set of specifications with &lt;a href="http://www.specflow.org/" target="_blank"&gt;SpecFlow&lt;/a&gt; today&#xD;
and suddenly I saw this error in Visual Studio.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/DiggingSpecFlowmisspellingGerkhinfiles_95F2/Scenaio.png"&gt;&#xD;
            &lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Scenaio" border="0" alt="Scenaio" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/DiggingSpecFlowmisspellingGerkhinfiles_95F2/Scenaio_thumb.png" width="642" height="209"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Double clicking the line takes you to the misspelling error in the Specification file.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/DiggingSpecFlowmisspellingGerkhinfiles_95F2/Mispelling.png"&gt;&#xD;
            &lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Mispelling" border="0" alt="Mispelling" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/DiggingSpecFlowmisspellingGerkhinfiles_95F2/Mispelling_thumb.png" width="674" height="216"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I though that was really cool, specially for the slightly dyslexic programmers like&#xD;
myself. :-) &#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://blog.dynamicprogrammer.com/aggbug.ashx?id=d31ddbdd-0d5a-49b3-9546-f74cdf554f03"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/CTn7BZeR516mL_OSahpa2hMutWk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CTn7BZeR516mL_OSahpa2hMutWk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/CTn7BZeR516mL_OSahpa2hMutWk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CTn7BZeR516mL_OSahpa2hMutWk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TheDynamicProgrammer/~4/JM1YfvKf9Sk" height="1" width="1"/&gt;</description>
      <comments>http://blog.dynamicprogrammer.com/CommentView,guid,d31ddbdd-0d5a-49b3-9546-f74cdf554f03.aspx</comments>
      <category>Testing</category>
      <category>Tools</category>
    <feedburner:origLink>http://blog.dynamicprogrammer.com/2010/02/23/DiggingSpecFlowMisspellingGerkhinFiles.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://blog.dynamicprogrammer.com/Trackback.aspx?guid=201e653d-0fd0-464d-9d2e-42707f7b1e33</trackback:ping>
      <pingback:server>http://blog.dynamicprogrammer.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.dynamicprogrammer.com/PermaLink,guid,201e653d-0fd0-464d-9d2e-42707f7b1e33.aspx</pingback:target>
      <dc:creator>Hernan</dc:creator>
      <wfw:comment>http://blog.dynamicprogrammer.com/CommentView,guid,201e653d-0fd0-464d-9d2e-42707f7b1e33.aspx</wfw:comment>
      <wfw:commentRss>http://blog.dynamicprogrammer.com/SyndicationService.asmx/GetEntryCommentsRss?guid=201e653d-0fd0-464d-9d2e-42707f7b1e33</wfw:commentRss>
      
      <title>Mercurial integration with Visual Studio</title>
      <guid isPermaLink="false">http://blog.dynamicprogrammer.com/PermaLink,guid,201e653d-0fd0-464d-9d2e-42707f7b1e33.aspx</guid>
      <link>http://feedproxy.google.com/~r/TheDynamicProgrammer/~3/JE8FauCUYwQ/MercurialIntegrationWithVisualStudio.aspx</link>
      <pubDate>Sat, 20 Feb 2010 04:57:28 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
I recently posted about how to &lt;a href="http://blog.dynamicprogrammer.com/2010/02/15/GitIntegrationWithVisualStudio.aspx" target="_blank"&gt;integrate&#xD;
Git with Visual Studio&lt;/a&gt;. Of course Git is not the only DVCS out there. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Mercurial is another source control system similar to Git that is having more and&#xD;
more relevance. Google code have been supporting it for quite a while and &lt;a href="http://blogs.msdn.com/codeplex/archive/2010/01/22/codeplex-now-supporting-native-mercurial.aspx" target="_blank"&gt;recently&#xD;
Microsoft announced that Codeplex is adding it as an option for new projects&lt;/a&gt;.&#xD;
(Codeplex already supported TFS and Subversion).&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
At work we use &lt;a href="http://www.fogcreek.com/FogBugz/" target="_blank"&gt;Fogbugz&lt;/a&gt; as&#xD;
our bug tracking/project management tool. A few months ago the people at &lt;a href="http://fogcreek.com/" target="_blank"&gt;Fogcreek&lt;/a&gt; started&#xD;
a beta for &lt;a href="http://fogcreek.com/kiln/" target="_blank"&gt;Kiln&lt;/a&gt; a code review/source&#xD;
control system that runs on top of mercurial.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I sign up for the beta and have been running a pilot project on it. Since I really&#xD;
like it I decided to start moving all our projects to Kiln and ditch Subversion. The&#xD;
piece that I was missing was a good integration into VS for the rest of my team.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
A few day ago I found &lt;a href="http://www.newsupaplex.pp.ru/hgscc_news_eng.html" target="_blank"&gt;Mercurial&#xD;
VSS&lt;/a&gt; an integration package for Mercurial into VS.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The installation is very simple, just select the version of VS you want to install&#xD;
against (version 1.0.7 released today integrates without problems with both VS 2008&#xD;
and 2010 RC).&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/MercurialintegrationwithVisualStudio_1474C/select_vs_version.png"&gt;&#xD;
            &lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="select_vs_version" border="0" alt="select_vs_version" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/MercurialintegrationwithVisualStudio_1474C/select_vs_version_thumb.png" width="358" height="197"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
After installed go to Tools –&amp;gt; Options and make sure you select display all options&#xD;
(only in VS 2008).&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/MercurialintegrationwithVisualStudio_1474C/select_show_all_options.png"&gt;&#xD;
            &lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="select_show_all_options" border="0" alt="select_show_all_options" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/MercurialintegrationwithVisualStudio_1474C/select_show_all_options_thumb.png" width="236" height="404"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Select the Source Control option and in the Plug-in Selection option change it to&#xD;
Mercurial.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/MercurialintegrationwithVisualStudio_1474C/set_scs_plug_inn.png"&gt;&#xD;
            &lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="set_scs_plug_inn" border="0" alt="set_scs_plug_inn" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/MercurialintegrationwithVisualStudio_1474C/set_scs_plug_inn_thumb.png" width="506" height="207"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt; &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
After open a project (even one that is already under source control) you will need&#xD;
to select the Add to source control option from the contextual menu inside the Solution&#xD;
explorer.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/MercurialintegrationwithVisualStudio_1474C/add_to_sc.png"&gt;&#xD;
            &lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="add_to_sc" border="0" alt="add_to_sc" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/MercurialintegrationwithVisualStudio_1474C/add_to_sc_thumb.png" width="293" height="256"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;  &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
After added you will se a tilde besides each project.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/MercurialintegrationwithVisualStudio_1474C/solution_added.png"&gt;&#xD;
            &lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="solution_added" border="0" alt="solution_added" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/MercurialintegrationwithVisualStudio_1474C/solution_added_thumb.png" width="306" height="147"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
This are the options available from the contextual menu.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/MercurialintegrationwithVisualStudio_1474C/hg_menu_options.png"&gt;&#xD;
            &lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="hg_menu_options" border="0" alt="hg_menu_options" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/MercurialintegrationwithVisualStudio_1474C/hg_menu_options_thumb.png" width="330" height="280"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
And a few screen captures of the different options.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Change log&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/MercurialintegrationwithVisualStudio_1474C/Change_log.png"&gt;&#xD;
            &lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Change_log" border="0" alt="Change_log" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/MercurialintegrationwithVisualStudio_1474C/Change_log_thumb.png" width="546" height="263"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Commit&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/MercurialintegrationwithVisualStudio_1474C/commit_window.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="commit_window" border="0" alt="commit_window" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/MercurialintegrationwithVisualStudio_1474C/commit_window_thumb.png" width="537" height="417"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
History&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/MercurialintegrationwithVisualStudio_1474C/history.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="history" border="0" alt="history" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/MercurialintegrationwithVisualStudio_1474C/history_thumb.png" width="526" height="293"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Pull&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/MercurialintegrationwithVisualStudio_1474C/Pull.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Pull" border="0" alt="Pull" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/MercurialintegrationwithVisualStudio_1474C/Pull_thumb.png" width="538" height="226"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Push&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/MercurialintegrationwithVisualStudio_1474C/push.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="push" border="0" alt="push" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/MercurialintegrationwithVisualStudio_1474C/push_thumb.png" width="548" height="233"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Revert&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/MercurialintegrationwithVisualStudio_1474C/revert.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="revert" border="0" alt="revert" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/MercurialintegrationwithVisualStudio_1474C/revert_thumb.png" width="453" height="268"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Tags&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/MercurialintegrationwithVisualStudio_1474C/taggingt.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="taggingt" border="0" alt="taggingt" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/MercurialintegrationwithVisualStudio_1474C/taggingt_thumb.png" width="472" height="269"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Update&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/MercurialintegrationwithVisualStudio_1474C/Update_window.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Update_window" border="0" alt="Update_window" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/MercurialintegrationwithVisualStudio_1474C/Update_window_thumb.png" width="525" height="282"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;h5&gt;Conclusion&#xD;
&lt;/h5&gt;&#xD;
        &lt;p&gt;&#xD;
WIth the support from Codeplex and Google code to Mercurial and the tight integration&#xD;
that this plug in presents I see no reason why people will not use it as the DVCS&#xD;
of choice for .net open source projects hosted on those sites. &#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://blog.dynamicprogrammer.com/aggbug.ashx?id=201e653d-0fd0-464d-9d2e-42707f7b1e33"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/2tfoILEYJWeVfarv4IWUfE8R8U8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2tfoILEYJWeVfarv4IWUfE8R8U8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/2tfoILEYJWeVfarv4IWUfE8R8U8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2tfoILEYJWeVfarv4IWUfE8R8U8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TheDynamicProgrammer/~4/JE8FauCUYwQ" height="1" width="1"/&gt;</description>
      <comments>http://blog.dynamicprogrammer.com/CommentView,guid,201e653d-0fd0-464d-9d2e-42707f7b1e33.aspx</comments>
      <category>Programming</category>
      <category>Tools</category>
    <feedburner:origLink>http://blog.dynamicprogrammer.com/2010/02/20/MercurialIntegrationWithVisualStudio.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://blog.dynamicprogrammer.com/Trackback.aspx?guid=ba89969b-2442-4fe5-91e9-01b61d1ca504</trackback:ping>
      <pingback:server>http://blog.dynamicprogrammer.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.dynamicprogrammer.com/PermaLink,guid,ba89969b-2442-4fe5-91e9-01b61d1ca504.aspx</pingback:target>
      <dc:creator>Hernan</dc:creator>
      <wfw:comment>http://blog.dynamicprogrammer.com/CommentView,guid,ba89969b-2442-4fe5-91e9-01b61d1ca504.aspx</wfw:comment>
      <wfw:commentRss>http://blog.dynamicprogrammer.com/SyndicationService.asmx/GetEntryCommentsRss?guid=ba89969b-2442-4fe5-91e9-01b61d1ca504</wfw:commentRss>
      
      <title>Book review: Agile Retrospectives – Making good teams great.</title>
      <guid isPermaLink="false">http://blog.dynamicprogrammer.com/PermaLink,guid,ba89969b-2442-4fe5-91e9-01b61d1ca504.aspx</guid>
      <link>http://feedproxy.google.com/~r/TheDynamicProgrammer/~3/to8owP2jxA4/BookReviewAgileRetrospectivesMakingGoodTeamsGreat.aspx</link>
      <pubDate>Fri, 19 Feb 2010 04:00:16 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
This is a very short book on a great practice for any agile team. The book walk you&#xD;
through a lot of techniques an exercises that will help you and your team to have&#xD;
successful retrospectives.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The first 3 chapters provide information on what retrospectives are about. How to&#xD;
create one for your team and what you need to learn to lead them.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The next 5 chapters provide techniques that will help you to go through the different&#xD;
stages of the retrospective. Each technique is clearly explained, with step by step&#xD;
guides and diagrams (when necessary) to provide more information. In some cases, when&#xD;
some techniques are complimentary, this is clearly indicated.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The authors also provide guidance on the scope where to apply the activities and a&#xD;
time estimate.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The previous to last chapter talk briefly about release retrospectives and the last&#xD;
one give some pointers in how to act on the actions, resolutions and experiments the&#xD;
team agree to follow.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
If you work as a team lead in an agile team and you are in charge of facilitating&#xD;
the retrospectives, this book is a good tool to have.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://blog.dynamicprogrammer.com/aggbug.ashx?id=ba89969b-2442-4fe5-91e9-01b61d1ca504"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/FG-QuAQeHWCEAGkglj_gqLCH9cc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FG-QuAQeHWCEAGkglj_gqLCH9cc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/FG-QuAQeHWCEAGkglj_gqLCH9cc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FG-QuAQeHWCEAGkglj_gqLCH9cc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TheDynamicProgrammer/~4/to8owP2jxA4" height="1" width="1"/&gt;</description>
      <comments>http://blog.dynamicprogrammer.com/CommentView,guid,ba89969b-2442-4fe5-91e9-01b61d1ca504.aspx</comments>
      <category>Books</category>
      <category>Methodology</category>
    <feedburner:origLink>http://blog.dynamicprogrammer.com/2010/02/19/BookReviewAgileRetrospectivesMakingGoodTeamsGreat.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://blog.dynamicprogrammer.com/Trackback.aspx?guid=5196a90a-3fce-4775-9f50-a66dd80cd2a8</trackback:ping>
      <pingback:server>http://blog.dynamicprogrammer.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.dynamicprogrammer.com/PermaLink,guid,5196a90a-3fce-4775-9f50-a66dd80cd2a8.aspx</pingback:target>
      <dc:creator>Hernan</dc:creator>
      <wfw:comment>http://blog.dynamicprogrammer.com/CommentView,guid,5196a90a-3fce-4775-9f50-a66dd80cd2a8.aspx</wfw:comment>
      <wfw:commentRss>http://blog.dynamicprogrammer.com/SyndicationService.asmx/GetEntryCommentsRss?guid=5196a90a-3fce-4775-9f50-a66dd80cd2a8</wfw:commentRss>
      
      <title>Continuous Improvement: my list of books for the next little while.</title>
      <guid isPermaLink="false">http://blog.dynamicprogrammer.com/PermaLink,guid,5196a90a-3fce-4775-9f50-a66dd80cd2a8.aspx</guid>
      <link>http://feedproxy.google.com/~r/TheDynamicProgrammer/~3/JAnbFsfVNqU/ContinuousImprovementMyListOfBooksForTheNextLittleWhile.aspx</link>
      <pubDate>Thu, 18 Feb 2010 03:55:56 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
Yesterday I received another box of books from Amazon.ca with 6 more books in it.&#xD;
After taking them out and putting them down into my already filled shelves I sat down&#xD;
and look at the pile of books. 17 computer books in all that I haven’t started or&#xD;
haven’t finished.&lt;br&gt;&lt;br&gt;&#xD;
I decided that it was time to make a list and put some kind of priority/order on the&#xD;
reading ahead.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
So here it goes, this is the list (in order for now) of books that I plan to read&#xD;
in the next 6-9 months.&#xD;
&lt;/p&gt;&#xD;
        &lt;h5&gt;Computer programming and methodology)&#xD;
&lt;/h5&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://www.pragprog.com/titles/dlret/agile-retrospectives" target="_blank"&gt;Agile&#xD;
Retrospectives: Making good teams great&lt;/a&gt; (&lt;strike&gt;in progress&lt;/strike&gt;  &lt;a href="http://blog.dynamicprogrammer.com/2010/02/19/BookReviewAgileRetrospectivesMakingGoodTeamsGreat.aspx"&gt;Finished&lt;/a&gt;)&#xD;
(BTW: I just found &lt;a href="http://www.youtube.com/watch?v=qqtPZYigfNI" target="_blank"&gt;this&#xD;
presentation&lt;/a&gt; from the authors at Google)&lt;br&gt;&lt;a href="http://www.growing-object-oriented-software.com/" target="_blank"&gt;Growing&#xD;
object-oriented software guided by test&lt;/a&gt; (in progress)&lt;br&gt;&lt;a href="http://www.amazon.com/User-Stories-Applied-Software-Development/dp/0321205685" target="_blank"&gt;User&#xD;
stories applied&lt;/a&gt;.&lt;br&gt;&lt;a href="http://www.wrox.com/WileyCDA/WroxTitle/Testing-ASP-NET-Web-Applications.productCd-0470496649.html" target="_blank"&gt;Testing&#xD;
ASP.NET Web applications&lt;/a&gt;.&lt;br&gt;&lt;a href="http://www.pragprog.com/titles/pbdp/debug-it" target="_blank"&gt;Debug it!&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.pragprog.com/titles/prj/ship-it" target="_blank"&gt;Ship it!&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.ironpythoninaction.com/" target="_blank"&gt;IronPython in Action&lt;/a&gt; (finish&#xD;
this one. It’s a great book. I’m just busy)&lt;br&gt;&lt;a href="http://apress.com/book/view/9781430219897" target="_blank"&gt;Beginning Scala&lt;/a&gt;.&lt;br&gt;&lt;br&gt;&#xD;
[The order after this one is just tentative]&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://www.amazon.com/Designing-Obvious-Common-Approach-Application/dp/032145345X" target="_blank"&gt;Designing&#xD;
the obvious&lt;/a&gt;.&lt;br&gt;&lt;a href="http://www.amazon.com/Code-Language-Computer-Hardware-Software/dp/0735611319" target="_blank"&gt;C.O.D.E&#xD;
The hidden language of computer software and hardware&lt;/a&gt; (in progress – fantastic&#xD;
book, geeky, deep and incredible well written)&lt;br&gt;&lt;a href="http://www.amazon.com/Designing-Moment-Interface-Design-Concepts/dp/0321535081/ref=pd_sim_b_2" target="_blank"&gt;Designing&#xD;
the moment&lt;/a&gt;.&lt;br&gt;&lt;a href="http://apress.com/book/view/1590598504" target="_blank"&gt;Expert F#&lt;/a&gt;.&lt;br&gt;&lt;a href="http://www.pragprog.com/titles/mnee/release-it" target="_blank"&gt;Release it!&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.manning.com/rahien/" target="_blank"&gt;DSLs in Boo&lt;/a&gt;.&lt;br&gt;&lt;a href="http://www.amazon.com/Web-Application-Hackers-Handbook-Discovering/dp/0470170778" target="_blank"&gt;Web&#xD;
application hackers handbook&lt;/a&gt;. (probably need to read this sooner)&lt;br&gt;&lt;a href="http://www.amazon.com/Agile-Principles-Patterns-Practices-C/dp/0131857258" target="_blank"&gt;Agile&#xD;
principles, patterns and practices in c#.&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.amazon.ca/ASP-NET-Framework-Unleashed-Stephen-Walther/dp/0672329980" target="_blank"&gt;ASP.NET&#xD;
MVC framework unleashed&lt;/a&gt;.&lt;br&gt;&lt;a href="http://www.amazon.com/Foundation-Expression-Blend-Silverlight-Foundations/dp/1430219505" target="_blank"&gt;Foundation&#xD;
Expression Blend 3 with Silverlight&lt;/a&gt;. (Finish this one, but since Silverlight 4&#xD;
is coming I may just wait). &#xD;
&lt;/p&gt;&#xD;
        &lt;h5&gt;General reading.&#xD;
&lt;/h5&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://brainrules.net/" target="_blank"&gt;Brain rules&lt;/a&gt;.&lt;br&gt;&lt;a href="http://www.amazon.com/Once-More-Around-Park-Baseball/dp/1566633710" target="_blank"&gt;Once&#xD;
more around the park&lt;/a&gt;.&lt;br&gt;&lt;a href="http://www.amazon.com/Boys-Summer-Roger-Kahn/dp/0060914165" target="_blank"&gt;The&#xD;
boys of summer&lt;/a&gt;.&lt;br&gt;&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I will try to keep this list updated (I make no promise though) and post a brief review&#xD;
of the books that I like the most. &#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://blog.dynamicprogrammer.com/aggbug.ashx?id=5196a90a-3fce-4775-9f50-a66dd80cd2a8"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ewBoRhPmENDyIkMFH_t_ruBObkQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ewBoRhPmENDyIkMFH_t_ruBObkQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ewBoRhPmENDyIkMFH_t_ruBObkQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ewBoRhPmENDyIkMFH_t_ruBObkQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TheDynamicProgrammer/~4/JAnbFsfVNqU" height="1" width="1"/&gt;</description>
      <comments>http://blog.dynamicprogrammer.com/CommentView,guid,5196a90a-3fce-4775-9f50-a66dd80cd2a8.aspx</comments>
      <category>Books</category>
    <feedburner:origLink>http://blog.dynamicprogrammer.com/2010/02/18/ContinuousImprovementMyListOfBooksForTheNextLittleWhile.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://blog.dynamicprogrammer.com/Trackback.aspx?guid=bb4ab5d2-3c4a-4483-a264-9fe36a8ecb95</trackback:ping>
      <pingback:server>http://blog.dynamicprogrammer.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.dynamicprogrammer.com/PermaLink,guid,bb4ab5d2-3c4a-4483-a264-9fe36a8ecb95.aspx</pingback:target>
      <dc:creator>Hernan</dc:creator>
      <wfw:comment>http://blog.dynamicprogrammer.com/CommentView,guid,bb4ab5d2-3c4a-4483-a264-9fe36a8ecb95.aspx</wfw:comment>
      <wfw:commentRss>http://blog.dynamicprogrammer.com/SyndicationService.asmx/GetEntryCommentsRss?guid=bb4ab5d2-3c4a-4483-a264-9fe36a8ecb95</wfw:commentRss>
      <slash:comments>1</slash:comments>
      
      <title>Git integration with Visual Studio</title>
      <guid isPermaLink="false">http://blog.dynamicprogrammer.com/PermaLink,guid,bb4ab5d2-3c4a-4483-a264-9fe36a8ecb95.aspx</guid>
      <link>http://feedproxy.google.com/~r/TheDynamicProgrammer/~3/2yM96EU4Rgc/GitIntegrationWithVisualStudio.aspx</link>
      <pubDate>Mon, 15 Feb 2010 22:45:16 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
I started to use &lt;a href="http://git-scm.com/" target="_blank"&gt;Git&lt;/a&gt; seriously 5&#xD;
months ago when I sign up for my &lt;a href="http://github.com/" target="_blank"&gt;Github&lt;/a&gt; account&#xD;
on September 1st 2009. Before that I was a &lt;strike&gt;very&lt;/strike&gt; happy subversion&#xD;
user. One of the things that I really like about Git is the speed. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I decided to use Git from the command line to learn and understand the commands really&#xD;
well. I occasionally used the GUI to perform some tasks that seemed easier to do that&#xD;
way.&#xD;
&lt;/p&gt;&#xD;
        &lt;h5&gt;Git within VS.&#xD;
&lt;/h5&gt;&#xD;
        &lt;p&gt;&#xD;
Even when I really enjoy working from the command line I know that some developers&#xD;
prefer to stay within the IDE and I understand that. Yesterday while installing VS&#xD;
2010 RC in my newly paved laptop I decided to check out the &lt;a href="http://sourceforge.net/projects/gitextensions/" target="_blank"&gt;Git&#xD;
Extensions&lt;/a&gt;. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
After installing it VS presents a new menu item for Git.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/GitandMercurialintegrationwithVisualStud_EFE9/git_menu_item.png"&gt;&#xD;
            &lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="git_menu_item" border="0" alt="git_menu_item" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/GitandMercurialintegrationwithVisualStud_EFE9/git_menu_item_thumb.png" width="400" height="83"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
From this menu you have access to the most common commands for Git.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/GitandMercurialintegrationwithVisualStud_EFE9/menu_items.png"&gt;&#xD;
            &lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="menu_items" border="0" alt="menu_items" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/GitandMercurialintegrationwithVisualStud_EFE9/menu_items_thumb.png" width="233" height="470"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
For example you can commit after doing some work on your project (Note: It looks like&#xD;
you have to be in at the project level and not at the solution level in the solution&#xD;
explorer for the commands to work. Although they work in the whole solution as expected.)&lt;br&gt;&#xD;
One thing to notice is that the dialog pick up changes to files modified or added&#xD;
outside the IDE as well.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/GitandMercurialintegrationwithVisualStud_EFE9/commit_screen.png"&gt;&#xD;
            &lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="commit_screen" border="0" alt="commit_screen" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/GitandMercurialintegrationwithVisualStud_EFE9/commit_screen_thumb.png" width="678" height="512"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
This is the push dialog box, you can select the Remote to push to and the branch from&#xD;
where you want to push.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/GitandMercurialintegrationwithVisualStud_EFE9/push_pull_dialog.png"&gt;&#xD;
            &lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="push_pull_dialog" border="0" alt="push_pull_dialog" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/GitandMercurialintegrationwithVisualStud_EFE9/push_pull_dialog_thumb.png" width="631" height="354"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
If you need to enter a passphrase a command prompt window pops up:&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/GitandMercurialintegrationwithVisualStud_EFE9/asking_passphrase.png"&gt;&#xD;
            &lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="asking_passphrase" border="0" alt="asking_passphrase" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/GitandMercurialintegrationwithVisualStud_EFE9/asking_passphrase_thumb.png" width="655" height="96"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
After entering the passphrase you get a confirmation dialog:&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/GitandMercurialintegrationwithVisualStud_EFE9/Pushed.png"&gt;&#xD;
            &lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Pushed" border="0" alt="Pushed" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/GitandMercurialintegrationwithVisualStud_EFE9/Pushed_thumb.png" width="608" height="281"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
You can also pull from remote, where you can select to merge, do a rebase or just&#xD;
pull changes.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/GitandMercurialintegrationwithVisualStud_EFE9/pull_dialog.png"&gt;&#xD;
            &lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="pull_dialog" border="0" alt="pull_dialog" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/GitandMercurialintegrationwithVisualStud_EFE9/pull_dialog_thumb.png" width="624" height="319"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt; &#xD;
&lt;/p&gt;&#xD;
        &lt;h5&gt;Conclusion.&#xD;
&lt;/h5&gt;&#xD;
        &lt;p&gt;&#xD;
I don’t see myself moving away from the command line but I think is a good alternative&#xD;
&lt;/p&gt;&#xD;
        &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:7155d43a-ef90-4530-a984-5ddd83a4aa26" class="wlWriterEditableSmartContent"&gt;Technorati&#xD;
Tags: &lt;a href="http://technorati.com/tags/Git" rel="tag"&gt;Git&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Visual+Studio" rel="tag"&gt;Visual&#xD;
Studio&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Integration" rel="tag"&gt;Integration&lt;/a&gt;&lt;/div&gt;&#xD;
        &lt;img width="0" height="0" src="http://blog.dynamicprogrammer.com/aggbug.ashx?id=bb4ab5d2-3c4a-4483-a264-9fe36a8ecb95"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/hjPk_9-GYNGl6igSUldIQpIy_2Y/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hjPk_9-GYNGl6igSUldIQpIy_2Y/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/hjPk_9-GYNGl6igSUldIQpIy_2Y/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hjPk_9-GYNGl6igSUldIQpIy_2Y/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TheDynamicProgrammer/~4/2yM96EU4Rgc" height="1" width="1"/&gt;</description>
      <comments>http://blog.dynamicprogrammer.com/CommentView,guid,bb4ab5d2-3c4a-4483-a264-9fe36a8ecb95.aspx</comments>
      <category>Programming</category>
      <category>Tools</category>
    <feedburner:origLink>http://blog.dynamicprogrammer.com/2010/02/15/GitIntegrationWithVisualStudio.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://blog.dynamicprogrammer.com/Trackback.aspx?guid=d0a61fd3-2800-4390-b3e2-82121ab202bd</trackback:ping>
      <pingback:server>http://blog.dynamicprogrammer.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.dynamicprogrammer.com/PermaLink,guid,d0a61fd3-2800-4390-b3e2-82121ab202bd.aspx</pingback:target>
      <dc:creator>Hernan</dc:creator>
      <wfw:comment>http://blog.dynamicprogrammer.com/CommentView,guid,d0a61fd3-2800-4390-b3e2-82121ab202bd.aspx</wfw:comment>
      <wfw:commentRss>http://blog.dynamicprogrammer.com/SyndicationService.asmx/GetEntryCommentsRss?guid=d0a61fd3-2800-4390-b3e2-82121ab202bd</wfw:commentRss>
      <slash:comments>1</slash:comments>
      
      <title>Using SpecFlow + WatiN or BDD for web applications without leaving the CLR.</title>
      <guid isPermaLink="false">http://blog.dynamicprogrammer.com/PermaLink,guid,d0a61fd3-2800-4390-b3e2-82121ab202bd.aspx</guid>
      <link>http://feedproxy.google.com/~r/TheDynamicProgrammer/~3/-yqwql0Xk0Y/UsingSpecFlowWatiNOrBDDForWebApplicationsWithoutLeavingTheCLR.aspx</link>
      <pubDate>Wed, 03 Feb 2010 04:45:36 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
Last week I wrote about using cucumber to test your web applications outside in. In&#xD;
the post I showed a simple example (actually comes with cucumber) to open a browser,&#xD;
go to a site and perform some actions.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I showed the same to my team at work and they mention that could be nice to been able&#xD;
to use c# and Visual Studio to do something similar.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
After thinking about it I decided to give another try to a tool I check a few month&#xD;
ago. &lt;a href="http://www.specflow.org/" target="_blank"&gt;SpecFlow&lt;/a&gt;.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
SpecFlow is a tool and a set of libraries to write specifications using &lt;a href="http://wiki.github.com/aslakhellesoy/cucumber/gherkin" target="_blank"&gt;Gherkin&lt;/a&gt;.&#xD;
You can check the &lt;a href="http://www.specflow.org/specflow/screencast.aspx" target="_blank"&gt;screencast&#xD;
here&lt;/a&gt; or read &lt;a href="http://ryanlanciaux.com/ryanlanciaux/post/Gherkin-style-BDD-testing-in-NET.aspx" target="_blank"&gt;this&#xD;
post&lt;/a&gt; from Ryan Lanciaux. SpecFlow can use either NUnit or MsTest as the engine.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Now I needed something to drive the browser. &lt;a href="http://watin.sourceforge.net/" target="_blank"&gt;WatiN&lt;/a&gt; is&#xD;
the .Net port of &lt;a href="http://watir.com/" target="_blank"&gt;WatiR&lt;/a&gt; and is very&#xD;
easy to use. The problem is that needs to run in a single thread process, so when&#xD;
called from inside an NUnit test we need to add the STAThreadAttribute to the Test&#xD;
method.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Of course, this is not a problem when you are writing the Test methods yourself but&#xD;
the way SpecFlow works is that the actual Test method is generated by a tool from&#xD;
your .feature file. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/UsingSpecFlowWatiNorBDDforwebapplicatio_14C77/001_features.png"&gt;&#xD;
            &lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="001_features" border="0" alt="001_features" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/UsingSpecFlowWatiNorBDDforwebapplicatio_14C77/001_features_thumb.png" width="244" height="157"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The code looks like this (actually I edited it a little bit to make it nicer).&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/UsingSpecFlowWatiNorBDDforwebapplicatio_14C77/002_features.png"&gt;&#xD;
            &lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="002_features" border="0" alt="002_features" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/UsingSpecFlowWatiNorBDDforwebapplicatio_14C77/002_features_thumb.png" width="609" height="344"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
So you need to add the &lt;a href="http://msdn.microsoft.com/en-us/library/system.stathreadattribute%28VS.80%29.aspx" target="_blank"&gt;STAThreadAttribute&lt;/a&gt; to&#xD;
this method.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/UsingSpecFlowWatiNorBDDforwebapplicatio_14C77/003_features.png"&gt;&#xD;
            &lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="003_features" border="0" alt="003_features" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/UsingSpecFlowWatiNorBDDforwebapplicatio_14C77/003_features_thumb.png" width="432" height="115"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
This works great and I was able to drive the browser and write a few test in no time.&#xD;
The problem is that &lt;strike&gt;if you edit&lt;/strike&gt; every time you edit the .feature&#xD;
file this class will be re-generated and you will have to re-add this attribute. (Note: &lt;a href="http://github.com/hgarcia/SpecFlow" target="_blank"&gt;I&#xD;
forked the repo on GitHub&lt;/a&gt;, made a change to the source code and sent a pull request&#xD;
to add this attribute by default, not sure if it will be accepted or not).&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I think that the integration from SpecFlow with VS is great. If you or your team feel&#xD;
very strong on using VS this is a very good tool (there are versions for both VS 2008&#xD;
and 2010). After writing the features and running the test you will have hints and&#xD;
code to copy and paste from the TestRunner into the specification class.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/UsingSpecFlowWatiNorBDDforwebapplicatio_14C77/005_features.png"&gt;&#xD;
            &lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="005_features" border="0" alt="005_features" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/UsingSpecFlowWatiNorBDDforwebapplicatio_14C77/005_features_thumb.png" width="729" height="351"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
You will generate the specification from an item template.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/UsingSpecFlowWatiNorBDDforwebapplicatio_14C77/004_features.png"&gt;&#xD;
            &lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="004_features" border="0" alt="004_features" src="http://blog.dynamicprogrammer.com/content/binary/WindowsLiveWriter/UsingSpecFlowWatiNorBDDforwebapplicatio_14C77/004_features_thumb.png" width="508" height="149"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;h5&gt;Conclusion:&#xD;
&lt;/h5&gt;&#xD;
        &lt;p&gt;&#xD;
I think that this is a great tool, specially if you are using it to develop desktop&#xD;
apps or library code in c#. You can use tools like R# to generate your classes and&#xD;
methods from the step definition class directly.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
For using with WatiN or similar tools to drive the browser I will probably keep using&#xD;
pure cucumber with Ruby at least until the &lt;a href="http://msdn.microsoft.com/en-us/library/system.stathreadattribute%28VS.80%29.aspx" target="_blank"&gt;STAThread&lt;/a&gt; issue&#xD;
gets solved.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://blog.dynamicprogrammer.com/aggbug.ashx?id=d0a61fd3-2800-4390-b3e2-82121ab202bd"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/CwkGO-BX0W8UlMC2G62Z2xjaM_c/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CwkGO-BX0W8UlMC2G62Z2xjaM_c/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/CwkGO-BX0W8UlMC2G62Z2xjaM_c/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CwkGO-BX0W8UlMC2G62Z2xjaM_c/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TheDynamicProgrammer/~4/-yqwql0Xk0Y" height="1" width="1"/&gt;</description>
      <comments>http://blog.dynamicprogrammer.com/CommentView,guid,d0a61fd3-2800-4390-b3e2-82121ab202bd.aspx</comments>
      <category>Programming</category>
      <category>Tools</category>
    <feedburner:origLink>http://blog.dynamicprogrammer.com/2010/02/03/UsingSpecFlowWatiNOrBDDForWebApplicationsWithoutLeavingTheCLR.aspx</feedburner:origLink></item>
  </channel>
</rss>
