<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-9004133820714851517</id><updated>2011-11-27T16:24:40.484-08:00</updated><category term='teamcity'/><category term='continuous integration'/><category term='refactoring'/><category term='programming'/><category term='SharePoint'/><category term='msbuild'/><category term='book'/><category term='team foundation server'/><category term='visual studio'/><category term='matlab'/><category term='build tools'/><category term='sql server 2008'/><category term='webparts'/><category term='.net resharperA'/><category term='bamboo'/><category term='linq sql'/><category term='unit testing'/><category term='source control'/><category term='.net'/><category term='mlUnit'/><category term='performance'/><category term='test-driven development'/><category term='windows installer xml'/><category term='OPC'/><category term='cruse control'/><title type='text'>Agile Practice</title><subtitle type='html'>A blog on agile practices, included continuous integration, and test-driven development.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>48</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-4976278042570059838</id><published>2009-10-29T13:18:00.001-07:00</published><updated>2009-10-29T13:24:34.694-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linq sql'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><title type='text'></title><content type='html'>In my article &lt;a href="http://agilepractice.blogspot.com/2009/10/sql-to-linq-performance-retrieving.html"&gt;XXX&lt;/a&gt; I talked about how to improve the speed of LINQ to SQL queries with multiple one to many associations. The post propsed to use the following statement.&lt;br /&gt;&lt;blockquote&gt;var orderItems= db.OrderItems&lt;br /&gt;  .Where(oi =&gt; orders.Select(o =&gt; o.ID).Contains(oi.OrderID)).ToList();&lt;br /&gt;foreach (var o in orders)&lt;br /&gt;{&lt;br /&gt;  var oClosure = o;&lt;br /&gt;  oClosure.OrderItems.SetSource&lt;br /&gt;    (orderItems.Where(oi =&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;oi&lt;/span&gt;.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;OrderItemID&lt;/span&gt; == &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;cClosure&lt;/span&gt;.ID));&lt;br /&gt;}&lt;/blockquote&gt;one more tips here is to store the result of orderItems in a Dictionary using .GroupBy() and .ToDictionary(). If you do not do that you will eventually get a performance problem because you do a linear search inside a loop -- basically you will get a O(n^2) performance for your database retrievals -- not very good. If you use a dictionary lookup you will get something close too O(n) for the foreach loop.&lt;br /&gt;&lt;br /&gt;Do not forget to check if you have matches for the key before you use it inside the foreach. If you do not have a match you should use something like oClosure.OrderItems.SetSource(Enumerable.Empty&lt;order&gt;());.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-4976278042570059838?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/4976278042570059838/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/10/in-my-article-xxx-i-talked-about-how-to.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/4976278042570059838'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/4976278042570059838'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/10/in-my-article-xxx-i-talked-about-how-to.html' title=''/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-9174237868651466074</id><published>2009-10-16T11:45:00.000-07:00</published><updated>2009-10-16T12:11:45.645-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='linq sql'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><title type='text'>SQL to Linq Performance: Retrieving Multiple One-to-Many Associations without Multiple Round Trips</title><content type='html'>I have been using SQL to Linq for a while. It is a fairly straight forward framework for retrieving data for my data access layer. The Linq syntax makes it very easy to read while allowing for complex expressions.&lt;br /&gt;&lt;br /&gt;Unfortunately, the performance may be really bad in some cases. This is typically because of lazy loading where a round trip is required per row because associated data are loaded. The typical example from the Northwind database is a Customer with multiple Orders. All the Customers are retrieved in one go, however for each customer the associated orders are retrieved in one SQL request. This will generate one SQL request for the customers and then n for the orders. This is hopeless. Fortunately, &lt;a href="http://msdn.microsoft.com/en-us/library/system.data.linq.dataloadoptions.loadwith.aspx"&gt;Microsoft provided us with the DataLoadOptions.LoadWith method&lt;/a&gt;. In this case, the following statements solves the problem:&lt;br /&gt;&lt;span&gt;&lt;span id="ctl00_MTCS_main_ctl29_ctl00_ctl01"&gt;&lt;pre class="libCScode" style="white-space: pre-wrap;" id="ctl00_MTCS_main_ctl29_ctl00_ctl01" space="preserve"&gt;&lt;blockquote&gt;Northwnd db = &lt;span style="color:blue;"&gt;new&lt;/span&gt; Northwnd(@&lt;span style="color:maroon;"&gt;&lt;span style="color:maroon;"&gt;"c:\northwnd.mdf"&lt;/span&gt;&lt;/span&gt;);&lt;br /&gt;DataLoadOptions dlo = &lt;span style="color:blue;"&gt;new&lt;/span&gt; DataLoadOptions();&lt;br /&gt;dlo.LoadWith&lt;customer&gt;(c =&gt; c.Orders);&lt;br /&gt;db.LoadOptions = dlo;&lt;/customer&gt;&lt;/blockquote&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/span&gt;But what happens if each order has a set of associations? Lets say each order has a collection of OrderItems. You will end up with a round trip to the database for each order. Each round trip will retrieve the associated OrderItems.&lt;br /&gt;&lt;br /&gt;So what do you do? You may try to add a second LoadWith statement... but it turns out that this is not supported by Linq to SQL. So if you add the second LoadWith, the framework will do what you tell it. However, it will use multiple SQL statements. So what is the point then?&lt;br /&gt;&lt;br /&gt;In order to fix this, use this code:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;var &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;orderItems&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;= db.OrderItems.Where(oi =&gt; orders.Select(o =&gt; o.ID).Contains(oi.OrderID)).ToList();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;foreach (var o in orders)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  var oClosure = o;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  oClosure.OrderItems.SetSource&lt;br /&gt;   (&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;orderItems&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;.Where(oi =&gt; oi.OrderItemID ==&lt;br /&gt;    cClosure.ID));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div style="text-align: left;"&gt;&lt;div style="text-align: left;"&gt;So basically, by pre-fetching &lt;span style="font-family:courier new;"&gt;orderItems&lt;/span&gt; and manually setting the source by using SetSource, the number of round trips are reduced to two. Great? ;-)&lt;br /&gt;&lt;/div&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-9174237868651466074?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/9174237868651466074/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/10/sql-to-linq-performance-retrieving.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/9174237868651466074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/9174237868651466074'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/10/sql-to-linq-performance-retrieving.html' title='SQL to Linq Performance: Retrieving Multiple One-to-Many Associations without Multiple Round Trips'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-8053923371409600489</id><published>2009-10-10T10:07:00.000-07:00</published><updated>2009-10-10T10:10:45.540-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql server 2008'/><title type='text'>SQL Server 2008 SP1 brok my SQL Server</title><content type='html'>After installing SQL Server 2008 SP1 my SQL Server stopped working. The SQL Server reported the following in the log file:&lt;br /&gt;&lt;blockquote&gt;2009-10-10 19:01:09.15 spid7s      Error: 15404, Severity: 16, State: 19.&lt;br /&gt;2009-10-10 19:01:09.15 spid7s      Could not obtain information about Windows NT group/user 'XXX\XXX', error code 0x5.&lt;br /&gt;2009-10-10 19:01:09.15 spid7s      Error: 912, Severity: 21, State: 2.&lt;br /&gt;2009-10-10 19:01:09.15 spid7s      Script level upgrade for database 'master' failed because upgrade step 'sqlagent100_msdb_upgrade.sql' encountered error 15404, state 19, severity 16. This is a serious error condition which might interfere with regular operation and the database will be taken offline. If the error happened during upgrade of the 'master' database, it will prevent the entire SQL Server instance from starting. Examine the previous errorlog entries for errors, take the appropriate corrective actions and re-start the database so that the script upgrade steps run to completion.&lt;br /&gt;2009-10-10 19:01:09.16 spid7s      Error: 3417, Severity: 21, State: 3.&lt;br /&gt;2009-10-10 19:01:09.16 spid7s      Cannot recover the master database. SQL Server is unable to run. Restore master from a full backup, repair it, or rebuild it. For more information about how to rebuild the master database, see SQL Server Books Online.&lt;br /&gt;2009-10-10 19:01:09.16 spid7s      SQL Trace was stopped due to server shutdown. Trace ID = '1'. This is an informational message only; no user action is required.&lt;br /&gt;2009-10-10 19:01:09.84 Server      The SQL Server Network Interface library successfully deregistered the Service Principal Name (SPN) [ MSSQLSvc/XXX ] for the SQL Server service.&lt;br /&gt;&lt;/blockquote&gt;No luck? Then I tried to run the SQL instance as a privileged user, and now it works again. It looks like the upgrade script required some extra permission.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-8053923371409600489?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/8053923371409600489/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/10/sql-server-2008-sp1-brok-my-sql-server.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/8053923371409600489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/8053923371409600489'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/10/sql-server-2008-sp1-brok-my-sql-server.html' title='SQL Server 2008 SP1 brok my SQL Server'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-8095542792973560793</id><published>2009-10-09T13:21:00.000-07:00</published><updated>2009-10-09T13:23:38.012-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.net resharperA'/><title type='text'>ReSharper 5.0 is comming</title><content type='html'>According to the official blog for JetBrains, &lt;a href="http://blogs.jetbrains.com/dotnet/2009/10/resharper-50-intro/"&gt;ReShaper 5.0 is just around the corner&lt;/a&gt;. I am looking forward to this. The new release will provide improvements such as:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Web Development. Web developers have long been asking for top-class support, so we’re starting to deliver on the promise with a pack of features for HTML, ASP.NET, and ASP.NET MVC.&lt;/li&gt;&lt;li&gt;Project and Team. This is a valuable addition for developers having to explore much unfamiliar code and/or perform batch modifications in large-scale projects. With access to and navigation within external sources, structured patterns for searching and customizing code, and location/namespace synchronization tools working in batch mode, you can handle your colossal solutions easier.&lt;/li&gt;&lt;li&gt;Code Analysis. In addition to fresh code inspections, ReSharper 5.0 presents multiple functional style “enumeration to LINQ” transformations, accepts warnings and suggestions into the “Errors in Solution” tool window, and introduces two major features to track what’s going on with your calls and data throughout application execution.&lt;/li&gt;&lt;li&gt;Visual Studio 2010 and Tools. We’re on the run to support Visual Studio 2010 earlier than ever. More info on that when VS2010 Beta2 comes out. Of course, Visual Studio 2008 is supported as well.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-8095542792973560793?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/8095542792973560793/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/10/resharper-50-is-comming.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/8095542792973560793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/8095542792973560793'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/10/resharper-50-is-comming.html' title='ReSharper 5.0 is comming'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-6674613048338302002</id><published>2009-10-06T00:56:00.000-07:00</published><updated>2009-10-06T00:59:59.226-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='webparts'/><title type='text'>ITransformableFilterValues and List View Web Part in SharePoint</title><content type='html'>After preparing a new web part filtering that implements ITransformableFilterValues I though I was near a solution: I wanted to filter a standard Sharepoint list by a set of values that I provided in my filter web part. Now it looks like the standard list view web part only accepts the one value, not multiple. So if you want it to show all rows where the value is A or B, then you are out of luck.&lt;br /&gt;&lt;br /&gt;So what can you do? You try to find a different list view web part? That should be easy. After looking for a few days I am still out of luck.&lt;br /&gt;&lt;br /&gt;Any suggestions?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-6674613048338302002?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/6674613048338302002/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/10/itransformablefiltervalues-and-list.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/6674613048338302002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/6674613048338302002'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/10/itransformablefiltervalues-and-list.html' title='ITransformableFilterValues and List View Web Part in SharePoint'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-8971618329324129956</id><published>2009-08-19T13:48:00.001-07:00</published><updated>2009-08-19T13:49:40.818-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='team foundation server'/><category scheme='http://www.blogger.com/atom/ns#' term='msbuild'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>Team Build Tray</title><content type='html'>I just tried &lt;a href="http://teambuildtray.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=19910"&gt;Team Build Tray 1.0.4&lt;/a&gt;, but it was a big disappointment. It shows you the status of your builds, but only for one of your projects. I want them all!&lt;br /&gt;&lt;br /&gt;I guess I have to stick to the one bundled with TFS Power Toys!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-8971618329324129956?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/8971618329324129956/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/08/team-build-tray.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/8971618329324129956'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/8971618329324129956'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/08/team-build-tray.html' title='Team Build Tray'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-4655385089428146084</id><published>2009-08-18T01:43:00.000-07:00</published><updated>2009-08-18T01:49:05.672-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='visual studio'/><category scheme='http://www.blogger.com/atom/ns#' term='team foundation server'/><category scheme='http://www.blogger.com/atom/ns#' term='msbuild'/><title type='text'>Team Foundation Build -- running build script from command line</title><content type='html'>Often you want to verify that your build will work correctly on your build machine before you do a commit. In Visual Studio you can run all your tests etc, but your build script will propably do some things such as settings up databases. This can be archived this way:&lt;br /&gt;Open the DOS command window&lt;br /&gt;Go to the TFS Build directory where TFSBuild.proj is located&lt;br /&gt;Enter "msbuild /p:SolutionRoot=..\..\.. /t:DesktopRebuild"&lt;br /&gt;&lt;br /&gt;The solution root may have to be changed depending on how you mounted the workspace.&lt;br /&gt;&lt;br /&gt;I usually keep a shortcut on my desktop that I can just double click on for a fast compile.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-4655385089428146084?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/4655385089428146084/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/08/team-foundation-build-running-build.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/4655385089428146084'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/4655385089428146084'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/08/team-foundation-build-running-build.html' title='Team Foundation Build -- running build script from command line'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-6370736805308787120</id><published>2009-08-18T01:23:00.000-07:00</published><updated>2009-08-18T01:25:46.463-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='msbuild'/><title type='text'>QueryBuildDetail updated</title><content type='html'>I just made an update to my QueryBuildDetail MSBuild task. The task will not retrieve the dropfolder of the the most recent successfully build if a build number is not specified. This is really useful if you want to do some integration testing etc.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;using System;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;using System.Linq;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;using Microsoft.TeamFoundation.Build.Client;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;using Microsoft.TeamFoundation.Client;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;using Microsoft.Build.Framework;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;using Microsoft.Build.Utilities;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;namespace QueryBuildDetail&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    public class QueryBuildDetail : Task&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        private IBuildDetail buildDetail;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        [Required]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        public string TeamFoundationServer { get; set; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        [Required]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        public string TeamProject { get; set; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        [Required]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        public string BuildDefinition { get; set; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        public string BuildNumber { get; set; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        public override bool Execute()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            try&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;                RetrieveBuildData();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;                return true;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            catch (Exception ex)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;                Log.LogError(ex.Message);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;                return false;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        [Output]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        public string DropLocation { get { return buildDetail != null ? buildDetail.DropLocation : null; } }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        private void RetrieveBuildData()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            TeamFoundationServer teamFoundationServer = TeamFoundationServerFactory.GetServer(TeamFoundationServer);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            IBuildServer buildServer = (IBuildServer)teamFoundationServer.GetService(typeof (IBuildServer));&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            IBuildDetailSpec spec = buildServer.CreateBuildDetailSpec(TeamProject, BuildDefinition);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            if (String.IsNullOrEmpty(BuildNumber))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;                spec.Status = BuildStatus.Succeeded;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            else&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;                spec.BuildNumber = BuildNumber;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            spec.MaxBuildsPerDefinition = 1;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            spec.QueryOrder = BuildQueryOrder.StartTimeDescending;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            spec.QueryOptions = QueryOptions.None;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            IBuildQueryResult res = buildServer.QueryBuilds(spec);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            buildDetail = res.Builds.Single();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;}&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-6370736805308787120?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/6370736805308787120/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/08/querybuilddetail-updated.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/6370736805308787120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/6370736805308787120'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/08/querybuilddetail-updated.html' title='QueryBuildDetail updated'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-372976350475945983</id><published>2009-08-16T07:48:00.000-07:00</published><updated>2009-08-16T07:52:26.982-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='msbuild'/><title type='text'>Retrieving droplocation of a build from a msbuild script using a msbuild task</title><content type='html'>I just wrote a msbuild custom task for retrieving the drop location of a build. I am using it for my test deployment script.&lt;br /&gt;&lt;br /&gt;The task may be used like this:&lt;br /&gt;&lt;project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&gt;&lt;br /&gt;  &lt;usingtask taskname="QueryBuildDetail" assemblyfile="QueryBuildDetail.dll"&gt;&lt;br /&gt;&lt;br /&gt;  &lt;target name="RetrieveDropLocation"&gt;&lt;br /&gt;    &lt;QueryBuildDetail&lt;br /&gt;      TeamFoundationServer="http://myServer:8080/"&lt;br /&gt;      TeamProject="MyProject"&lt;br /&gt;      BuildNumber="MyProject - CI_20090813.1"&gt;&lt;br /&gt;      &lt;output taskparameter="DropLocation" propertyname="DropLocation"&gt;&lt;br /&gt;    &lt;/querybuilddetail&gt;&lt;br /&gt;    &lt;message text="$(DropLocation)"&gt;&lt;br /&gt;  &lt;/target&gt;&lt;br /&gt;&lt;/project&gt;&lt;br /&gt;&lt;br /&gt;Here is the source code for the msbuild custom task&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;using System;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;using System.Linq;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;using Microsoft.TeamFoundation.Build.Client;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;using Microsoft.TeamFoundation.Client;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;using Microsoft.Build.Framework;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;using Microsoft.Build.Utilities;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;namespace QueryBuildDetail&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    public class QueryBuildDetail : Task&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        private IBuildDetail buildDetail;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        [Required]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        public string TeamFoundationServer { get; set; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        [Required]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        public string TeamProject { get; set; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        [Required]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        public string BuildNumber { get; set; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        public override bool Execute()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            try&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;                RetrieveBuildData();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;                return true;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            catch (Exception ex)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;                Log.LogError(ex.Message);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;                return false;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        [Output]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        public string DropLocation { get { return buildDetail != null ? buildDetail.DropLocation : null; } }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        private void RetrieveBuildData()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            TeamFoundationServer teamFoundationServer = TeamFoundationServerFactory.GetServer(TeamFoundationServer);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            IBuildServer buildServer = (IBuildServer)teamFoundationServer.GetService(typeof (IBuildServer));&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            IBuildDetailSpec spec = buildServer.CreateBuildDetailSpec(TeamProject);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            spec.BuildNumber = BuildNumber;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            spec.QueryOptions = QueryOptions.None;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            IBuildQueryResult res = buildServer.QueryBuilds(spec);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            buildDetail = res.Builds.Single();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;}&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-372976350475945983?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/372976350475945983/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/08/retrieving-droplocation-of-build-from.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/372976350475945983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/372976350475945983'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/08/retrieving-droplocation-of-build-from.html' title='Retrieving droplocation of a build from a msbuild script using a msbuild task'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-8361900171865715349</id><published>2009-08-14T07:03:00.000-07:00</published><updated>2009-08-14T07:09:00.704-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>Shared binaries and continuous integration</title><content type='html'>Lets say you have two component A and B. Component A does not depend on anything, but component B uses component A for some reason.&lt;br /&gt;&lt;br /&gt;How do you build such a thing using continuous integration. It is easy to build component A because you do not need anything else. However for component B you somehow have to include component A. You could solve it by building both components all the time, however that will make it hard to manage as the system grows?&lt;br /&gt;&lt;br /&gt;In the paper &lt;a href="http://www.mikebroberts.com/files/Enterprise%20Continuous%20Integration%20Using%20Binary%20Dependencies.pdf"&gt;Enterprise Continuous Integration Using Binary Dependencies&lt;/a&gt;, Roberts suggests that you store the binaries in the source control system. Each successful build should update the binary in the source control so that it will trigger a new build of any dependent component. The paper also suggests how to handle multiple versions/branches by dedicating separate names for latest version and for fixed versions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-8361900171865715349?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/8361900171865715349/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/08/shared-binaries-and-continuous.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/8361900171865715349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/8361900171865715349'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/08/shared-binaries-and-continuous.html' title='Shared binaries and continuous integration'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-880246117378352261</id><published>2009-08-14T06:58:00.001-07:00</published><updated>2009-08-14T07:02:27.002-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='team foundation server'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>Automatic deployment to staging area</title><content type='html'>I just came across the tool TFS Deployer. It allows you to automatically deploy a new build to a machine. The tool is really simple. You just install it on your deployment machine. Then you configure it to subscribe to the correct Team Foundation Server and the correct build definition. TFS Deployer will then start a Power Shell script when you change the build quality of a build i Team Foundation. The power shell will be a script that installs all the components you need, configures the database and makes sure the web site is up-n-running. You can then easily change the deployed version of your application on your staging machine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-880246117378352261?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/880246117378352261/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/08/automatic-deployment-to-staging-area.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/880246117378352261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/880246117378352261'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/08/automatic-deployment-to-staging-area.html' title='Automatic deployment to staging area'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-7539924097877832041</id><published>2009-07-27T13:18:00.001-07:00</published><updated>2009-07-27T13:34:41.705-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='refactoring'/><category scheme='http://www.blogger.com/atom/ns#' term='matlab'/><title type='text'>Refactoring in Matlab</title><content type='html'>Popular programming languages like Java and C# has various refactoring tools available that automatize the refactoring process. ReSharper is such a tool for C#.&lt;br /&gt;&lt;br /&gt;For the Matlab programming language I am missing similar features.  Basic refactorings like Extract Method or Introduce Variable has to be done manually. This is very error prone and makes refactoring boring and time consuming. I guess many refactoirngs are never caried out in this language because of the missing feature.&lt;br /&gt;&lt;br /&gt;So Mathworks -- why don't you provide we some basic refactoring features:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Extract Method/Function&lt;/li&gt;&lt;li&gt;Introduce Variable&lt;/li&gt;&lt;li&gt;Inline Method/Function&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Inline Temp&lt;/li&gt;&lt;li&gt;Rename Method / Function&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Rename Variable&lt;/li&gt;&lt;li&gt;Add Parameter&lt;/li&gt;&lt;li&gt;Remove Parameter&lt;/li&gt;&lt;/ul&gt;A video exist where a basic &lt;a href="http://www.vimeo.com/2307006"&gt;Introduce Variable refactoring&lt;/a&gt; is implemented, but it is currently very basic.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-7539924097877832041?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/7539924097877832041/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/07/refactoring-av-matlab.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/7539924097877832041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/7539924097877832041'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/07/refactoring-av-matlab.html' title='Refactoring in Matlab'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-7745184019402826579</id><published>2009-07-27T13:07:00.000-07:00</published><updated>2009-07-27T13:11:46.373-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='refactoring'/><title type='text'>Refactoring: Replace Iteration with Linq Query</title><content type='html'>&lt;span style="font-family:courier new;"&gt;string[] items = new[] { "item1", "item2", "item3" };&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;List itemsFiltered = new List();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;foreach (string item in items)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    if (item != "item2")&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        itemsFiltered.Add(item);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;=&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;string[] items = new[] { "item1", "item2", "item3" };&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;List itemsFiltered = items.Where(item =&gt; item != "item2").ToList();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Motivation&lt;/span&gt;&lt;br /&gt;You often see methods in which the programmer iterates over a list, and then checks a predicate regarding the current item. If the predicate is satisfied the item is added to a newly constructed list. After the iteration the list contains all items satisfying the predicate. In C# this is not necessary because the Linq library has built in support for doing these queries. The issue is not performance, but that you end up with unnecessary lines of code that adds no value to your program—you have four lines of code that can be expressed with one line of code.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Mechanics&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;    Identify a foreach block with a single if statement where the item is added when the predicate is satisfied.&lt;/li&gt;&lt;li&gt;    Replace the foreach block with a Where() query on the list with the predicate as a parameter, apply a ToList() query to convert the result to a list, and assign the result to the list variable.&lt;/li&gt;&lt;li&gt;    Remove the constructor of the filtered list.&lt;/li&gt;&lt;li&gt;    Compile and rerun tests.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Example&lt;/span&gt;&lt;br /&gt;Start with this code.&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;string[] items = new[] { "item1", "item2", "item3" };&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;List itemsFiltered = new List();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;foreach (string item in items)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  if (item != "item2")&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    itemsFiltered.Add(item);&lt;/span&gt;&lt;br /&gt;Finally, we simplify the code:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;string[] items = new[] { "item1", "item2", "item3" };&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;List itemsFiltered = items.Where(item =&gt; item != "item2").ToList();&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-7745184019402826579?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/7745184019402826579/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/07/refactoring-replace-iteration-with-linq.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/7745184019402826579'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/7745184019402826579'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/07/refactoring-replace-iteration-with-linq.html' title='Refactoring: Replace Iteration with Linq Query'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-8832971652609297933</id><published>2009-06-10T13:35:00.000-07:00</published><updated>2009-06-10T13:42:33.186-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unit testing'/><category scheme='http://www.blogger.com/atom/ns#' term='test-driven development'/><category scheme='http://www.blogger.com/atom/ns#' term='mlUnit'/><category scheme='http://www.blogger.com/atom/ns#' term='team foundation server'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>mlUnit - a great unit test alternative for Matlab</title><content type='html'>I am working on various expert applications that use Matlab for computation.&lt;br /&gt;&lt;br /&gt;Matlab is great for mathematics, however it is lacking features such as strong typing, reasonable scoping (you do not even have to declare a variable). The result is a lot of error in the code due to mismatches in methods/function signatures after adding parameters, type mismatches, undeclared variables etc.&lt;br /&gt;&lt;br /&gt;I have been using test-driven development and unit testing for a long time in C#, however I missed that feature in Matlab. Earlier this year I came across &lt;a href="http://mlunit.dohmke.de/Main_Page"&gt;mlUnit&lt;/a&gt;, which is a full blown unit testing framework. Now I am developing test first, and my code is getting more and more stable. To further improve the situation, I have included &lt;a href="http://agilepractice.blogspot.com/2009/02/matlab-compiler-and-team-foundation.html"&gt;the unit tests as part of my continuous integration of my Matlab code&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So should you!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-8832971652609297933?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/8832971652609297933/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/06/mlunit-great-unit-test-alternative-for.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/8832971652609297933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/8832971652609297933'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/06/mlunit-great-unit-test-alternative-for.html' title='mlUnit - a great unit test alternative for Matlab'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-8031201740979072515</id><published>2009-06-06T13:54:00.000-07:00</published><updated>2009-06-06T13:56:47.356-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='visual studio'/><category scheme='http://www.blogger.com/atom/ns#' term='team foundation server'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>Buddy build using Team Foundation Build 2008</title><content type='html'>I am a big fan of continuous integration, and I waiting for the pre checkin validation features of Team Foundation Build 2010.  But until 2010 is released, we will have to stick with 2008. What can we do?&lt;br /&gt;&lt;br /&gt;I just found out that there is a CodePlex project allowing buddy builds for Team Foundation Build 2008. Want to try? Check out &lt;a href="http://www.codeplex.com/BuddyBuild"&gt;http://www.codeplex.com/BuddyBuild&lt;/a&gt; .&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-8031201740979072515?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/8031201740979072515/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/06/buddy-build-using-team-foundation-build.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/8031201740979072515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/8031201740979072515'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/06/buddy-build-using-team-foundation-build.html' title='Buddy build using Team Foundation Build 2008'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-6929090055565635295</id><published>2009-06-05T13:30:00.000-07:00</published><updated>2009-06-05T13:33:54.823-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='visual studio'/><category scheme='http://www.blogger.com/atom/ns#' term='team foundation server'/><title type='text'>Visual Studio 2010 Beta is out</title><content type='html'>Now you can download the new Microsoft Visual Studio 2010 from &lt;a href="http://www.microsoft.com/visualstudio/en-us/products/2010/default.mspx"&gt;MSDN&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Visual Studio Team Foundation 2010 includes new interesting features such as gated checkins for the Team Foundation Build system. This makes sure that broken changes are not committed to the source control system.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-6929090055565635295?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/6929090055565635295/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/06/visual-studio-2010-beta-is-out.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/6929090055565635295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/6929090055565635295'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/06/visual-studio-2010-beta-is-out.html' title='Visual Studio 2010 Beta is out'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-1952234482916582113</id><published>2009-03-11T02:57:00.000-07:00</published><updated>2009-03-11T03:07:05.287-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='msbuild'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>MSBuild and attaching SQL Server database</title><content type='html'>The msbuild script I am running on the continuous integration server updates the database in order to run some tests.&lt;br /&gt;&lt;br /&gt;The database I am using is SQL Server 2008.&lt;br /&gt;&lt;br /&gt;Unfortunately I have not found a task that does this job. However, I ended up with this script:&lt;br /&gt;exec command="SSEUtil.exe -m -s $(DeployDatabaseInstance) -d name=$(DeployDatabase)"&lt;br /&gt;...to detach the old database...and...&lt;br /&gt;exec command="SSEUtil.exe -m -s $(DeployDatabaseInstance) -a "$(DeployFolder)TuneIT.mdf" $(DeployDatabase)"&lt;br /&gt;&lt;br /&gt;I guess I could write a MSTest task, but I do not want to maintain it. Any ideas?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-1952234482916582113?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/1952234482916582113/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/03/msbuild-and-attaching-sql-server.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/1952234482916582113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/1952234482916582113'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/03/msbuild-and-attaching-sql-server.html' title='MSBuild and attaching SQL Server database'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-499356636433703020</id><published>2009-03-04T00:59:00.001-08:00</published><updated>2009-03-04T01:01:29.286-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='refactoring'/><title type='text'>ReSharper -- the refactorings</title><content type='html'>I am a big fan of the ReSharper tool. It lets you do a lot of code cleanup and refactorings directly from Visual Studio.&lt;br /&gt;&lt;br /&gt;Here is a list of the refactorings it supports:&lt;br /&gt;&lt;meta equiv="Content-Type" content="text/html; charset=utf-8"&gt;&lt;meta name="ProgId" content="Word.Document"&gt;&lt;meta name="Generator" content="Microsoft Word 12"&gt;&lt;meta name="Originator" content="Microsoft Word 12"&gt;&lt;link rel="File-List" href="file:///C:%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml"&gt;&lt;link rel="themeData" href="file:///C:%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx"&gt;&lt;link rel="colorSchemeMapping" href="file:///C:%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml"&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:worddocument&gt;   &lt;w:view&gt;Normal&lt;/w:View&gt;   &lt;w:zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:trackmoves/&gt;   &lt;w:trackformatting/&gt;   &lt;w:donotshowpropertychanges/&gt;   &lt;w:punctuationkerning/&gt;   &lt;w:validateagainstschemas/&gt;   &lt;w:saveifxmlinvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:ignoremixedcontent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:alwaysshowplaceholdertext&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:donotpromoteqf/&gt;   &lt;w:lidthemeother&gt;EN-US&lt;/w:LidThemeOther&gt;   &lt;w:lidthemeasian&gt;X-NONE&lt;/w:LidThemeAsian&gt;   &lt;w:lidthemecomplexscript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;   &lt;w:compatibility&gt;    &lt;w:breakwrappedtables/&gt;    &lt;w:snaptogridincell/&gt;    &lt;w:wraptextwithpunct/&gt;    &lt;w:useasianbreakrules/&gt;    &lt;w:dontgrowautofit/&gt;    &lt;w:splitpgbreakandparamark/&gt;    &lt;w:dontvertaligncellwithsp/&gt;    &lt;w:dontbreakconstrainedforcedtables/&gt;    &lt;w:dontvertalignintxbx/&gt;    &lt;w:word11kerningpairs/&gt;    &lt;w:cachedcolbalance/&gt;    &lt;w:usefelayout/&gt;   &lt;/w:Compatibility&gt;   &lt;w:browserlevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;   &lt;m:mathpr&gt;    &lt;m:mathfont val="Cambria Math"&gt;    &lt;m:brkbin val="before"&gt;    &lt;m:brkbinsub val="--"&gt;    &lt;m:smallfrac val="off"&gt;    &lt;m:dispdef/&gt;    &lt;m:lmargin val="0"&gt;    &lt;m:rmargin val="0"&gt;    &lt;m:defjc val="centerGroup"&gt;    &lt;m:wrapindent val="1440"&gt;    &lt;m:intlim val="subSup"&gt;    &lt;m:narylim val="undOvr"&gt;   &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:latentstyles deflockedstate="false" defunhidewhenused="true" defsemihidden="true" defqformat="false" defpriority="99" latentstylecount="267"&gt;   &lt;w:lsdexception locked="false" priority="0" semihidden="false" unhidewhenused="false" qformat="true" name="Normal"&gt;   &lt;w:lsdexception locked="false" priority="9" semihidden="false" unhidewhenused="false" qformat="true" name="heading 1"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 2"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 3"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 4"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 5"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 6"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 7"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 8"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 9"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 1"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 2"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 3"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 4"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 5"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 6"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 7"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 8"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 9"&gt;   &lt;w:lsdexception locked="false" priority="35" qformat="true" name="caption"&gt;   &lt;w:lsdexception locked="false" priority="10" semihidden="false" unhidewhenused="false" qformat="true" name="Title"&gt;   &lt;w:lsdexception locked="false" priority="1" name="Default Paragraph Font"&gt;   &lt;w:lsdexception locked="false" priority="11" semihidden="false" unhidewhenused="false" qformat="true" name="Subtitle"&gt;   &lt;w:lsdexception locked="false" priority="22" semihidden="false" unhidewhenused="false" qformat="true" name="Strong"&gt;   &lt;w:lsdexception locked="false" priority="20" semihidden="false" unhidewhenused="false" qformat="true" name="Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="59" semihidden="false" unhidewhenused="false" name="Table Grid"&gt;   &lt;w:lsdexception locked="false" unhidewhenused="false" name="Placeholder Text"&gt;   &lt;w:lsdexception locked="false" priority="1" semihidden="false" unhidewhenused="false" qformat="true" name="No Spacing"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" unhidewhenused="false" name="Revision"&gt;   &lt;w:lsdexception locked="false" priority="34" semihidden="false" unhidewhenused="false" qformat="true" name="List Paragraph"&gt;   &lt;w:lsdexception locked="false" priority="29" semihidden="false" unhidewhenused="false" qformat="true" name="Quote"&gt;   &lt;w:lsdexception locked="false" priority="30" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Quote"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="19" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="21" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="31" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Reference"&gt;   &lt;w:lsdexception locked="false" priority="32" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Reference"&gt;   &lt;w:lsdexception locked="false" priority="33" semihidden="false" unhidewhenused="false" qformat="true" name="Book Title"&gt;   &lt;w:lsdexception locked="false" priority="37" name="Bibliography"&gt;   &lt;w:lsdexception locked="false" priority="39" qformat="true" name="TOC Heading"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;style&gt; &lt;!--  /* Font Definitions */  @font-face 	{font-family:"Cambria Math"; 	panose-1:2 4 5 3 5 4 6 3 2 4; 	mso-font-charset:0; 	mso-generic-font-family:roman; 	mso-font-pitch:variable; 	mso-font-signature:-1610611985 1107304683 0 0 159 0;} @font-face 	{font-family:Calibri; 	panose-1:2 15 5 2 2 2 4 3 2 4; 	mso-font-charset:0; 	mso-generic-font-family:swiss; 	mso-font-pitch:variable; 	mso-font-signature:-1610611985 1073750139 0 0 159 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-unhide:no; 	mso-style-qformat:yes; 	mso-style-parent:""; 	margin-top:5.0pt; 	margin-right:0cm; 	margin-bottom:5.0pt; 	margin-left:0cm; 	line-height:115%; 	mso-pagination:widow-orphan; 	font-size:7.0pt; 	mso-bidi-font-size:10.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:"Times New Roman"; 	mso-fareast-theme-font:minor-fareast; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi; 	mso-bidi-language:EN-US;} h1 	{mso-style-priority:9; 	mso-style-unhide:no; 	mso-style-qformat:yes; 	mso-style-link:"Heading 1 Char"; 	mso-style-next:Normal; 	margin-top:5.0pt; 	margin-right:0cm; 	margin-bottom:0cm; 	margin-left:0cm; 	margin-bottom:.0001pt; 	line-height:115%; 	mso-pagination:widow-orphan; 	page-break-after:avoid; 	mso-outline-level:1; 	background:#4F81BD; 	mso-background-themecolor:accent1; 	border:none; 	mso-border-alt:solid #4F81BD 3.0pt; 	mso-border-themecolor:accent1; 	padding:0cm; 	mso-padding-alt:0cm 0cm 0cm 0cm; 	font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	color:white; 	mso-themecolor:background1; 	text-transform:uppercase; 	letter-spacing:.75pt; 	mso-font-kerning:0pt; 	mso-bidi-language:EN-US;} p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph 	{mso-style-priority:34; 	mso-style-unhide:no; 	mso-style-qformat:yes; 	margin-top:5.0pt; 	margin-right:0cm; 	margin-bottom:5.0pt; 	margin-left:36.0pt; 	mso-add-space:auto; 	line-height:115%; 	mso-pagination:widow-orphan; 	font-size:7.0pt; 	mso-bidi-font-size:10.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:"Times New Roman"; 	mso-fareast-theme-font:minor-fareast; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi; 	mso-bidi-language:EN-US;} p.MsoListParagraphCxSpFirst, li.MsoListParagraphCxSpFirst, div.MsoListParagraphCxSpFirst 	{mso-style-priority:34; 	mso-style-unhide:no; 	mso-style-qformat:yes; 	mso-style-type:export-only; 	margin-top:5.0pt; 	margin-right:0cm; 	margin-bottom:0cm; 	margin-left:36.0pt; 	margin-bottom:.0001pt; 	mso-add-space:auto; 	line-height:115%; 	mso-pagination:widow-orphan; 	font-size:7.0pt; 	mso-bidi-font-size:10.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:"Times New Roman"; 	mso-fareast-theme-font:minor-fareast; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi; 	mso-bidi-language:EN-US;} p.MsoListParagraphCxSpMiddle, li.MsoListParagraphCxSpMiddle, div.MsoListParagraphCxSpMiddle 	{mso-style-priority:34; 	mso-style-unhide:no; 	mso-style-qformat:yes; 	mso-style-type:export-only; 	margin-top:0cm; 	margin-right:0cm; 	margin-bottom:0cm; 	margin-left:36.0pt; 	margin-bottom:.0001pt; 	mso-add-space:auto; 	line-height:115%; 	mso-pagination:widow-orphan; 	font-size:7.0pt; 	mso-bidi-font-size:10.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:"Times New Roman"; 	mso-fareast-theme-font:minor-fareast; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi; 	mso-bidi-language:EN-US;} p.MsoListParagraphCxSpLast, li.MsoListParagraphCxSpLast, div.MsoListParagraphCxSpLast 	{mso-style-priority:34; 	mso-style-unhide:no; 	mso-style-qformat:yes; 	mso-style-type:export-only; 	margin-top:0cm; 	margin-right:0cm; 	margin-bottom:5.0pt; 	margin-left:36.0pt; 	mso-add-space:auto; 	line-height:115%; 	mso-pagination:widow-orphan; 	font-size:7.0pt; 	mso-bidi-font-size:10.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:"Times New Roman"; 	mso-fareast-theme-font:minor-fareast; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi; 	mso-bidi-language:EN-US;} span.Heading1Char 	{mso-style-name:"Heading 1 Char"; 	mso-style-priority:9; 	mso-style-unhide:no; 	mso-style-locked:yes; 	mso-style-link:"Heading 1"; 	color:white; 	mso-themecolor:background1; 	text-transform:uppercase; 	letter-spacing:.75pt; 	background:#4F81BD; 	mso-shading-themecolor:accent1; 	font-weight:bold;} .MsoChpDefault 	{mso-style-type:export-only; 	mso-default-props:yes; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:"Times New Roman"; 	mso-fareast-theme-font:minor-fareast; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi; 	mso-bidi-language:EN-US;} .MsoPapDefault 	{mso-style-type:export-only; 	margin-top:10.0pt; 	margin-right:0cm; 	margin-bottom:10.0pt; 	margin-left:0cm; 	line-height:115%;} @page Section1 	{size:841.95pt 42.0cm; 	margin:36.0pt 36.0pt 36.0pt 36.0pt; 	mso-header-margin:35.45pt; 	mso-footer-margin:35.45pt; 	mso-columns:2 even 35.4pt; 	mso-paper-source:0;} div.Section1 	{page:Section1;}  /* List Definitions */  @list l0 	{mso-list-id:1481653138; 	mso-list-type:hybrid; 	mso-list-template-ids:1106705520 67698689 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l0:level1 	{mso-level-number-format:bullet; 	mso-level-text:; 	mso-level-tab-stop:none; 	mso-level-number-position:left; 	text-indent:-18.0pt; 	font-family:Symbol;} ol 	{margin-bottom:0cm;} ul 	{margin-bottom:0cm;} --&gt; &lt;/style&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;  /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:"Table Normal"; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:""; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin-top:10.0pt; 	mso-para-margin-right:0cm; 	mso-para-margin-bottom:10.0pt; 	mso-para-margin-left:0cm; 	line-height:115%; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-language:EN-US;} &lt;/style&gt; &lt;![endif]--&gt;  &lt;div style="border: 3pt solid rgb(79, 129, 189); padding: 0cm; background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;  &lt;h1 style="background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style=""&gt;Change Signature&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt;  &lt;/div&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;This refactoring allows you to modify a method signature in the following ways:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpFirst" style="text-indent: -18pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span style=""&gt;·&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;          &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span style=""&gt;Add, remove, rename, or reorder parameter(s)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent: -18pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span style=""&gt;·&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;          &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span style=""&gt;Change return type&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpLast" style="text-indent: -18pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span style=""&gt;·&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;          &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span style=""&gt;Change parameter type(s)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;Rename method&lt;br /&gt;Along with changing the signature, ReSharper searches for all usages of the method and modifies all calls, implementations, and overrides of the method to reflect the change. In case of newly added parameters, default values for them supplied by the user are substituted in all method calls. In overrides, the original parameter passed to the method is passed to the base call.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;div style="border: 3pt solid rgb(79, 129, 189); padding: 0cm; background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;  &lt;h1 style="background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style=""&gt;Convert Abstract Class to Interface&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt;  &lt;/div&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;You can apply this refactoring to convert an abstract class to an interface. This is especially useful when you want a class to inherit from more than one abstract class, thus you need to convert one of them to an interface. The reverse functionality is also possible with the Convert Interface to Abstract Class refactoring.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;div style="border: 3pt solid rgb(79, 129, 189); padding: 0cm; background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;  &lt;h1 style="background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style=""&gt;Convert Anonymous to Named Type (C# only)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt;  &lt;/div&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;This refactoring converts anonymous types to named types in the scope of either the current method (locally) or the whole solution (globally). In the dialog box that this refactoring provides, you can specify whether ReSharper should generate auto-properties or properties with backing fields, and also opt to generate equalify and formatting method overloads.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;div style="border: 3pt solid rgb(79, 129, 189); padding: 0cm; background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;  &lt;h1 style="background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style=""&gt;Convert Extension Method to Plain Static (C# only)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt;  &lt;/div&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;This dialogless refactoring converts an extension method to a static method in the same class. The reverse functionality is provided by 'Convert Static to Extension Method'.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;div style="border: 3pt solid rgb(79, 129, 189); padding: 0cm; background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;  &lt;h1 style="background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style=""&gt;Convert Indexer (Default Property) to Method&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt;  &lt;/div&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;This refactoring works a lot like 'Convert Property to Method' but it is applied to indexers (default properties in VB.NET). You can convert only getter, only setter, or both, to a method. The reverse functionality is provided by 'Convert Method to Indexer (Default Property)'.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;div style="border: 3pt solid rgb(79, 129, 189); padding: 0cm; background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;  &lt;h1 style="background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style=""&gt;Convert Interface to Abstract Class&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt;  &lt;/div&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;If you want to add some logic to interface or feel it better be a class you should invoke the refactoring and all appropriate conversions will be made. More importantly, it checks for any conflicts, i.e. for types implementing the interface that already have base type (an error in C#, which has no multiple inheritance).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;div style="border: 3pt solid rgb(79, 129, 189); padding: 0cm; background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;  &lt;h1 style="background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style=""&gt;Convert Method to Indexer (Default Property)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt;  &lt;/div&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;This is the reverse of 'Convert Indexer (Default Property) to Method'. It works in dialogless mode, but you may have to apply it to two methods to generate both a getter and a setter in your indexer.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;div style="border: 3pt solid rgb(79, 129, 189); padding: 0cm; background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;  &lt;h1 style="background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style=""&gt;Convert Method to Property&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt;  &lt;/div&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;This refactoring allows users to convert non-void methods without parameters to properties with read access, and void methods with exactly one parameter to properties with write access. Paired methods can be converted to a single read/write property. This refactoring is especially useful for converting more traditional code with setter- and getter-type methods (for example, J#) to C#.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;div style="border: 3pt solid rgb(79, 129, 189); padding: 0cm; background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;  &lt;h1 style="background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style=""&gt;Convert Property to Auto-Property (C# only)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt;  &lt;/div&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;You can now convert traditional properties with backing private fields to auto-properties that were introduced in C# 3.0.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;div style="border: 3pt solid rgb(79, 129, 189); padding: 0cm; background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;  &lt;h1 style="background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style=""&gt;Convert Property to Method(s)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt;  &lt;/div&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;Using this refactoring, properties with read access can be converted to getter-type methods (non-void methods without parameters), and properties with write access can be converted to setter-type methods (void methods with exactly one parameter). As to properties allowing both read and write access, you can convert them to pairs of getter- and setter-type methods.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;div style="border: 3pt solid rgb(79, 129, 189); padding: 0cm; background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;  &lt;h1 style="background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style=""&gt;Convert Static to Extension Method (C# only)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt;  &lt;/div&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;This new refactoring converts a static method to an extension method. For the conversion to be carried out successfully, the static method must (1) have at least one argument and (2) reside in a static class. The reverse functionality is available with 'Convert Extension Method to Plain Static'.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;div style="border: 3pt solid rgb(79, 129, 189); padding: 0cm; background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;  &lt;h1 style="background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style=""&gt;Copy Type&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt;  &lt;/div&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;It will take you just a second to create a copy of a type with a different name or within another namespace. ReSharper will take care of creating a separate file for it. For partial types, all parts will be copied even if they are located in separate files.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;div style="border: 3pt solid rgb(79, 129, 189); padding: 0cm; background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;  &lt;h1 style="background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style=""&gt;Encapsulate Field&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt;  &lt;/div&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;The Encapsulate Field refactoring allows you to quickly create an accessor property from an existing field. Usages of the field are automatically replaced with usages of the property. An apparent advantage of this refactoring is that you can disallow direct access to a field through the use of properties.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;div style="border: 3pt solid rgb(79, 129, 189); padding: 0cm; background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;  &lt;h1 style="background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style=""&gt;Extract Class from Parameters&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt;  &lt;/div&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;This refactoring creates a new class or struct and converts parameters of the selected method into encapsulated fields of the newly created type (with constructor taking parameters, fields to store values and properties to retrieve values). Usages of parameters are converted to usages of properties of created type.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;div style="border: 3pt solid rgb(79, 129, 189); padding: 0cm; background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;  &lt;h1 style="background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style=""&gt;Extract Interface&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt;  &lt;/div&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;This refactoring allows you to create an interface from a class and make that class implement the created interface. You can choose the members to extract to the interface and specify a name for the interface.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;div style="border: 3pt solid rgb(79, 129, 189); padding: 0cm; background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;  &lt;h1 style="background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style=""&gt;Extract Method&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt;  &lt;/div&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;Select a block of code and invoke the Extract Method refactoring to transform it into a method (Sub or Function in VB.NET). ReSharper will automatically analyze the code to detect the return value and/or out/ref parameters.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;div style="border: 3pt solid rgb(79, 129, 189); padding: 0cm; background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;  &lt;h1 style="background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style=""&gt;Extract Superclass&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt;  &lt;/div&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;With this refactoring, you can create a base class for a class and move some members to it. Just place the caret at a class declaration, select members to extract, and run the refactoring. It is very useful for moving some logic up to share it later.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;div style="border: 3pt solid rgb(79, 129, 189); padding: 0cm; background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;  &lt;h1 style="background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style=""&gt;Inline Method&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt;  &lt;/div&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;Whenever possible, this refactoring is able to transfer a method's body into the body of its callers and remove the method altogether. The reverse functionality is provided by 'Extract Method'.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;div style="border: 3pt solid rgb(79, 129, 189); padding: 0cm; background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;  &lt;h1 style="background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style=""&gt;Inline Variable&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt;  &lt;/div&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;Select an arbitrary variable or local constant and invoke the Inline Variable refactoring. All occurrences of the selected variable in your code will be substituted with its initializer. The reverse functionality is provided by 'Introduce Variable'.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;div style="border: 3pt solid rgb(79, 129, 189); padding: 0cm; background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;  &lt;h1 style="background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style=""&gt;Introduce Field&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt;  &lt;/div&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;Select an expression or a local variable and apply this refactoring. It will create a new field or constant and initialize it with the expression or local variable initializer. The field can be assigned in its initializer, type constructors or current members.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;div style="border: 3pt solid rgb(79, 129, 189); padding: 0cm; background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;  &lt;h1 style="background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style=""&gt;Introduce Parameter&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt;  &lt;/div&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;Select an expression or a local variable in a method and use this refactoring to create a new parameter from it. All call sites will be updated to reflect the changed signature, while maintaining the logic and the semantics.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;If an expression uses local variables that are inaccessible at a call site, this refactoring allows to pass them as delegates.&lt;/span&gt;&lt;span style="font-size: 12pt; line-height: 115%; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;div style="border: 3pt solid rgb(79, 129, 189); padding: 0cm; background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;  &lt;h1 style="background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style=""&gt;Introduce Variable&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt;  &lt;/div&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;Select an arbitrary expression inside the member code and invoke the Introduce Variable refactoring. A new implicitly or explicitly typed local variable will be declared and initialized with the selected expression. The original expression will be replaced with the name of the variable. Should there be multiple occurrences of the original expression in your code, you will be given an option to replace all of them with the newly created variable. In the same manner you may also introduce constants for constant expressions.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;div style="border: 3pt solid rgb(79, 129, 189); padding: 0cm; background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;  &lt;h1 style="background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style=""&gt;Make Method Non-Static/Non-Shared&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt;  &lt;/div&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;This refactoring converts a static method (Shared in VB.NET) to an instance method in the selected parameter's type (i.e. moves the method to parameter's type and transforms the parameter into 'this') and transforms method calls accordingly.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;div style="border: 3pt solid rgb(79, 129, 189); padding: 0cm; background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;  &lt;h1 style="background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style=""&gt;Make Method Static/Shared&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt;  &lt;/div&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;This refactoring converts a non-static method into a static one (Shared in VB.NET) by making 'this' a parameter of the method. After refactoring, the target method will be declared as static (Shared in VB.NET), and necessary parameters will be added to its call sites. The refactoring is also useful when you want to move non-static methods (non-Shared in VB.NET). In this case, use Make Method Static as a preparatory step for the Make Method Non-static refactoring.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;div style="border: 3pt solid rgb(79, 129, 189); padding: 0cm; background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;  &lt;h1 style="background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style=""&gt;Move Static Member&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt;  &lt;/div&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;The refactoring moves static fields and methods to another type. If you want to move non-static methods, you can perform the following sequence of refactorings: Make Method Static -&gt; Make Method Non-static, with the move happening in the latter.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;div style="border: 3pt solid rgb(79, 129, 189); padding: 0cm; background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;  &lt;h1 style="background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style=""&gt;Move Type to Another File or Namespace&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt;  &lt;/div&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;You can easily move types between namespaces, with references automatically updated by ReSharper. You can also move a type to &lt;a href="http://www.jetbrains.com/resharper/features/code_refactoring.html#Move_Type_to_Outer_Scope"&gt;&lt;span style="color: windowtext; text-decoration: none;"&gt;outer&lt;/span&gt;&lt;/a&gt; or nested scope or to another file.&lt;br /&gt;Using this refactoring, you can swiftly move the code implementing a given type into a separate file. This refactoring can be accessed through the Move refactoring command.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;When you use XAML and you move a .NET class to another namespace, XAML markup references to the class are updated, and XAML import directives are inserted/changed accordingly. This refactoring can also be invoked right from XAML markup on any type reference.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;div style="border: 3pt solid rgb(79, 129, 189); padding: 0cm; background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;  &lt;h1 style="background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style=""&gt;Move Type to Outer Scope&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt;  &lt;/div&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;This refactoring moves an inner type to an upper level. In case that the inner type uses members of the enclosing type, a reference to the enclosing type is passed as an argument to the moved type's constructors. This refactoring can be accessed through the Move refactoring command.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;div style="border: 3pt solid rgb(79, 129, 189); padding: 0cm; background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;  &lt;h1 style="background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style=""&gt;Pull Members Up&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt;  &lt;/div&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;This refactoring helps you move type members to a superclass or an interface. This operation is useful as a way to generalize behavior. ReSharper analyzes all members in the current class and makes a list of members that you can pull up. Before completing the refactoring, ReSharper also checks for possible conflicts, for example, whether the members that you are trying to move to a superclass will be accessible in the destination type. The reverse functionality is available with 'Push Members Down'.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;div style="border: 3pt solid rgb(79, 129, 189); padding: 0cm; background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;  &lt;h1 style="background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style=""&gt;Push Members Down&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt;  &lt;/div&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;This refactoring helps you clean up your type hierarchy by moving type members to a subtype. This operation is useful as a way to specialize behavior. ReSharper analyzes all members of the selected type and makes a list of members that you can push down. Before completing the refactoring, ReSharper also checks for possible conflicts, for example, whether the members you are trying to push down will be accessible in the destination type. The reverse functionality is available with 'Push Members Up'.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;div style="border: 3pt solid rgb(79, 129, 189); padding: 0cm; background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;  &lt;h1 style="background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style=""&gt;Rename&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt;  &lt;/div&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;The Rename refactoring allows you to rename any symbol, including: namespaces, types, methods, parameters, local variables, properties, fields, and events. It automatically finds and corrects all references to the symbol. The Rename refactoring can be invoked directly from the editor and sometimes from other views (Class View, Object Browser).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;Rename works with all supported languages and technologies - namely, C#, VB.NET, ASP.NET, XML, XAML, and build scripts.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;Automatic reference correction fully extends to XAML markup when you use the Rename refactoring. In addition, specific XAML symbols such as namespace aliases and resources can be renamed easily:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;For build scripts, when you rename a property or target with ReSharper, all its references and even usages in comments and strings are automatically updated to reflect the change.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;div style="border: 3pt solid rgb(79, 129, 189); padding: 0cm; background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;  &lt;h1 style="background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style=""&gt;Replace Constructor with Factory Method&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt;  &lt;/div&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;This refactoring encapsulates a constructor with a static method that returns a new instance of a class.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;The Factory Method pattern is a way of creating objects without specifying the exact class of object that will be created. ReSharper generates a separate method for creating objects. Subclasses can override it to specify the derived type of object that will be created.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;div style="border: 3pt solid rgb(79, 129, 189); padding: 0cm; background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;  &lt;h1 style="background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style=""&gt;Safe Delete&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt;  &lt;/div&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;If you are going to delete a type, type member, or any other symbol in C# or VB.NET code files, ASP.NET code and markup, build scripts, or XAML, use this refactoring to ensure that the delete operation is safe. If there are no symbol usages found, or if there are some that are safely collapsible, the symbol will be deleted. Otherwise, ReSharper will show you all the usages that are not safe to delete, allowing you to edit the corresponding code.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;When you invoke Safe Delete on a target or a property in a build file, ReSharper does all necessary validations and operations to remove selected symbol. ReSharper can also remove any conflicting references for you.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;div style="border: 3pt solid rgb(79, 129, 189); padding: 0cm; background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;  &lt;h1 style="background: rgb(79, 129, 189) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style=""&gt;Use Base Type where Possible&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt;  &lt;/div&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;With this refactoring, your code is generalized by replacing particular type usages with references to its base type or interface where possible, that is, where no members of the derived type are used. It is especially useful after the Pull Members Up refactoring.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-499356636433703020?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/499356636433703020/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/03/resharper-refactorings.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/499356636433703020'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/499356636433703020'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/03/resharper-refactorings.html' title='ReSharper -- the refactorings'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-8288811680243003238</id><published>2009-03-02T06:27:00.001-08:00</published><updated>2009-03-02T06:32:09.565-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='team foundation server'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>TFSBuild.exe is missing something</title><content type='html'>I just wrote a post on &lt;a href="http://agilepractice.blogspot.com/2009/03/want-to-recompile-build-on-buildserver.html"&gt;how to rebuild an old change set using Team Foundation Build&lt;/a&gt;. By using TFSBuild.exe you may start a build on the build server. However, in order to be useful for private builds and gated builds (which will be a part of Team Foundation 2010), it should be possible to disabled the publishing of the results.&lt;br /&gt;&lt;br /&gt;With the current strategy the build output is public so that it shares the build number with the other builds. This means that if the build fails the results will be shared with the whole team. So it makes it less useful. Furthermore, the build numbers are shares.&lt;br /&gt;&lt;br /&gt;I guess the workaround is the create a new build definition only for private builds:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;"MyProject - CI" for Continuous integration&lt;/li&gt;&lt;li&gt;"MyProject - private" for private builds&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-8288811680243003238?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/8288811680243003238/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/03/tfsbuildexe-is-missing-something.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/8288811680243003238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/8288811680243003238'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/03/tfsbuildexe-is-missing-something.html' title='TFSBuild.exe is missing something'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-800229384132557103</id><published>2009-03-02T06:21:00.000-08:00</published><updated>2009-03-02T06:26:30.341-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='team foundation server'/><title type='text'>Want to recompile a build on the buildserver?</title><content type='html'>When using Team Foundation Build it is possible to recompile an old version. Typically you will be using continuous integration, and the most recent change set is build. However, from time to time you want to rebuild some old version. This is not possible using the GUI, so after some digging I found &lt;a href="http://msdn.microsoft.com/en-us/library/ms181742.aspx"&gt;this page&lt;/a&gt;: The strategy is also described in &lt;a href="http://agilepractice.blogspot.com/2009/03/inside-microsoft-build-engine-using.html"&gt;Inside the Microsoft® Build Engine: Using MSBuild and Team Foundation Build&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;tfsbuild start http://hostname:port TeamProject BuildDefinition /getOption:Custom /customGetVersion:VersionName&lt;br /&gt;&lt;br /&gt;Where VersionName is C1000 for changeset #1000, or LMyLabel for the label called MyLabel.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-800229384132557103?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/800229384132557103/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/03/want-to-recompile-build-on-buildserver.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/800229384132557103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/800229384132557103'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/03/want-to-recompile-build-on-buildserver.html' title='Want to recompile a build on the buildserver?'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-9107369881770826032</id><published>2009-03-02T04:30:00.000-08:00</published><updated>2009-03-02T05:07:03.022-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='team foundation server'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>Inside the Microsoft® Build Engine: Using MSBuild and Team Foundation Build</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://ecx.images-amazon.com/images/I/51dZYD055WL._SL500_AA240_.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 240px; height: 240px;" src="http://ecx.images-amazon.com/images/I/51dZYD055WL._SL500_AA240_.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I just got my copy of the new book "Inside the Microsoft® Build Engine: Using MSBuild and Team Foundation Build". The book describes how MSBuild works. The book start with a getting started chapter, and then continues with a more in depth chapter on advanced topics.&lt;br /&gt;&lt;br /&gt;The book even includes chapters on how Team Foundation Build works. Being one of the few books on MSBuild and Team Foundation Build, I guess it is worth having a copy. The table&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&lt;span style="color: rgb(0, 102, 51);font-family:Arial;" &gt;Table of Contents&lt;/span&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;&lt;b&gt;Part I. Overview &lt;/b&gt;&lt;br /&gt;1. MSBuild Quick Start&lt;br /&gt;2. MSBuild Deep Dive, Part 1&lt;br /&gt;3. MSBuild Deep Dive, Part 2&lt;/p&gt;&lt;p&gt;&lt;b&gt;Part II. Customizing MSBuild &lt;/b&gt;&lt;br /&gt;4. Custom Tasks&lt;br /&gt;5. Custom Loggers&lt;/p&gt;&lt;p&gt;&lt;b&gt;Part III. Advanced MSBuild Topics &lt;/b&gt;&lt;br /&gt;6. Batching and Incremental Builds&lt;br /&gt;7. External Tools&lt;/p&gt;&lt;p&gt;&lt;b&gt;Part IV. MSBuild Cookbook &lt;/b&gt;&lt;br /&gt;8. Practical Applications, Part 1&lt;br /&gt;9. Practical Applications, Part 2&lt;/p&gt;&lt;p&gt;&lt;b&gt;Part V. Team Foundation Build &lt;/b&gt;&lt;br /&gt;10. Team Build Quick Start&lt;br /&gt;11. Team Build Deep Dive&lt;br /&gt;12. Team Build Cookbook&lt;br /&gt;Appendix A: New Features in MSBuild 3.5&lt;br /&gt;Appendix B: Common Properties and Items&lt;br /&gt;Appendix C: New Features in Visual Studio Team System 2010 Team Build&lt;br /&gt;Index&lt;/p&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-9107369881770826032?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/9107369881770826032/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/03/inside-microsoft-build-engine-using.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/9107369881770826032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/9107369881770826032'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/03/inside-microsoft-build-engine-using.html' title='Inside the Microsoft® Build Engine: Using MSBuild and Team Foundation Build'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-6081135373939799415</id><published>2009-02-27T03:35:00.000-08:00</published><updated>2009-02-27T03:44:43.437-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='build tools'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><category scheme='http://www.blogger.com/atom/ns#' term='book'/><title type='text'>The Buildmaister's Guide</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://ecx.images-amazon.com/images/I/41eVMdXiQeL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 240px; height: 240px;" src="http://ecx.images-amazon.com/images/I/41eVMdXiQeL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg" alt="" border="0" /&gt;&lt;/a&gt;I just received the new book "The Buildmeister's Guilde: Achieving Agile Software Delivery" from Amazon. The book is written by Kevin Lee, an expert in software build tools.&lt;br /&gt;&lt;br /&gt;I am really looking forward to reading this book.&lt;br /&gt;&lt;br /&gt;If you also are interested in &lt;a href="http://agilepractice.blogspot.com/search/label/continuous%20integration"&gt;continuous integration&lt;/a&gt;, this is the book for you -- besides the standard book on the topic "Continuous Integration: Improving Software Quality and Reducing Risk".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-6081135373939799415?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/6081135373939799415/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/02/buildmaisters-guide.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/6081135373939799415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/6081135373939799415'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/02/buildmaisters-guide.html' title='The Buildmaister&apos;s Guide'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-1952478386855697346</id><published>2009-02-27T03:25:00.000-08:00</published><updated>2009-02-27T03:26:57.294-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>Continuous Integration -- the original article</title><content type='html'>For those of you who has not read the original article on continuous integration, &lt;a href="http://martinfowler.com/articles/continuousIntegration.html"&gt;here is the link&lt;/a&gt;. Enjoy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-1952478386855697346?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/1952478386855697346/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/02/continuous-integration-original-article.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/1952478386855697346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/1952478386855697346'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/02/continuous-integration-original-article.html' title='Continuous Integration -- the original article'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-3528327341434287642</id><published>2009-02-26T02:20:00.000-08:00</published><updated>2009-02-26T02:24:53.165-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='visual studio'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><title type='text'>Code Contracts in CLR 4.0 (.NET 4.0)</title><content type='html'>It looks like CRL 4.0 (Visual Studio 2010 / .NET 4.0) will include some nice features. It will allow your compiler to statically check for pre and post conditions of the input and output. Take a look at &lt;a href="http://geekswithblogs.net/sdorman/archive/2008/11/07/clr-4.0-code-contracts.aspx"&gt;this code block&lt;/a&gt;:&lt;br /&gt;&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;void&lt;/span&gt; BuyMoreStuff(Item[] cart, &lt;span style="color: rgb(0, 0, 255);"&gt;ref&lt;/span&gt; Decimal totalCost, Item i)&lt;br /&gt;{      &lt;br /&gt;   CodeContract.Requires(totalCost &gt;=0);&lt;br /&gt;   CodeContract.Requires(cart != &lt;span style="color: rgb(0, 0, 255);"&gt;null&lt;/span&gt;);&lt;br /&gt;   CodeContract.Requires(CodeContract.ForAll(cart, s =&gt; s != i));&lt;br /&gt;&lt;br /&gt;   CodeContract.Ensures(CodeContract.Exists(cart, s =&gt; s == i);&lt;br /&gt;   CodeContract.Ensures(totalCost &gt;= CodeContract.OldValue(totalCost));&lt;br /&gt;   CodeContract.EnsuresOnThrow&lt;ioexception&gt;(totalCost == CodeContract.OldValue(totalCost));&lt;br /&gt;&lt;br /&gt;   &lt;span style="color: rgb(0, 128, 0);"&gt;// Do some stuff&lt;/span&gt;&lt;br /&gt;   …&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;The CodeContract class allows you to set these conditions, and they are properly converted so that the compiler may check that the caller do not violate the rules. Much better than a lot of assers all over?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-3528327341434287642?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/3528327341434287642/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/02/code-contracts-in-clr-40-net-40.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/3528327341434287642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/3528327341434287642'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/02/code-contracts-in-clr-40-net-40.html' title='Code Contracts in CLR 4.0 (.NET 4.0)'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-8866443182523747379</id><published>2009-02-23T06:44:00.000-08:00</published><updated>2009-02-23T06:48:15.802-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Linq to SQL and predicates with foreach: PredicateExtensions</title><content type='html'>Do you want to write code like this?&lt;br /&gt;&lt;br /&gt;&lt;!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red43\green145\blue175;\red0\green0\blue255;\red163\green21\blue21;}??\fs20             \cf3 NorthwindDataContext\cf0  db = \cf4 new\cf0  \cf3 NorthwindDataContext\cf0 ();\par ??\par ??            \cf4 string\cf0 [] searchTerms = \cf4 new\cf0  \cf4 string\cf0 [] \{ \cf5 "Maria"\cf0 , \cf5 "Pedro"\cf0  \};\par ??\par ??            \cf4 var\cf0  predicate = \cf3 PredicateExtensions\cf0 .False&lt;\cf3 Customer\cf0 &gt;();\par ??\par ??            \cf4 foreach\cf0  (\cf4 string\cf0  searchTerm \cf4 in\cf0  searchTerms)\par ??            \{\par ??                \cf4 string\cf0  temp = searchTerm;\par ??                predicate = predicate.Or(c =&gt; c.ContactName.Contains(temp));\par ??            \}\par ??\par ??            dataGridView1.DataSource = db.Customers.Where(predicate);} --&gt; &lt;div style="background: white none repeat scroll 0% 0%; font-size: 10pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: black; font-family: courier new;"&gt; &lt;p style="margin: 0px;"&gt;            &lt;span style="color: rgb(43, 145, 175);"&gt;NorthwindDataContext&lt;/span&gt; db = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;NorthwindDataContext&lt;/span&gt;();&lt;/p&gt; &lt;p style="margin: 0px;"&gt; &lt;/p&gt; &lt;p style="margin: 0px;"&gt;            &lt;span style="color: blue;"&gt;string&lt;/span&gt;[] searchTerms = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt;[] { &lt;span style="color: rgb(163, 21, 21);"&gt;"Maria"&lt;/span&gt;, &lt;span style="color: rgb(163, 21, 21);"&gt;"Pedro"&lt;/span&gt; };&lt;/p&gt; &lt;p style="margin: 0px;"&gt; &lt;/p&gt; &lt;p style="margin: 0px;"&gt;            &lt;span style="color: blue;"&gt;var&lt;/span&gt; predicate = &lt;span style="color: rgb(43, 145, 175);"&gt;PredicateExtensions&lt;/span&gt;.False&lt;&lt;span style="color: rgb(43, 145, 175);"&gt;Customer&lt;/span&gt;&gt;();&lt;/p&gt; &lt;p style="margin: 0px;"&gt; &lt;/p&gt; &lt;p style="margin: 0px;"&gt;            &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue;"&gt;string&lt;/span&gt; searchTerm &lt;span style="color: blue;"&gt;in&lt;/span&gt; searchTerms)&lt;/p&gt; &lt;p style="margin: 0px;"&gt;            {&lt;/p&gt; &lt;p style="margin: 0px;"&gt;                &lt;span style="color: blue;"&gt;string&lt;/span&gt; temp = searchTerm;&lt;/p&gt; &lt;p style="margin: 0px;"&gt;                predicate = predicate.Or(c =&gt; c.ContactName.Contains(temp));&lt;/p&gt; &lt;p style="margin: 0px;"&gt;            }&lt;/p&gt; &lt;p style="margin: 0px;"&gt; &lt;/p&gt; &lt;p style="margin: 0px;"&gt;            dataGridView1.DataSource = db.Customers.Where(predicate);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;Using the PredicateExtensions class, you will be able to generate a complicated as a proper predicate that can be used with Linq to SQL. The problem with using .Union() is that not all operations are supported. But here you may construct a nice predicate that does what you want--iterate over a collection. Take a look at &lt;a href="http://talentgrouplabs.com/blog/archive/2007/11/26/dynamic-linq-queries--dynamic-where-clause-part-2.aspx"&gt;this post&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-8866443182523747379?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/8866443182523747379/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/02/linq-to-sql-and-predicates-with-foreach.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/8866443182523747379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/8866443182523747379'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/02/linq-to-sql-and-predicates-with-foreach.html' title='Linq to SQL and predicates with foreach: PredicateExtensions'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-7232421708448406329</id><published>2009-02-19T14:23:00.000-08:00</published><updated>2009-02-20T00:20:17.628-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bamboo'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>Usefull Unit Test feature in Bamboo</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.atlassian.com/software/bamboo/images/features/test_summary.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 950px; height: 730px;" src="http://www.atlassian.com/software/bamboo/images/features/test_summary.png" alt="" border="0" /&gt;&lt;/a&gt;I admit it. I have a few bad "unit test" that are run in each continuous integration build. Bamboo has this nice feature that shows statistics about the tests. By using &lt;a href="http://www.atlassian.com/software/bamboo/default.jsp"&gt;Bamboo&lt;/a&gt;, I can easily see how often each test has failed a build on the build server!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-7232421708448406329?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/7232421708448406329/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/02/usefull-unit-test-feature-in-bamboo.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/7232421708448406329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/7232421708448406329'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/02/usefull-unit-test-feature-in-bamboo.html' title='Usefull Unit Test feature in Bamboo'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-1880566381096728557</id><published>2009-02-19T14:16:00.000-08:00</published><updated>2009-02-20T00:20:51.802-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bamboo'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>Bamboo Continuous Integratoin --- it is not that easy</title><content type='html'>&lt;blockquote&gt;&lt;/blockquote&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;As&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;you&lt;/span&gt; understand &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;from&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;this&lt;/span&gt; blog, I &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;am&lt;/span&gt; a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;big&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;fan&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;of&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;continuous&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;integration&lt;/span&gt;. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;Today&lt;/span&gt; I &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;browsed&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;the&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;web&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;site&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;of&lt;/span&gt; &lt;a href="http://www.atlassian.com/software/bamboo/features/distributed.jsp"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;Bamboo&lt;/span&gt;&lt;/a&gt;--a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;continuous&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;integration&lt;/span&gt; system--to have a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;look&lt;/span&gt; at &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;the&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;features&lt;/span&gt;. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;The&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_23"&gt;web&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_24"&gt;page&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_25"&gt;read&lt;/span&gt; like &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_26"&gt;this&lt;/span&gt;:&lt;br /&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_27"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_27"&gt;Bamboo&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_28"&gt;distributes&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_29"&gt;builds&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_30"&gt;across&lt;/span&gt; different &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_31"&gt;machines&lt;/span&gt;. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_32"&gt;These&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_33"&gt;distributed&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_34"&gt;builds&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_35"&gt;allow&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_36"&gt;you&lt;/span&gt; to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_37"&gt;harness&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_38"&gt;the&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_39"&gt;computing&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_40"&gt;power&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_41"&gt;of&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_42"&gt;your&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_43"&gt;entire&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_44"&gt;network&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_45"&gt;maximising&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_46"&gt;your&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_47"&gt;build&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_48"&gt;productivity&lt;/span&gt; and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_49"&gt;decreasing&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_50"&gt;wait&lt;/span&gt; times.&lt;br /&gt;&lt;br /&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_51"&gt;Simply&lt;/span&gt; install a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_52"&gt;new&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_53"&gt;Bamboo&lt;/span&gt; Agent &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_54"&gt;on&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_55"&gt;any&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_56"&gt;additional&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_57"&gt;build&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_58"&gt;computers&lt;/span&gt; and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_59"&gt;your&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_60"&gt;main&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_61"&gt;Bamboo&lt;/span&gt; server &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_62"&gt;will&lt;/span&gt; manage &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_63"&gt;it&lt;/span&gt;. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_64"&gt;When&lt;/span&gt; a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_65"&gt;build&lt;/span&gt; is &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_66"&gt;detected&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_67"&gt;the&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_68"&gt;Bamboo&lt;/span&gt; server &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_69"&gt;will&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_70"&gt;automatically&lt;/span&gt; and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_71"&gt;intelligently&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_72"&gt;distribute&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_73"&gt;the&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_74"&gt;builds&lt;/span&gt; to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_75"&gt;the&lt;/span&gt; agents.&lt;br /&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_76"&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_76"&gt;Reall&lt;/span&gt;y, who believes it is that easy? The story has been different for me. I always end up with a few applications or libraries that have to be installed on the build machine. And those applications and libraries are not necessarily the same for all the projects I am building. So it means that each build machine may need some tweaking before it is ready to run!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-1880566381096728557?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/1880566381096728557/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/02/bamboo-continuous-integratoin-it-is-not.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/1880566381096728557'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/1880566381096728557'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/02/bamboo-continuous-integratoin-it-is-not.html' title='Bamboo Continuous Integratoin --- it is not that easy'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-5249878029396012750</id><published>2009-02-19T13:45:00.001-08:00</published><updated>2009-02-20T00:26:49.264-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='book'/><title type='text'>More Effective C#: 50 Specific Ways to Improve Your C#</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://ecx.images-amazon.com/images/I/51BUOpbRYuL._SS500_.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px; height: 500px;" src="http://ecx.images-amazon.com/images/I/51BUOpbRYuL._SS500_.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;"More Effective C#: 50 Specific Ways to Improve Your C#" is a book by Bill Wagner on how to improve your C# code. The book present 50 specific improvement. Each item includes a description of the problem the improvement solves and how it works. The book includes the topics:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Use generics to express your design intent more effectively&lt;/li&gt;&lt;li&gt;Master advanced generics techniques, such as constraints, method constraints, and generic specialization&lt;/li&gt;&lt;li&gt;Use the multithreaded techniques you’ll need to work with the .NET framework every day&lt;/li&gt;&lt;li&gt;Express modern design idioms using the rich palette of C# language features&lt;/li&gt;&lt;li&gt;Successfully mix object oriented and functional programming constructs&lt;/li&gt;&lt;li&gt;Create composable interfaces and avoid confusion in public interfaces&lt;/li&gt;&lt;li&gt;Use extension methods to separate contracts from implementation&lt;/li&gt;&lt;li&gt;Program successfully with C# closures and anonymous types&lt;/li&gt;&lt;li&gt;Write more effective LINQ queries&lt;/li&gt;&lt;li&gt;Make the most of LINQ Lazy Evaluation Queries and Lambda Expressions&lt;/li&gt;&lt;li&gt;Distinguish and convert between delegates and expression trees&lt;/li&gt;&lt;li&gt;Efficiently utilize nullable types and partial classes&lt;/li&gt;&lt;li&gt;Use implicit properties for mutable, nonserializable data&lt;/li&gt;&lt;/ul&gt;The book is a followup of the book "Effective C#: 50 Specific Ways to Improve Your C#" by the same author. The Effective C# book was mainly on .NET 1.1, but the new book is on .NET 2.0 and .NET 3.5.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-5249878029396012750?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/5249878029396012750/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/02/more-effective-c-50-specific-ways-to.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/5249878029396012750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/5249878029396012750'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/02/more-effective-c-50-specific-ways-to.html' title='More Effective C#: 50 Specific Ways to Improve Your C#'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-4967879063068784560</id><published>2009-02-18T05:46:00.000-08:00</published><updated>2009-02-20T00:23:55.824-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='teamcity'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>Run recently failed, new, and modified tests first!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.jetbrains.com/teamcity/features/screenshots/40/administrationRunRiskTestsFirst.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 556px; height: 383px;" src="http://www.jetbrains.com/teamcity/features/screenshots/40/administrationRunRiskTestsFirst.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Lets say you just modified a unit test and committed the change. In that situation you want to get feedback as soon as possible from the continuous integration system if the modified test passes. &lt;a href="http://www.jetbrains.com/teamcity/"&gt;TeamCity&lt;/a&gt; does just that. By enabling the two configuration settings shown in the picture above, the build will automatically run recently failed, new, and modified tests first. This allows for fast failing, making the response times much faster. Furthermore, TeamCity does not wait until all the tests are completed to report that the build broke.&lt;br /&gt;&lt;br /&gt;Too bad I have to use Team Foundation Build!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-4967879063068784560?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/4967879063068784560/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/02/run-recently-failed-new-and-modified.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/4967879063068784560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/4967879063068784560'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/02/run-recently-failed-new-and-modified.html' title='Run recently failed, new, and modified tests first!'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-4869415321417365402</id><published>2009-02-18T01:17:00.001-08:00</published><updated>2009-02-18T01:19:49.173-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>Comparason of Continuous Integration solutions</title><content type='html'>I just came across a report called "&lt;a href="http://appl.fontysvenlo.org/results/2008/GF/continuous_integration.pdf"&gt;Continuous Integration: What companies expect and solutions provide&lt;/a&gt;" by Georg Fleischer. If you are considering buying a new continuous integration system you should read this first. It really gives a good comparison of what features are provided in the different solutions.&lt;br /&gt;&lt;br /&gt;The report has a section where "Individual features and concepts are discussed. These features and concepts are specific to some of the solutions, but they may be important to you. So have a look.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-4869415321417365402?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/4869415321417365402/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/02/comparason-of-continuous-integration.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/4869415321417365402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/4869415321417365402'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/02/comparason-of-continuous-integration.html' title='Comparason of Continuous Integration solutions'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-3511069810493119301</id><published>2009-02-18T00:09:00.001-08:00</published><updated>2009-02-18T01:00:23.725-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cruse control'/><category scheme='http://www.blogger.com/atom/ns#' term='team foundation server'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>Treating dependencies between projects</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://studios.thoughtworks.com/images/cruise_dependency_material.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 600px; height: 338px;" src="http://studios.thoughtworks.com/images/cruise_dependency_material.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I have previously been writing about dependency management between projects in Team Foundation Server when doing continuous integraiton. This is basically a missing feature.&lt;br /&gt;&lt;br /&gt;However, &lt;a href="http://studios.thoughtworks.com/cruise-continuous-integration/whats-new-in-cruise"&gt;Cruse 1.2&lt;/a&gt; does support this in a nice way. As you can see from the picture, a successful build can trigger a build of another project. Furthermore, Cruse Control keeps track of which build triggered which build. This information will typically get lost when kicking off a build from the msbuild task in Team Foundation Build.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-3511069810493119301?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/3511069810493119301/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/02/treating-dependencies-between-projects.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/3511069810493119301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/3511069810493119301'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/02/treating-dependencies-between-projects.html' title='Treating dependencies between projects'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-5641113470971081536</id><published>2009-02-16T01:25:00.000-08:00</published><updated>2009-02-20T00:21:17.158-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='team foundation server'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>Team Foundation Build Server -- Dependency Management</title><content type='html'>After reading about other continuous integration systems, I see that Team Foundation Build Server is missing many of the advanced features. I heave earlier written about pre-test commits, but this time I will take about dependency management.&lt;br /&gt;&lt;br /&gt;With Cruse Control you can have dependencies between your Cruse Control projects. It means that if a build completes successfully, a &lt;a href="http://studios.thoughtworks.com/cruise-continuous-integration/dependency-management"&gt;new build of any project dependent on this first project is started&lt;/a&gt;. Furthermore, artifacts may be shared between the projects.&lt;br /&gt;&lt;br /&gt;However, in Team Foundation Build you are basically forced to build everything from scratch, or check the binaries into the source control system. This can get very complicated if multiple projects shares a component such as a assembly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-5641113470971081536?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/5641113470971081536/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/02/team-foundation-build-server-dependency.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/5641113470971081536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/5641113470971081536'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/02/team-foundation-build-server-dependency.html' title='Team Foundation Build Server -- Dependency Management'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-3324373658618103530</id><published>2009-02-16T00:50:00.000-08:00</published><updated>2009-02-16T01:02:18.941-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><category scheme='http://www.blogger.com/atom/ns#' term='source control'/><title type='text'>Working with source control systems</title><content type='html'>When working with source control systems, I see from time to time developers committing multiple changes in a short period of time after being silent for many days. This is an anti pattern, and I will describe it below.&lt;br /&gt;&lt;br /&gt;What is really going on is that the developer is doing some major changes on his computer. After spending a week or two with the changes -- often on unrelated parts of the code -- they are ready to commit the changes. When they try to commit, they figure out that some of the files has changed, so they have do to a merge. After the merge, they commit the files they think are related at once. The combination they choose is often okay, however the develop often misses a point: they do not commit all the changes that are required, so the build will fail. This may be because they change an interface (which is okay), but they did not include all the related changes where the consumers of the interface are changed as well. After doing maybe five commits, the build server is able to compile the program again, but the build still fails due to a failing automated test.&lt;br /&gt;&lt;br /&gt;At that time, the defect indicated by the automated test is not fixed because the develop is busy with "something else".&lt;br /&gt;&lt;br /&gt;By doing commits more often, I think much of this can be avoided. Furthermore, I hope that the introduction of pre-test commits will mitigate most of this by forcing the developer to only commit working change sets.&lt;br /&gt;&lt;br /&gt;Let me state it one more time: Every change set should build!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-3324373658618103530?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/3324373658618103530/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/02/working-with-source-control-systems.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/3324373658618103530'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/3324373658618103530'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/02/working-with-source-control-systems.html' title='Working with source control systems'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-1840568786465951426</id><published>2009-02-16T00:44:00.000-08:00</published><updated>2009-02-16T00:50:35.400-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unit testing'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><category scheme='http://www.blogger.com/atom/ns#' term='source control'/><title type='text'>Continuous Integration != Having a Build Server</title><content type='html'>A common misconception is that you are practicing continuous integration by just setting up a build server to continuously build the most recent source code.&lt;br /&gt;&lt;br /&gt;The reason why is a misconception is that you are not really doing continuous integration if:&lt;br /&gt;* You ignore broken builds -- a broken build should be fixes NOW, not tomorrow!&lt;br /&gt;* You just compile the source code, but does not run any tests. The test coverage should be sufficient as well.&lt;br /&gt;* Failed tests do not fail the build.&lt;br /&gt;* Developers do not check in every day.&lt;br /&gt;* Developers do not check in change set -- the smallest working changes. Changes should work together when you check in.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-1840568786465951426?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/1840568786465951426/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/02/continuous-integration-having-build.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/1840568786465951426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/1840568786465951426'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/02/continuous-integration-having-build.html' title='Continuous Integration != Having a Build Server'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-4842362110517962364</id><published>2009-02-15T05:54:00.000-08:00</published><updated>2009-02-15T06:01:17.313-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='team foundation server'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>Team Foundation Build running test agains database</title><content type='html'>I just read an &lt;a href="http://jonesie.net.nz/CreatingASQLDatabaseFromMSBuildTeamBuild.aspx"&gt;old post &lt;/a&gt;where the author included the following code:&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span class="218071403-09122005"&gt;&lt;p align="left"&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="font-family:Arial;font-size:100%;"&gt;&lt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="color:#800000;"&gt;TestDBServer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&gt;&lt;span class="218071403-09122005"&gt;&lt;span style="color:#000000;"&gt;fred&lt;/span&gt;&lt;/span&gt;&lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;TestDBServer&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial;"&gt;&lt;span style="font-size:100%;color:#0000ff;"&gt;&gt;&lt;br /&gt;&lt;&lt;/span&gt;&lt;span style="font-size:100%;color:#800000;"&gt;TestDBName&lt;/span&gt;&lt;span style="font-size:100%;color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;$(BuildNumber)&lt;/span&gt;&lt;span style="font-size:100%;color:#0000ff;"&gt;&lt;/&lt;/span&gt;&lt;span style="font-size:100%;color:#800000;"&gt;TestDBName&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial;"&gt;&lt;span style="font-size:100%;color:#0000ff;"&gt;&gt;&lt;br /&gt;&lt;&lt;/span&gt;&lt;span style="font-size:100%;color:#800000;"&gt;TestDBCreateConnectionString&lt;/span&gt;&lt;span style="font-size:100%;color:#0000ff;"&gt;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial;"&gt;&lt;span style="font-size:100%;"&gt; data source=$(TestDBServer);integrated security=SSPI;Pooling=true&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial;"&gt;&lt;span style="font-size:100%;color:#0000ff;"&gt;&lt;/&lt;/span&gt;&lt;span style="font-size:100%;color:#800000;"&gt;TestDBCreateConnectionString&lt;/span&gt;&lt;span style="font-size:100%;color:#0000ff;"&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span class="218071403-09122005"&gt;&lt;span style="font-size:100%;color:#0000ff;"&gt; &lt;/span&gt;&lt;p&gt;&lt;span style="font-size:100%;color:#0000ff;"&gt;&lt;span style="font-family:Arial;"&gt;&lt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial;"&gt;&lt;span style="font-size:100%;color:#800000;"&gt;Message&lt;/span&gt;&lt;span style="font-size:100%;color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="font-size:100%;color:#ff0000;"&gt;Text&lt;/span&gt;&lt;span style="font-size:100%;color:#0000ff;"&gt;=&lt;/span&gt;&lt;span style="font-size:100%;"&gt;"&lt;/span&gt;&lt;span style="font-size:100%;color:#0000ff;"&gt;Creating test &lt;span class="searchword"&gt;database&lt;/span&gt; &lt;/span&gt;&lt;span style="font-size:100%;"&gt;"&lt;/span&gt;&lt;span style="font-size:100%;color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="font-size:100%;color:#ff0000;"&gt;Importance&lt;/span&gt;&lt;span style="font-size:100%;color:#0000ff;"&gt;=&lt;/span&gt;&lt;span style="font-size:100%;"&gt;"&lt;/span&gt;&lt;span style="font-size:100%;color:#0000ff;"&gt;normal&lt;/span&gt;&lt;span style="font-size:100%;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial;"&gt;&lt;span style="font-size:100%;color:#0000ff;"&gt;/&gt;&lt;br /&gt;&lt;&lt;/span&gt;&lt;span style="font-size:100%;color:#800000;"&gt;ExecuteSQL&lt;/span&gt;&lt;span style="font-size:100%;color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="font-size:100%;color:#ff0000;"&gt;ConnectionString&lt;/span&gt;&lt;span style="font-size:100%;color:#0000ff;"&gt;=&lt;/span&gt;&lt;span style="font-size:100%;"&gt;"&lt;/span&gt;&lt;span style="font-size:100%;color:#0000ff;"&gt;$(TestDBCreateConnectionString)&lt;/span&gt;&lt;span style="font-size:100%;"&gt;"&lt;/span&gt;&lt;span style="font-size:100%;color:#0000ff;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="font-size:100%;color:#ff0000;"&gt;Command&lt;/span&gt;&lt;span style="font-size:100%;color:#0000ff;"&gt;=&lt;/span&gt;&lt;span style="font-size:100%;"&gt;"&lt;/span&gt;&lt;span style="font-size:100%;color:#0000ff;"&gt;create &lt;span class="searchword"&gt;database&lt;/span&gt; [$(BuildNumber)]&lt;/span&gt;&lt;span style="font-size:100%;"&gt;"&lt;/span&gt;&lt;span style="font-size:100%;color:#0000ff;"&gt; /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;span class="218071403-09122005"&gt;&lt;/span&gt;&lt;/span&gt;&lt;p&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;span class="218071403-09122005"&gt;&lt;span style="font-size:100%;color:#0000ff;"&gt;&lt;&lt;/span&gt;&lt;span style="font-size:100%;color:#800000;"&gt;Exec&lt;/span&gt;&lt;span style="font-size:100%;color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="font-size:100%;color:#ff0000;"&gt;Command&lt;/span&gt;&lt;span style="font-size:100%;color:#0000ff;"&gt;=&lt;/span&gt;&lt;span style="font-size:100%;"&gt;"&lt;/span&gt;&lt;span style="font-size:100%;color:#0000ff;"&gt;isql.exe -E -S $(TestDBServer) -i $(BuildDirectoryPath)\SUMS3\SUMS3Debug\Sources\Airways.SUMS3\CreateTestDB.SQL -d [$(BuildNumber)]&lt;/span&gt;&lt;span style="font-size:100%;"&gt;"&lt;/span&gt;&lt;span style="font-size:100%;color:#0000ff;"&gt; /&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;I then just realized that I should change my current practice of having a fixed database name and instead attaching a new database every build. And the perfect database name could be &lt;span style="font-size:85%;"&gt;&lt;span class="218071403-09122005"&gt;&lt;span style="font-family:Arial;"&gt;&lt;span style="font-size:100%;"&gt;$(BuildNumber), which should be unique -- each new build will get a new database and for each build definition.&lt;br /&gt;&lt;br /&gt;Just do not forget to detach the data base, or your sql server will have a lot of databases after a while.&lt;br /&gt;&lt;br /&gt;Some reasons why this is probably a good idea is that if a build for some reason fails to free the database all the subsequent build will not fail.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-4842362110517962364?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/4842362110517962364/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/02/team-foundation-build-running-test.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/4842362110517962364'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/4842362110517962364'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/02/team-foundation-build-running-test.html' title='Team Foundation Build running test agains database'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-1110490479443342060</id><published>2009-02-13T04:58:00.000-08:00</published><updated>2009-02-20T00:25:42.019-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OPC'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>OLE for Process Control and Continuous Integration</title><content type='html'>OLE for Process Control (OPC) is an interface for getting simple values such as booleans, floats, doubles from one machine to the other. It is used heavily in process control. Measurements such as pressures, temperatures, speeds, flow rates are transferred from one system to another periodically (e.g. every second).&lt;br /&gt;&lt;br /&gt;Anyway, when doing development of such applications you want to make sure that you get everything right. It means that you want to see that the given OPC input gives the correct output. So basically you write unit or component tests that does that. You could mock the OPC interface class, or you could just operate with an OPC Simulator what allows other applications to write values.&lt;br /&gt;&lt;br /&gt;Usually we do the last thing to get enough confidence in the application. Unfortuantly I have not been able to find a good OPC simulator. I have been using Matrikon OPC Simuator, but it is not really made for automation. In order to define tag items (the information that is shared), you will have to use the GUI. And even staring the server requires some manual actions.&lt;br /&gt;&lt;br /&gt;So... I am looking for alternatives. If you know some, please give me some feedback in the comment area.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-1110490479443342060?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/1110490479443342060/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/02/ole-for-process-control-and-continuous.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/1110490479443342060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/1110490479443342060'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/02/ole-for-process-control-and-continuous.html' title='OLE for Process Control and Continuous Integration'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-1704160837876926879</id><published>2009-02-13T04:51:00.000-08:00</published><updated>2009-02-13T04:58:53.664-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='team foundation server'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>Team Foundation Build Load balancing</title><content type='html'>When doing continuous integration, you may often run into a situation where you do a commit, and then 30 seconds later you do a new commit. Or maybe not you, but your colleague. In this situation the builds will typically queue up because you have only one build server for each project.&lt;br /&gt;&lt;br /&gt;For Team Foundation Build I came across &lt;a href="http://www.codeplex.com/teambuildloadbalance/"&gt;Team Founation Bulid Load Balancer&lt;/a&gt;. It monitors the build queues of your project, and if it finds a queue at one build server and an idle build server, it simply moves the build from the one server to the other. Nice?&lt;br /&gt;&lt;br /&gt;Of cource, now you are really forced to make both build server equal. This means that the installed software should be the same on bother servers. If not, a build will pass at one server, and fail at the other.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-1704160837876926879?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/1704160837876926879/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/02/team-foundation-build-load-balancing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/1704160837876926879'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/1704160837876926879'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/02/team-foundation-build-load-balancing.html' title='Team Foundation Build Load balancing'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-3678312602494843396</id><published>2009-02-13T04:41:00.000-08:00</published><updated>2009-02-20T00:24:29.259-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='teamcity'/><category scheme='http://www.blogger.com/atom/ns#' term='team foundation server'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>Pre-test commit</title><content type='html'>From reading Paul M. Duvall's "Continuous Integration: Improving Software Quality and Reducing Risk" book, I learned about the pre-test commit feature of continuous integration systems.&lt;br /&gt;&lt;br /&gt;In the standard continuous integration system you do a private build and run your unit tests. If you like the result, you commit to the source control system. The continuous integration system gets the latest source code and starts a build. if the build succeeds, everything is fine. However, sometimes it does not because of other commits between the private build and checkin, differences between the private environment and the continuous integration environment.&lt;br /&gt;&lt;br /&gt;However, with a pre-test commit system, your changes are not really commited before a build succeeds on the build machine. This means that broken code will not get into the source control, and the commiter is forced to fix and recommit the code.&lt;br /&gt;&lt;br /&gt;What I like about this way of operating is that it makes it much easier to enforce the continuous integration system; it is not possible to just ignore it.&lt;br /&gt;&lt;br /&gt;I know TeamCity includes support for this, but reading about Team Foundation Server 2010, I can see that this will soon become a part of my continuous integration solution as well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-3678312602494843396?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/3678312602494843396/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/02/pre-test-commit.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/3678312602494843396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/3678312602494843396'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/02/pre-test-commit.html' title='Pre-test commit'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-2448530032536066992</id><published>2009-02-13T04:13:00.000-08:00</published><updated>2009-02-13T04:17:46.984-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>Build Notifications</title><content type='html'>What is your favorite build notification tool when doing continuous integration? Please use the comment of this post to share your view.&lt;br /&gt;Personally I like to have a system try application, but I also like the idea of having a &lt;a href="http://agilepractice.blogspot.com/2009/02/buildwatcher-continuously-keeping-eye.html"&gt;big screen in the coffee area showing the current status&lt;/a&gt;.&lt;br /&gt;Here is a list of methods I know about:&lt;br /&gt;* System try&lt;br /&gt;* Email&lt;br /&gt;* Sound&lt;br /&gt;* &lt;a href="http://agilepractice.blogspot.com/2009/02/buildwatcher-continuously-keeping-eye.html"&gt;Big screen&lt;/a&gt;&lt;br /&gt;* Web page&lt;br /&gt;* Java lamp&lt;br /&gt;* RSS feed&lt;br /&gt;&lt;br /&gt;I guess the most used is a complaining colleague. Telling that you broke the build. It must be a better way?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-2448530032536066992?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/2448530032536066992/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/02/build-notifications.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/2448530032536066992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/2448530032536066992'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/02/build-notifications.html' title='Build Notifications'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-255447298480811819</id><published>2009-02-13T03:45:00.001-08:00</published><updated>2009-02-13T03:54:28.118-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unit testing'/><category scheme='http://www.blogger.com/atom/ns#' term='windows installer xml'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>What is continuous integration -- really?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.martinfowler.com/duvall.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 240px; height: 240px;" src="http://www.martinfowler.com/duvall.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Continuous integration is an interesting topic, however we mean different things by it.&lt;br /&gt;&lt;br /&gt;Here is a list of what I think should be included in a minimum continuous integration:&lt;br /&gt;* Every checking should trigger a build&lt;br /&gt;* The build does a clean compile and linking of the software&lt;br /&gt;* Unit and custumer tests should be ran on each build&lt;br /&gt;&lt;br /&gt;But the result of the above is just a collection of .exe and .dll files. What you really want is a .msi file or similar that you can ship to your customer. This .msi file should be build! I will later talk about how you can do that using WiX -- Windows Installer XML.&lt;br /&gt;&lt;br /&gt;Continuous (test) deployment is also something that should be considered. After each successful build, the software should be deployed to a test envirnoment so that you can always have a look at what is current. This typically requires some more thought.&lt;br /&gt;&lt;br /&gt;Personally I have not worked so much with continuous deployment because the challenges has been to get all the basic pieces together, but I firmly beleave that having a test environment that is always up to date with the most recent successful build is something that will give very much.&lt;br /&gt;&lt;br /&gt;For further information on Continuous Integration, have a look at Martin Fowler's "Continuous Integration: Improved Software Quality and Reduction Risk" book.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-255447298480811819?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/255447298480811819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/02/what-is-continuous-integration-really.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/255447298480811819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/255447298480811819'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/02/what-is-continuous-integration-really.html' title='What is continuous integration -- really?'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-4497487949978969200</id><published>2009-02-13T02:25:00.000-08:00</published><updated>2009-02-13T02:29:49.895-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='team foundation server'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>Team Foundation Build Hotfix improving build speed</title><content type='html'>Team Foundation Build 2008 SP 1 includes a bug that causes a project to be build multiple times, one extra time it is referred to by another project. This makes it very slow. I just found the hot fix for this, and it cut down the build time by a 20 seconds for a small build I have.&lt;br /&gt;&lt;br /&gt;Try it yourself at by &lt;a href="http://code.msdn.microsoft.com/KB958845"&gt;downloading the hotfix&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-4497487949978969200?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/4497487949978969200/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/02/team-foundation-build-hofix-improving.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/4497487949978969200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/4497487949978969200'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/02/team-foundation-build-hofix-improving.html' title='Team Foundation Build Hotfix improving build speed'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-8982009727937663823</id><published>2009-02-12T00:51:00.000-08:00</published><updated>2009-02-12T01:07:46.151-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unit testing'/><title type='text'>ConfigurationManager.ConnectionStrings and Unit Testing in .NET</title><content type='html'>We have a lot of legacy code where we use ConfigurationManager.ConnectionStrings["MyConnectionString"] to get the connection string to the database. Some of the tests I would like to make is to see what happens if the database fails to open (or something like that). Because of the (bad) design, I am not able to change this connection string programmatically.&lt;br /&gt;Does anyone have a suguestion of how to do this in the best way?&lt;br /&gt;ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString = "MyNewString";&lt;br /&gt;reports:&lt;br /&gt;System.Configuration.ConfigurationElement.SetPropertyValue(ConfigurationProperty prop, Object value, Boolean ignoreLocks)&lt;br /&gt;System.Configuration.ConnectionStringSettings.set_ConnectionString(String value)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-8982009727937663823?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/8982009727937663823/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/02/configurationmanagerconnectionstrings.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/8982009727937663823'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/8982009727937663823'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/02/configurationmanagerconnectionstrings.html' title='ConfigurationManager.ConnectionStrings and Unit Testing in .NET'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-3312808921208447249</id><published>2009-02-10T04:07:00.000-08:00</published><updated>2009-02-20T00:26:49.264-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='test-driven development'/><category scheme='http://www.blogger.com/atom/ns#' term='book'/><title type='text'>Test-Driven Development: By Example</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://ecx.images-amazon.com/images/I/513PZWJDH7L.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 399px; height: 500px;" src="http://ecx.images-amazon.com/images/I/513PZWJDH7L.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I just want to recommend a book this time. It is called Test-Driven Development: By Example. The book is written by the test-driven development guru Kent Beck. It is a must have for every test-driver.&lt;br /&gt;If you spend a few hours reading this book you will definitely improve your code quality and reduce the number of defects significantly. Of course, I assume you follow the practice.&lt;br /&gt;Give it a try!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-3312808921208447249?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/3312808921208447249/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/02/test-driven-development-by-example.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/3312808921208447249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/3312808921208447249'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/02/test-driven-development-by-example.html' title='Test-Driven Development: By Example'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-6394770927036379132</id><published>2009-02-10T04:04:00.001-08:00</published><updated>2009-02-20T00:23:21.140-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bamboo'/><category scheme='http://www.blogger.com/atom/ns#' term='team foundation server'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>Continuous Integration – What are your alternatives</title><content type='html'>&lt;span xmlns=""&gt;&lt;p&gt;We currently using Team Foundation Build as our continuous integration system, but I know there are other alternatives. Here is a list I found at &lt;a href="http://en.wikipedia.org/wiki/Continuous_Integration"&gt;Wikipedia&lt;/a&gt;:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;AnthillPro — a continuous integration server from Urbancode, very feature rich supports all major build related technologies.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Apache Continuum — a continuous integration server supporting Apache Maven and Apache Ant.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Apache Gump — Apache's continuous integration tool.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Atlassian Bamboo — commercial continuous integration server from Atlassian.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Automated Build Studio — commercial automated build, continuous integration and release management system by AutomatedQA.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;BuildBot — a Python/Twisted-based continuous build system.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;CABIE — Continuous Automated Build and Integration Environment. Open source, written in Perl, works with CVS, Subversion, AccuRev, Bazaar and Perforce.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Cascade — commercial continuous integration tool. Provides a "checkpointing" facility by which changes can be built and tested before they are committed.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Cruise — Commercial continuous integration and release management server from ThoughtWorks, the creators of CruiseControl and CruiseControl.NET.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;CruiseControl — Java-based framework for a continuous build process.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;CruiseControl.NET — .NET-based automated continuous integration server.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;CruiseControl.rb - Ruby based CI server.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Draco.NET — .NET-based automated continuous integration server inspired by CruiseControl.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;ElectricCommander — commercial build-test-deploy automation solution developed by Electric Cloud.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Hudson — MIT licensed, written in Java, runs in servlet container, supports CVS, Subversion, GIT, Ant, NAnt, Maven, and shell scripts.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;TeamCity — commercial continuous integration server from JetBrains with free professional edition.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Team Foundation Build - Microsoft's commercial continuous integration server and source code repository.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Tinderbox — a Mozilla based product written in Perl.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;SCLM — an SCM system part of z/OS to allow integrated source control, build and promotion of work packages as a work area control system. It is part of IBM Rational Software's adaptive framework.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Xinc — a continuous integration server written in PHP 5. It has built-in support for Subversion and Phing (and therefore PHPUnit), and can be easily extended to work with alternative version control or build tools. Google project.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;If you known some other alternatives, please let me know? Later I will try to give a comparison of the alternatives.&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-6394770927036379132?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/6394770927036379132/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/02/continuous-integration-what-are-your.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/6394770927036379132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/6394770927036379132'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/02/continuous-integration-what-are-your.html' title='Continuous Integration – What are your alternatives'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-1810777933591168481</id><published>2009-02-09T02:23:00.001-08:00</published><updated>2009-02-20T00:22:32.656-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Try Resharper – it really improves your code quality</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.publicvoid.dk/content/binary/WindowsLiveWriter/ReSharper4.0Released_8329/ReSharper-40-install-screen_thumb.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 499px; height: 484px;" src="http://www.publicvoid.dk/content/binary/WindowsLiveWriter/ReSharper4.0Released_8329/ReSharper-40-install-screen_thumb.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span xmlns=""&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Resharper is an excellent plug-in to Visual Studio. It exist the basic refactoring such as Extract Method and Rename Method/Variable. There is a free 30 day trial, so go ahead and try it yourself. I ended up buying the software.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;In addition to the refactoring part, it is really a tool for resharping your code (I guess that's why they gave it that name). For instance, using the StyeleCop plug-in you may easily check the compliance to coding standards as you.&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-1810777933591168481?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/1810777933591168481/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/02/try-resharper-it-really-improves-your.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/1810777933591168481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/1810777933591168481'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/02/try-resharper-it-really-improves-your.html' title='Try Resharper – it really improves your code quality'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-1511083980360207996</id><published>2009-02-09T00:37:00.001-08:00</published><updated>2009-02-09T00:40:18.667-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='team foundation server'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>BuildWatcher – continuously keeping an eye on your continuous integration builds</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_BzMG_Iux85s/SY_r18yToBI/AAAAAAAAAIk/Mol_mXiCVqQ/s1600-h/BuildWatcher.PNG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 400px; height: 68px;" src="http://4.bp.blogspot.com/_BzMG_Iux85s/SY_r18yToBI/AAAAAAAAAIk/Mol_mXiCVqQ/s400/BuildWatcher.PNG" alt="" id="BLOGGER_PHOTO_ID_5300714598521085970" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span xmlns=""&gt;&lt;p&gt;If you are like me, you have multiple software projects or productions that you want to keep in good shape. For me, this means bringing attention to broken builds so that the team fixes it as soon as it breaks.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Each team member may install the Build Notification tool that comes with Team Foundation Server 2008 Power Tools. This tools pops up a message when a build is queued, started, and completed. Unfortunately, there are some bugs in the software so that every time the TCP/IP connection breaks the software stops giving updates. This reduces the value of the software significantly because we are all laptop users doing frequent docks and undocks. I really hope Microsoft addresses this in the next release of the Power Tools.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Another way to bring focus to the team is to show the build status on a big screen next to the coffee machine. Lately, I have been developing such software.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;   &lt;/p&gt;&lt;p&gt;The software continuously pools the Team Foundation Server for updates on the latest builds and shows the results. When the build fails the status is observed by a coffee thirst team member.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Enjoy!&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-1511083980360207996?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/1511083980360207996/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/02/buildwatcher-continuously-keeping-eye.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/1511083980360207996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/1511083980360207996'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/02/buildwatcher-continuously-keeping-eye.html' title='BuildWatcher – continuously keeping an eye on your continuous integration builds'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_BzMG_Iux85s/SY_r18yToBI/AAAAAAAAAIk/Mol_mXiCVqQ/s72-c/BuildWatcher.PNG' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-2431663893412380129</id><published>2009-02-08T14:09:00.001-08:00</published><updated>2009-02-09T00:41:41.767-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='team foundation server'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>Matlab Compiler and Team Foundation Build</title><content type='html'>&lt;span xmlns=""&gt;&lt;p&gt;At my company, we have many internal tools written in Matlab, which is an interpreted language. Until recently these programs were distributed as source code, and the user was required to have Matlab installed on the computer. This made it very easy for the user to do modifications to the program in order to make it fit his needs and fix bugs. Unfortunately, this also meant that many users changed the source code without using source control. Furthermore, bugs were often just fixed locally and never reported back to the maintainers of the software. Thus, the robustness of the software did not improve very much, and each of the changes would have to be manually merged each time they upgraded the software. The result was that the software was "never" upgraded once installed.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;To mitigate some of these concerns, I decided to use the Matlab Compiler to make an executable of the program and shipping this executable instead of the source code. This meant that the users were forced to use an official version, and thus that all the bugs were fixed once and for all.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Unfortunately, the build process requires a few steps making it error prone. The build process has to figure out which files to compile in the executable, and in some cases the algorithm misses a file. In such cases the program will not work.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;After successfully applying continuous integration to other C#-based projects I was wondering if it would be possible to use the same practice here as well. I figured out that I could start the .bat file I had used for generating the executable directly from the msbuild script. I was thinking about doing some unit testing as well, and it would be nice to run the tests as part of the build process. I managed to do this by compiling the unit test as a separate executable. The executable was then started from the msbuild script.&lt;br /&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;  &amp;lt;Target Name="AfterTest"&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;    &amp;lt;Exec Command="$(OutDir)\MyApp_test" /&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;  &amp;lt;/Target&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;By ending the build code by an assert statement that checked if the unit test run was successful, the exit code of the application would be non-zero when a unit test failed. By hocking the test up to the AfterTest target, the build gets a partial successful build when a test fails. This is the very same way as MSTest works in Team Foundation Build.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;To summarize, I had the continuous integration framework up-n-running in a few hours. I guess this is also relevant for other languages as well.&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-2431663893412380129?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/2431663893412380129/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/02/matlab-compiler-and-team-foundation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/2431663893412380129'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/2431663893412380129'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/02/matlab-compiler-and-team-foundation.html' title='Matlab Compiler and Team Foundation Build'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9004133820714851517.post-9203565714152888723</id><published>2009-02-08T13:42:00.001-08:00</published><updated>2009-02-08T13:42:51.402-08:00</updated><title type='text'>Welcome to my new blog on agile practices</title><content type='html'>&lt;span xmlns=''&gt;&lt;p&gt;I am a big fan of agile practices. In this blog I will share some of my experiences made in my work. Two of the practices I have been working much on implemented are continuous integration and test driven development. Expect that this blog will provide you with valuable lessons learned.&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9004133820714851517-9203565714152888723?l=agilepractice.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agilepractice.blogspot.com/feeds/9203565714152888723/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://agilepractice.blogspot.com/2009/02/welcome-to-my-new-blog-on-agile.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/9203565714152888723'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9004133820714851517/posts/default/9203565714152888723'/><link rel='alternate' type='text/html' href='http://agilepractice.blogspot.com/2009/02/welcome-to-my-new-blog-on-agile.html' title='Welcome to my new blog on agile practices'/><author><name>Meg</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
