<?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-34744747</id><updated>2011-12-18T18:56:19.393+01:00</updated><category term='Continous Integration'/><category term='Lean'/><category term='Team Foundation Server'/><category term='MOSS 2007'/><category term='XP'/><category term='windows 2008 R2'/><category term='SQL 2005'/><category term='methodology'/><category term='Formatting'/><category term='Rhino Mocks'/><category term='Visual Studio 2010'/><category term='User Stories'/><category term='windows 7'/><category term='Reporting'/><category term='DefaultDataPath'/><category term='Scripting'/><category term='5S'/><category term='TDD'/><category term='Code Coverage'/><category term='unit test'/><category term='Unity'/><category term='TargetDataBase'/><category term='TFS Warehouse'/><category term='WinForms'/><category term='2008'/><category term='.NET 2.0'/><category term='EPM'/><category term='reportserver'/><category term='Referenced Assemblies'/><category term='hyper-v'/><category term='BLOG'/><category term='Team Build'/><category term='Entlib'/><category term='TFS'/><category term='aop'/><category term='Code Contracts'/><category term='MVP'/><category term='Axapta; Business Connector'/><category term='principles'/><category term='MSBuild'/><category term='C#'/><category term='Webservices'/><category term='Buildstore'/><category term='Agile'/><category term='Database'/><category term='Sharepoint'/><category term='Scrum'/><category term='EF'/><category term='Patterns'/><category term='Mstest'/><category term='Continous Delivery'/><category term='project server 2007'/><category term='MDX'/><category term='Kaizen'/><category term='estimation'/><category term='Silverlight'/><title type='text'>Jelle Bens</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>57</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-34744747.post-9050988792490295762</id><published>2011-11-18T13:55:00.001+01:00</published><updated>2011-11-18T13:55:35.715+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scripting'/><title type='text'>Executing all SQL files in a folder</title><content type='html'>&lt;p&gt;SET dbName=RemmicomMeetingDb   &lt;br /&gt;SET sqlCmdCommand=sqlcmd -S . -E -i&lt;/p&gt;  &lt;p&gt;%sqlCmdCommand% &amp;quot;DropAndCreateDb.sql&amp;quot;&lt;/p&gt;  &lt;p&gt;FOR /F %%i IN ('dir /b /on *.sql') DO %sqlCmdCommand% %%i -d %dbName%&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-9050988792490295762?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/9050988792490295762/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=9050988792490295762' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/9050988792490295762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/9050988792490295762'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2011/11/set-dbnameremmicommeetingdb-set.html' title='Executing all SQL files in a folder'/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-743237938532737913</id><published>2011-11-07T23:44:00.000+01:00</published><updated>2011-11-08T17:49:01.042+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Continous Delivery'/><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='User Stories'/><title type='text'>Incremental Software Delivery</title><content type='html'>&lt;p&gt;What i see occur quite often is that User Stories are to big, resulting in work that is not done at the end of the sprint.&lt;/p&gt;  &lt;p&gt;Lets take a look at the story below:&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&lt;strong&gt;As&lt;/strong&gt; an office manager &lt;strong&gt;I would like to be able to&lt;/strong&gt; lookup contacts quickly &lt;strong&gt;so that I&lt;/strong&gt; can quickly find someone's contact details.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-ZazJ_zQ2VZ4/TrldFKSmRpI/AAAAAAAAAHM/SikirCswHEM/s1600-h/clip_image001%25255B1%25255D%25255B3%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image001[1]" border="0" alt="clip_image001[1]" src="http://lh4.ggpht.com/-CUzgOXGxcWg/TrldFmZAWfI/AAAAAAAAAHU/eLvUuXkS43Y/clip_image001%25255B1%25255D_thumb%25255B1%25255D.png?imgmax=800" width="442" height="265" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Acceptance criteria&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt; &lt;strong&gt;Given&lt;/strong&gt; an Office Manager enters &amp;quot;como&amp;quot; &lt;strong&gt;When&lt;/strong&gt; I press the search button Then he/she should see the contact details of everyone who's full name contains &amp;quot;como&amp;quot;&lt;/li&gt; &lt;/ul&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Given&lt;/strong&gt; an Office Manager enters&amp;quot;ce&amp;quot; &lt;strong&gt;When&lt;/strong&gt; I press the search button Then he/she should see the contact details off everyone's title containing &amp;quot;ce&amp;quot;&lt;/li&gt;    &lt;li&gt;...&lt;/li&gt; &lt;/ul&gt;  &lt;br /&gt;Now if we think about this for a second, we could start to break down the tasks as follows:  &lt;br /&gt;  &lt;ul&gt;   &lt;li&gt;Create the database tables&lt;/li&gt;    &lt;li&gt;Create the data access layer &lt;/li&gt;    &lt;li&gt;Create the DTO's&lt;/li&gt;    &lt;li&gt;Create the UI&lt;/li&gt;    &lt;li&gt;Create the service layer&lt;/li&gt; &lt;/ul&gt; If we stop and think about this a second it does not really make sense in a incremental delivery mindset. If you reflect on this from a Form Follows Function Perspective, that the shape of an object should be based upon its purpose. This is a faulty breakup of the feature we are trying to build, since we are going to make the purpose - storing the data in a database and then transfer it to a screen - take precedence over the function, searching contact details.  &lt;br /&gt;It makes more sense tobreak up the screen in functional components as shown below:  &lt;br /&gt;&lt;a href="http://lh6.ggpht.com/-DrRCZf-gTXQ/TrkWdhZmSEI/AAAAAAAAAGI/fZAXuvgt2js/s1600-h/clip_image002%25255B4%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://lh4.ggpht.com/-YcJ3Ps-wy38/TrkWeBUG0PI/AAAAAAAAAGQ/zEuA_kHwgrk/clip_image002_thumb%25255B1%25255D.png?imgmax=800" width="451" height="270" /&gt;&lt;/a&gt;  &lt;br /&gt;Then we could break the feature up as follows:  &lt;br /&gt;  &lt;ul&gt;   &lt;li&gt;Display Search Results&lt;/li&gt;    &lt;li&gt;Enter Search Criteria&lt;/li&gt;    &lt;li&gt;Display status message &amp;quot;x out of Y contacts&amp;quot;&lt;/li&gt; &lt;/ul&gt; This will require developers to shift there mind from &amp;quot;Horizontal thinking&amp;quot; - thinking in terms of technical layers, to vertical thinking - what I often refer to as &amp;quot;Slicing the Cake&amp;quot;. This enables you to incremental delivery of features and get earlier feedback.  &lt;br /&gt;The most important thing is the green grid displaying the search results. From a technical perspective this seems a bit weird, since we autmatically think that its not usable once we have hundreds of contacts. But this mindset is wrong, it is workable, whether its practical that is another thing.   &lt;br /&gt;If we would take this approach we could deliver the following screen to the Product Owner:  &lt;br /&gt;&lt;a href="http://lh5.ggpht.com/-8zUfuI42hBQ/TrkWevtNaRI/AAAAAAAAAGc/P6Vm5RUEYqI/s1600-h/clip_image003%25255B4%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image003" border="0" alt="clip_image003" src="http://lh4.ggpht.com/-j7DE2Qbe2nQ/TrkWfkPA7kI/AAAAAAAAAGk/5kju5iV1fsM/clip_image003_thumb%25255B1%25255D.png?imgmax=800" width="451" height="270" /&gt;&lt;/a&gt;  &lt;br /&gt;If he can get his hands on this he can allready take a look and maybe he could allready experience this bit of functionality and conclude he would like to add some fields to the grid like email and phone, that he did not think of immediately.  &lt;br /&gt;So an extra task is added to the story &amp;quot;Add email and phone fields to the grid&amp;quot;  &lt;br /&gt;In the meanwhile wile the product owner is allready playing around with the screen we can allready add the yellow part to the screen:  &lt;br /&gt;&lt;a href="http://lh5.ggpht.com/-cJcWWYOTCmc/TrkWgUem29I/AAAAAAAAAGs/FZiHJvwEDNY/s1600-h/clip_image004%25255B4%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://lh4.ggpht.com/-2sFLaF0QODg/TrkWhAW6LoI/AAAAAAAAAG0/UU_UV7rXzGw/clip_image004_thumb%25255B1%25255D.png?imgmax=800" width="440" height="273" /&gt;&lt;/a&gt;  &lt;br /&gt;This will enable very short continuous feedback loops, moreover working like this will help you deliver functionality sprint after sprint.  &lt;br /&gt;This is what the end result could look like  &lt;br /&gt;&lt;a href="http://lh4.ggpht.com/-HdAdZIpB4tY/TrkWhzIPYKI/AAAAAAAAAG4/mhXjEnG3Pj0/s1600-h/clip_image005%25255B4%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image005" border="0" alt="clip_image005" src="http://lh3.ggpht.com/-dGd36DcrQyA/TrkWid6EG8I/AAAAAAAAAHE/kpNsdHiqdT0/clip_image005_thumb%25255B1%25255D.png?imgmax=800" width="454" height="321" /&gt;&lt;/a&gt;  &lt;br /&gt;As you see apparently there was no more time for the status message at the bottom of the screen and this task has been removed from the story another change from the initial version is also the &amp;quot;Search&amp;quot; button.  &lt;br /&gt;Find here an overview of what was implemented and what was removed:  &lt;br /&gt;As an office manager I would like to lookup contacts quickly so that I can quickly find someone's contact details.  &lt;br /&gt;  &lt;ol&gt;   &lt;li&gt;Display search results: Done&lt;/li&gt; &lt;/ol&gt;  &lt;ol&gt;   &lt;li&gt;Enter Search Criteria: Done&lt;/li&gt; &lt;/ol&gt;  &lt;ol&gt;   &lt;li&gt;Display status message &amp;quot;x out y contacts&amp;quot;: removed&lt;/li&gt; &lt;/ol&gt;  &lt;ol&gt;   &lt;li&gt;Add phone and email fields to the grid: Done&lt;/li&gt; &lt;/ol&gt;  &lt;ol&gt;   &lt;li&gt;Filter results grid when typing text: Done&lt;/li&gt; &lt;/ol&gt;  &lt;ol&gt;   &lt;li&gt;Remove search button: Done&lt;/li&gt; &lt;/ol&gt; There is one caveat with this approach, business user tend to like alot to add stuff, but they really dislike removing stuff… But this is where the timebox principle kicks in, if for instance there would be no more time left than the 2 last tasks (tasks 5 and 6) than the Product Owner might still choose to accept the story as done and the Functionality could potentially be shipped.       &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-743237938532737913?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/743237938532737913/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=743237938532737913' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/743237938532737913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/743237938532737913'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2011/11/incremental-software-delivery.html' title='Incremental Software Delivery'/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/-CUzgOXGxcWg/TrldFmZAWfI/AAAAAAAAAHU/eLvUuXkS43Y/s72-c/clip_image001%25255B1%25255D_thumb%25255B1%25255D.png?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-5998742410320740897</id><published>2011-09-30T15:29:00.000+02:00</published><updated>2011-09-30T15:29:56.315+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><title type='text'>Scrum.org PSM II Certification</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-PAD-Fj-nCps/ToXEN1bn4qI/AAAAAAAAAFw/a3OVz7Jh7Po/s1600/PSMII_Logo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="91" src="http://4.bp.blogspot.com/-PAD-Fj-nCps/ToXEN1bn4qI/AAAAAAAAAFw/a3OVz7Jh7Po/s320/PSMII_Logo.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;I reached a major milestone and obtained my Professional Scrum Master Certification II last week.&amp;nbsp;A put alot of effort in it and it paid of.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-5998742410320740897?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/5998742410320740897/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=5998742410320740897' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/5998742410320740897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/5998742410320740897'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2011/09/scrumorg-psm-ii-certification.html' title='Scrum.org PSM II Certification'/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-PAD-Fj-nCps/ToXEN1bn4qI/AAAAAAAAAFw/a3OVz7Jh7Po/s72-c/PSMII_Logo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-8927594674673845005</id><published>2011-06-20T19:51:00.001+02:00</published><updated>2011-06-20T19:51:46.355+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Continous Integration'/><title type='text'>Something on Continuous Integration</title><content type='html'>&lt;p&gt;In the past I have been experiencing some weird practices concerning CI. In the following article I will outline some do's and don'ts when implementing continuous integration.&lt;/p&gt;  &lt;p&gt;First and foremost it is ok to break a build that is why the thing is there you know. Comparing the number of broken builds against the ones that don't break is not a good measure of quality instead measure the &lt;strong&gt;time to fix the build.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Do &lt;/strong&gt;Integrate static code analysis in your build like FxCop, Ndepend and Simian. Giving you early feedback on your code quality. If the tools give you warnings solve them as well. If you keep up on regular basis this will keep your code base clean.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Do &lt;/strong&gt;Integrate your Unit tests to run every build. Again providing early feedback on integration issues.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Do&lt;/strong&gt; provide visual feedback (Andon) that give people an immediate feedback when a build fails.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Don't&lt;/strong&gt; force developers to do a get latest, run all their unit tests and then check in. This is a waste of time. But when a build fails &lt;strong&gt;fix&lt;/strong&gt; &lt;strong&gt;it&lt;/strong&gt;! &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Don't&lt;/strong&gt; seek who broke the build. Something that is very common is that people are very eager to investigate who broke the build and pointing fingers. Instead look &lt;em&gt;what&lt;/em&gt; broke the build try to fix it, this will enhance collective code ownership.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Don't&lt;/strong&gt; check in, close your laptop and sprint out of the office. This practice kills team morale.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-8927594674673845005?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/8927594674673845005/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=8927594674673845005' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/8927594674673845005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/8927594674673845005'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2011/06/something-on-continuous-integration.html' title='Something on Continuous Integration'/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-8797513896235471210</id><published>2011-06-14T20:07:00.002+02:00</published><updated>2011-06-19T22:00:33.914+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><title type='text'>Determine Iteration Length</title><content type='html'>Something I come across quite often is that teams don't consciously determine the iteration length of their sprints. They usually take 2 weeks as some default length. This is not really the way to go… Lets see what criteria we can put forward to fine tune the iteration length.&lt;br /&gt;Here are the 3 major factors to consider:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Project Duration&lt;/li&gt;&lt;li&gt;End-User commitment (how available are they to provide feedback and input)&lt;/li&gt;&lt;li&gt;Maturity of the team&lt;/li&gt;&lt;/ul&gt;The shorter the project the shorter the sprints enabling to have more feedback cycles, minimizing the risk building the wrong thing. This however will require a significant amount of commitment of the stakeholders (weekly review meetings, availability to clarify and develop the product backlog with the Product Owner,...). Short sprints also have one big advantage they are more prone to fail… The reason why I see this as an advantage is that problems will surface more quickly, enabling your team to address them and thus further minimizing risk.&lt;br /&gt;The second factor is also quite important: are there end-users available to provide feedback and are they easily accessible? One thing to keep in mind is that people are not used to the fact they will have to be available for a project throughout its duration. In the past they participate in workshops in the beginning of a project and in acceptance testing testing near the end (oh sweet memories :))&lt;br /&gt;Finally you should consider how mature your team is. This means how experienced are they with agile practices such as Test Driven Development, Continuous integration, Test Automation, Collective Code Ownership (instead of finding out who broke the build, investigate and fix what broke the build), being cross technical (no specialist like the database guy, the UI guy, etc.). This however does not mean there is no room for specialists and that everybody has to be a generalist but everyone chips in where needed. A big obstacle are teams that divide work parallel with the layers instead of what i call "slicing the cake", this means implementing a feature from front to back, this will enable them to incremently deliver software.&lt;br /&gt;&lt;br /&gt;For more information see: Agile Estimation and Planning from Mike Cohn&lt;br /&gt;&lt;span&gt;&lt;iframe align="left" frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm.amazon.com/e/cm?t=jellebens-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=bpl&amp;amp;asins=0131479415&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;m=amazon&amp;amp;lc1=0000FF&amp;amp;bc1=CCCCCC&amp;amp;bg1=CCCCCC&amp;amp;f=ifr" style="align: left; height: 245px; padding-right: 10px; padding-top: 5px; width: 131px;"&gt;&lt;/iframe&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-8797513896235471210?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/8797513896235471210/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=8797513896235471210' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/8797513896235471210'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/8797513896235471210'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2011/06/determine-iteration-length.html' title='Determine Iteration Length'/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-6352663862154691388</id><published>2011-03-01T20:12:00.007+01:00</published><updated>2011-03-04T19:54:11.285+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EF'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='unit test'/><title type='text'>EF CTP5 And Unit Testing</title><content type='html'>Using Entity Framework Code First CTP5 its quite easy to write and unit test your repositories. However test should still be written against the mappings of the actual database. It would be best to split the tests that write to the database from the tests that read into a different class&lt;br /&gt;&lt;br /&gt;Just Create a class that inherits from &lt;em&gt;DropCreateDatabaseAlways&amp;lt;T&amp;gt; &lt;/em&gt;override the seed method to create insert the values you want.&lt;br /&gt;&lt;div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;"&gt;&lt;div id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; direction: ltr; text-align: left;"&gt;&lt;pre style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; background-color: white; direction: ltr; text-align: left;"&gt;&lt;span id="lnum1" style="color: #606060;"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; DBContextInitializer : DropCreateDatabaseAlways&amp;lt;EntityContext&amp;gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"&gt;&lt;span id="lnum2" style="color: #606060;"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; background-color: white; direction: ltr; text-align: left;"&gt;&lt;span id="lnum3" style="color: #606060;"&gt;   3:&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Seed(EntityContext context)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"&gt;&lt;span id="lnum4" style="color: #606060;"&gt;   4:&lt;/span&gt;     {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; background-color: white; direction: ltr; text-align: left;"&gt;&lt;span id="lnum5" style="color: #606060;"&gt;   5:&lt;/span&gt;         ProductDummies.GetAllProducts().ForEach(p =&amp;gt; context.Set&amp;lt;Product&amp;gt;().Add(p));&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"&gt;&lt;span id="lnum6" style="color: #606060;"&gt;   6:&lt;/span&gt;         context.Commit();&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; background-color: white; direction: ltr; text-align: left;"&gt;&lt;span id="lnum7" style="color: #606060;"&gt;   7:&lt;/span&gt;     }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"&gt;&lt;span id="lnum8" style="color: #606060;"&gt;   8:&lt;/span&gt; }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;And then put in your Unit Test Assembly the following method:&lt;br /&gt;&lt;br /&gt;&lt;div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;"&gt;&lt;div id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; direction: ltr; text-align: left;"&gt;&lt;pre style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; background-color: white; direction: ltr; text-align: left;"&gt;&lt;span id="lnum1" style="color: #606060;"&gt;   1:&lt;/span&gt; [ClassInitialize]&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"&gt;&lt;span id="lnum2" style="color: #606060;"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; ClassInitialize(TestContext context) {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; background-color: white; direction: ltr; text-align: left;"&gt;&lt;span id="lnum3" style="color: #606060;"&gt;   3:&lt;/span&gt;     DbDatabase.SetInitializer(&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; DBContextInitializer());&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"&gt;&lt;span id="lnum4" style="color: #606060;"&gt;   4:&lt;/span&gt; }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;If you then use an in memory database it will be fast. The best way to always start from a known state (and to avoid mstest concurrency problems is to put the following code in Your TestInitialize method:&lt;br /&gt;&lt;div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;"&gt;&lt;div id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; direction: ltr; text-align: left;"&gt;&lt;pre style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; background-color: white; direction: ltr; text-align: left;"&gt;&lt;span id="lnum1" style="color: #606060;"&gt;   1:&lt;/span&gt; [TestInitialize]&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"&gt;&lt;span id="lnum2" style="color: #606060;"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; TestInitialize()&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; background-color: white; direction: ltr; text-align: left;"&gt;&lt;span id="lnum3" style="color: #606060;"&gt;   3:&lt;/span&gt; {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"&gt;&lt;span id="lnum4" style="color: #606060;"&gt;   4:&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; key = Guid.NewGuid().ToString();&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; background-color: white; direction: ltr; text-align: left;"&gt;&lt;span id="lnum5" style="color: #606060;"&gt;   5:&lt;/span&gt;     TestContext.Properties.Add(DB_NAME_KEY, key);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"&gt;&lt;span id="lnum6" style="color: #606060;"&gt;   6:&lt;/span&gt;     repository = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Repository&amp;lt;Product&amp;gt;(key);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; background-color: white; direction: ltr; text-align: left;"&gt;&lt;span id="lnum7" style="color: #606060;"&gt;   7:&lt;/span&gt; }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;To delete put the following snippet in your TestCleanUp&lt;br /&gt;&lt;div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;"&gt;&lt;div id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; direction: ltr; text-align: left;"&gt;&lt;pre style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; background-color: white; direction: ltr; text-align: left;"&gt;&lt;span id="lnum1" style="color: #606060;"&gt;   1:&lt;/span&gt; [TestCleanup]&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"&gt;&lt;span id="lnum2" style="color: #606060;"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; TestCleanUp()&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; background-color: white; direction: ltr; text-align: left;"&gt;&lt;span id="lnum3" style="color: #606060;"&gt;   3:&lt;/span&gt; {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"&gt;&lt;span id="lnum4" style="color: #606060;"&gt;   4:&lt;/span&gt;     repository.Dispose();&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; background-color: white; direction: ltr; text-align: left;"&gt;&lt;span id="lnum5" style="color: #606060;"&gt;   5:&lt;/span&gt;     DbDatabase.Delete(TestContext.Properties[DB_NAME_KEY].ToString);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"&gt;&lt;span id="lnum6" style="color: #606060;"&gt;   6:&lt;/span&gt; }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-6352663862154691388?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/6352663862154691388/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=6352663862154691388' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/6352663862154691388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/6352663862154691388'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2011/03/ef-ctp5-and-unit-testing.html' title='EF CTP5 And Unit Testing'/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-8023753358131775433</id><published>2011-02-17T22:45:00.000+01:00</published><updated>2011-02-18T12:42:39.349+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unit test'/><title type='text'>Unit Testing ROI</title><content type='html'>&lt;p&gt;In my experience everybody knows for sure unit testing is a good thing. But then again it puzzles me why nobody is actually doing it... I think one of the biggest misconceptions is that everyone thinks that unit testing pays back &lt;em&gt;over time or in the long run&lt;/em&gt;. This is not true! There is a more immediate payback on your investment that pays off from the very first line of code! The returns on Unit Testing grow exponentially over time...&lt;/p&gt;  &lt;p&gt;All projects go relatively smooth the first few months until they reach a certain point where the skeletons start falling out of the closet... Regression bugs start to appear at an alarming rate, it takes longer to detect errors, more time is spent in the debugger than actually writing code, it gets harder to add new functionality,etc,...&lt;/p&gt;  &lt;p&gt;Unit testing will:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Reduce the time spent in the debugger&lt;/li&gt;    &lt;li&gt;Reduce time to test your code as a developer&lt;/li&gt;    &lt;li&gt;Enables you to refactor&lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Reduce the time spent in the debugger&lt;/h3&gt;  &lt;p&gt;if you consistently write (good) unit tests you will be focusing on smaller portions of your code and thus preventing you to have to step through your whole application. When running all your unit tests you will automatically see when you break existing functionality, like this you will hunt down the likely cause a lot quicker (probably it was that last bit of code you changed). &lt;/p&gt;  &lt;h3&gt;Reduce time to test your code as a developer&lt;/h3&gt;  &lt;p&gt;When you unit test your code those little forms with one &amp;quot;test&amp;quot; button will be of the past. An other thing which will save you tremendous amounts of time is that it is no longer needed to step through a series of screens before you actually get to the functionality you want to test.&lt;/p&gt;  &lt;h3&gt;Enabling refactoring&lt;/h3&gt;  &lt;p&gt;If you have unit tests you can refactor those methods and classes that grow an keep growing... Everybody knows these little black holes in any application that are a pain to modify and every team member is reluctant to make modifications out of fear to break something else.&lt;/p&gt;  &lt;p&gt;NDepend Enables you to quickly identify where problems will start arising. Find below some useful queries.&lt;/p&gt;  &lt;h5&gt;Types that are to big and need to be slimmed down&lt;/h5&gt;  &lt;blockquote&gt;   &lt;p&gt;WARN IF Count &amp;gt; 0 IN SELECT TYPES WHERE      &lt;br /&gt;&amp;#160;&amp;#160; NbLinesOfCode &amp;gt; 500 OR      &lt;br /&gt;&amp;#160;&amp;#160; NbILInstructions &amp;gt; 3000      &lt;br /&gt;&amp;#160;&amp;#160; ORDER BY NbLinesOfCode DESC      &lt;br /&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;for more information: &lt;a title="http://www.ndepend.com/Metrics.aspx#NbLinesOfCode" href="http://www.ndepend.com/Metrics.aspx#NbLinesOfCode"&gt;http://www.ndepend.com/Metrics.aspx#NbLinesOfCode&lt;/a&gt;&lt;/p&gt;  &lt;h5&gt;Methods that are to big or to complex&lt;/h5&gt;  &lt;blockquote&gt;   &lt;p&gt;WARN IF Count &amp;gt; 0 IN SELECT METHODS WHERE      &lt;br /&gt;&amp;#160; ILCyclomaticComplexity &amp;gt; 40 AND       &lt;br /&gt;&amp;#160; ILNestingDepth &amp;gt; 4 &lt;/p&gt;    &lt;p&gt;OR NbLinesOfCode &amp;gt; 50 //Can even be smaller     &lt;br /&gt;&amp;#160; ORDER BY ILCyclomaticComplexity DESC&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;for more information: &lt;a title="http://www.ndepend.com/Metrics.aspx#ILCC" href="http://www.ndepend.com/Metrics.aspx#ILCC"&gt;http://www.ndepend.com/Metrics.aspx#ILCC&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-8023753358131775433?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/8023753358131775433/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=8023753358131775433' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/8023753358131775433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/8023753358131775433'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2011/02/unit-testing-roi.html' title='Unit Testing ROI'/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-1363184527960666376</id><published>2011-02-03T23:19:00.000+01:00</published><updated>2011-02-08T17:20:48.665+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Code Contracts'/><title type='text'>C# 4.0 Code Contracts:</title><content type='html'>&lt;h3&gt;&lt;strong&gt;&lt;font color="#ff6633" face="Trebuchet MS"&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/h3&gt; I was trying out the code contracts in C# 4.0 and came across something quite surprising every time I ran my unit tests I got an annoying message box popping up “Assert Failure”, Description must use the rewriter when using Contract.Requires&amp;lt;TException&amp;gt;.   &lt;p&gt;After some googling around I found that in Project Properties you need to find the code contracts tab and set “Perform Runtime Contract Checking” to full. &lt;/p&gt;  &lt;p&gt;I opened my project properties I realized I did not have the Code Contracts tab… So in order to enable this tab you will need to install Code Contracts from DevLabs (here: &lt;a title="http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx" href="http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx"&gt;http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;Rebuild and he complained about the Assembly Mode Setting not being appropiate. After Changing it I could run my tests without having to click every time a testmethod came in the method that had the contract.&lt;/p&gt;  &lt;p&gt;Problem solved!&lt;/p&gt;  &lt;h3&gt;Interface Contracts&lt;/h3&gt;  &lt;p&gt;One problem I came across is that when trying Interface contracts I had an assembly that ended in Contracts and apparently it does not work (Code Contracts will compile its contracts in a assembly named &amp;lt;assembly name&amp;gt;.Contracts.dll. I renamed the assembly to IContracts and everything worked as expected&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-1363184527960666376?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/1363184527960666376/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=1363184527960666376' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/1363184527960666376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/1363184527960666376'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2011/02/c-40-code-contracts.html' title='C# 4.0 Code Contracts:'/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-1986728902109511301</id><published>2011-01-19T23:21:00.003+01:00</published><updated>2011-09-28T11:21:17.313+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lean'/><title type='text'>Lean Principle: Eliminate Waste (Muda)</title><content type='html'>&lt;p&gt;In The Toyota Production System Taiichi Ohno says that capacity = work + waste. And that one should strive for absolute elimination of waste. When&amp;#160; you are thinking about the absolute elimination of waste one should always keep the following 2 points in mind:    &lt;br /&gt;&lt;em&gt;1. Improving efficiency makes sense only when it is tied to cost reduction. To achieve this, we have to start producing only the things we need using minimum manpower.      &lt;br /&gt;&lt;/em&gt;&lt;em&gt;2. Look at the efficiency of each operator and of each line. Then look at the operators as a group, and then at the efficiency of the entire plant. Efficiency must be improved at each step and, at the same time, for the plant as a whole.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;The efficiency can be quantified in the following fashion: efficiency =&amp;#160; work / cycle time.&lt;/p&gt;  &lt;p&gt;At Toyota they identified the 7 following types of waste:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Overproduction &lt;/li&gt;    &lt;li&gt;Unnecessary transportation &lt;/li&gt;    &lt;li&gt;Inventory &lt;/li&gt;    &lt;li&gt;Motion &lt;/li&gt;    &lt;li&gt;Defects &lt;/li&gt;    &lt;li&gt;Over-processing &lt;/li&gt;    &lt;li&gt;Waiting &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Now in order to eliminate waste we first need to identify waste. It is my experience that there are some recurring problems when in comes to developing software. When looking for waste we need to look at it at 3 different levels. In software developed we can look at it from a Team Member’s perspective, Team and process.&lt;/p&gt;  &lt;h3&gt;Overproduction&lt;/h3&gt;  &lt;blockquote&gt;   &lt;p&gt;Overproduction happens each time you engage more resources than needed to deliver to your customer. For instance, large batch production, because of long change over time, exceeds the strict quantity ordered by the customer. For productivity improvement, operators are not required to produce more than the customer needs. Extra parts will be stored and not sold. Overproduction is the worst muda because it hides or generates all others, especially inventory.&lt;sup&gt;[&lt;i&gt;&lt;a href="http://en.wikipedia.org/wiki/Wikipedia:Citation_needed"&gt;citation needed&lt;/a&gt;&lt;/i&gt;]&lt;/sup&gt; Overproduction increases the amount of space needed for storing raw material as well as finished goods. It also requires a preservation system.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;In software production overproduction can be seen as developing features that are never going to be used. At XP2002 Jim Johnson of the Standish Group reported that a study on the functionality in software. The graph below clearly shows that 64% of the functionalities build is barely used! In the past I had a lot of discussions with my colleagues about this… If a customer asks something its not necessarily mean that he actually needs it. &lt;/p&gt;  &lt;p&gt;&lt;em&gt;“If I had asked people what they wanted, they would have said &lt;em&gt;faster horses&lt;/em&gt;”&lt;/em&gt;&lt;/p&gt;  &lt;p align="right"&gt;Henry Ford&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-9WvPJP55p48/ToLnC709QCI/AAAAAAAAAFo/xyTlRbe9-Ds/s1600-h/image%25255B3%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-Y8cHANNRqkg/ToLnDHUcVUI/AAAAAAAAAFs/Fb1h0GMdttE/image_thumb%25255B1%25255D.png?imgmax=800" width="453" height="285" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;One way to avoid this is to release as early and as often as possible. This enables immediate feedback from the actual end users. Overproduction is quite frequent in when the QA department is not a part of the team. Since in most companies the QA department usually has more work than it can cope with people try to produce large batches to send to them only adding to their workload hiding possible defects. In the past I worked closely with a development team to enable them to release multiple versions a day to the test environment. This immensely improved the quality. &lt;/p&gt;  &lt;p&gt;Something that pays of (with interest) is to invest in your deployment strategy and not wait until the very last moment. I have seen it to many times that this is neglected and every time a new environment needs to be deployed it takes a lot of manual manipulations of various configuration settings making deployment a very erroneous activity. To counter this people would only release large batches of bug fixes and features. This obfuscates a lot of problems like a bug that works on a developers machine but not on an other environment. In the worst case these problems only show up when deploying to the production environment&amp;#160; -since in most companies this is done by different people who are not aware of configuration changes for example – causing downtime.&lt;/p&gt;  &lt;h3&gt;Unnecessary transportation&lt;/h3&gt;  &lt;blockquote&gt;   &lt;p&gt;Each time a product is moved it stands the risk of being damaged, lost, delayed, etc. as well as being a cost for no added value. Transportation does not make any transformation to the product that the consumer is supposed to pay for.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;In software development the product is not only the piece of software we have written but more so the knowledge required to operate and write the software. &lt;/p&gt;  &lt;p&gt;According to Poppendieck transportation are handoffs of knowledge . When transferring knowledge from one person to another the most effective way of doing this is by face to face communication. far less effective – in declining order – are phone calls, emails and documentation. Examples of this are requirements documents, bug reports. This however does not mean it is a waste to write them, it means you have to keep them as lean as possible and facilitate communication between the people that have the knowledge.&lt;/p&gt;  &lt;p&gt;Even with face to face communication a lot of knowledge is lost. To quote Freud:&amp;#160; &lt;em&gt;“The things that go without saying are usually left unsaid…”&lt;/em&gt;. This can easily be perceived with playing a game somebody says a sentence to the person left of him who in his turn tells it to the person to his left and so on. Could be done in the form of “I am going on holiday and I take the following things with me:” and everyone adds one item to the sentence and the next person has to repeat the whole list, if he makes a mistake he can no longer participate in the game. See how long the list is before every one made a mistake, than compare it to your requirements documents.&lt;/p&gt;  &lt;p&gt;Other sources of waste can be branching (if its to complicated) since it also requires transportation. If you have to many branches the knowledge is lost every time you have to transport it from one branch to another. Integrate your code early and often! It is a lot better to merge your changes on a daily basis than on a 2 weekly basis!&lt;/p&gt;  &lt;h3&gt;Inventory&lt;/h3&gt;  &lt;blockquote&gt;   &lt;p&gt;Inventory, be it in the form of raw materials, work-in-progress (WIP), or finished goods, represents a capital outlay that has not yet produced an income either by the producer or for the consumer. Any of these three items not being actively processed to add value is waste.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Take for example&amp;#160; a developer sends of some code to the deployment team who has the responsibility to deploy to the test environment than from the developer’s perspective the work is done. Then its somewhere in the queue of the deployment team waiting to get in the queue of the test team, building up inventory. Then when the testing team finally got round to testing it they discover some bugs and the functionality needs to be reworked. This largely depends on the teams definition of done. If an impaired Definition is used a team will never reach an hyper productive state. This is usually reflected in Acceptance testing cycles only just before each release (encompassing several iterations).&lt;/p&gt;  &lt;p&gt;To avoid inventory to build up remove impediments and allot some time to “Groom” the backlog (e.g. Remove items from the backlog that are older than 16 weeks). This is a very hard concept for people to understand but don’t build up inventories. If a backlog is consistently prioritized the items older than a certain period nobody will probably remember them after one year anyhow. &lt;/p&gt;  &lt;h3&gt;Motion&lt;/h3&gt;  &lt;blockquote&gt;   &lt;p&gt;As compared to Transportation, Motion refers to the producer, worker or equipment. This has significance to damage, wear and safety. It also includes the fixed assets and expenses incurred in the production.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This can be taken quite literally. One of the biggest tips I can give you is sit the Team together! This facilitates osmotic communication, the added value of removing physical distance is immense even with distances more than 2 meters. If somebody has to turn or get up from his desk to ask a team member a question he will not do it.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Osmotic communication means that information flows into the background hearing of members of the team, so that they pick up relevant information as though by osmosis. This is normally accomplished by seating them in the same room. Then, when one person asks a question, others in the room can either tune in or tune out, contributing to the discussion or continuing with their work&lt;/p&gt;    &lt;p align="right"&gt;&lt;font size="1"&gt;Cockburn 2004&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;A lot of teams underestimate the impact of context switching. The productivity of someone declines rapidly if he or she are combining multiple tasks. As the graph shows below multi tasking kills productivity. When someone is working on a single project his productivity is around 70% the remaining 30% is absorbed by something Mike Cohn good citizenship (socializing with colleagues, administrative duties, reading mails, …). This is in line with what Henrik Kniberg&lt;em&gt; &lt;/em&gt;calls “&lt;em&gt;Focus Factor&lt;/em&gt;”.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_exD50ja0NRg/TTdedQZPhsI/AAAAAAAAAD0/CdoDARRHQDE/s1600-h/image15.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_exD50ja0NRg/TTdedwSPsWI/AAAAAAAAAD4/oNZF4sHsn_k/image_thumb7.png?imgmax=800" width="457" height="264" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="1"&gt;Source: Steven C.Wheelwright and Kim B.Clark (1993), Revolutionizing Product Development: Quantum Leaps in Speed, Efficiency and Quality&lt;/font&gt; &lt;/p&gt;  &lt;h3&gt;Defects&lt;/h3&gt;  &lt;blockquote&gt;   &lt;p&gt;Whenever defects occur, extra costs are incurred reworking the part, rescheduling production, etc.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;When defects appear these need to be&amp;#160; detected and resolved as quickly as possible.&amp;#160; Find below a table of a the relative cost associated with the stage a defect is detected:&lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="2" width="450"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="268"&gt;         &lt;p&gt;Requirements development (Vision)&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="180"&gt;1x&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="268"&gt;Design (Writing the User Story)&lt;/td&gt;        &lt;td valign="top" width="180"&gt;2-3x&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="268"&gt;Construction (Development)&lt;/td&gt;        &lt;td valign="top" width="180"&gt;5-10x&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="268"&gt;System Or Acceptance Testing&lt;/td&gt;        &lt;td valign="top" width="180"&gt;8-20x&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="268"&gt;Production&lt;/td&gt;        &lt;td valign="top" width="180"&gt;68-110x&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="268"&gt;&amp;#160;&lt;/td&gt;        &lt;td valign="top" width="180"&gt;&amp;#160;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="268"&gt;&amp;#160;&lt;/td&gt;        &lt;td valign="top" width="180"&gt;&lt;font size="1"&gt;Boehm 1981; Grady 1999&lt;/font&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;Usually the primary goal of testing is to discover errors, but teams should strive to do testing to prevent errors. This is what XP, TDD and BDD propagate, all code flows from a test. Once you are a TDD adept like me there is no other way you want to write code. It is usually very hard to convince people about the added value of writing test code (they see it as wasted effort). Invest in automated test frameworks and/or tools. &lt;/p&gt;  &lt;p&gt;A great tool to signal an abnormality is some kind of “&lt;em&gt;Andon&lt;/em&gt;” a visual indication that something is wrong visible to the whole team. If a build fails the first thing anyone who notices this should Stop what he is doing Fix the issue and investigate the root cause of the failure. And not look who checked in the last bit of code and points his finger in the direction of whoever caused the failure. Continuous Integration asks for a fair bit of discipline but is worth its weight in gold.&lt;a href="http://lh5.ggpht.com/_exD50ja0NRg/TTdeeTQEfkI/AAAAAAAAAD8/PaKbSAh1VQk/s1600-h/image6.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_exD50ja0NRg/TTdefGgdsHI/AAAAAAAAAEA/d47P_BuuQC8/image_thumb2.png?imgmax=800" width="476" height="332" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The purpose of continuous integration is not have a 100% success rate, studies have shown that the sweet spot is around 67% success rate to maximize productivity (according to Jeff Sutherland). Examples of Andon’s are for example CC tray, Team Build Notification, small tools running on an unused piece of hardware that is visible to everyone, lava lamps, traffic lights,… less obvious examples are Scrum/Kanban Boards.&lt;/p&gt;  &lt;p&gt;If an abnormality is detected it should be fixed &lt;strong&gt;immediately &lt;/strong&gt;otherwise the broken windows syndrome will kick in. This means that the defective state will be considered as a normal state.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Consider a building with a few broken windows. If the windows are not repaired, the tendency is for vandals to break a few more windows. Eventually, they may even break into the building, and if it's unoccupied, perhaps become squatters or light fires inside. &lt;/p&gt;    &lt;p&gt;Or consider a sidewalk. Some litter accumulates. Soon, more litter accumulates. Eventually, people even start leaving bags of trash from take-out restaurants there or breaking into cars.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="right"&gt;&lt;font size="1"&gt;Broken windows: James Q. Wilson and George L. Kelling (1982)&lt;/font&gt;&lt;/p&gt;  &lt;h3&gt;Over-processing&lt;/h3&gt;  &lt;blockquote&gt;   &lt;p&gt;Over-processing occurs any time more work is done on a piece than what is required by the customer. This also includes using tools that are more precise, complex, or expensive than absolutely required.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Spending more time on something does not necessarily augment the quality nor does it add value. Do just enough. Developers have a tendency to over engineer solutions – also known as gold plating. In my experience most often too much time is often spend on premature performance optimizations, trying to solve concurrency resulting in complex multithreading code that quite quickly become complex and buggy choking points in an application. I frequently encounter developers that suffer from the not invented here syndrome, writing their own data access logic, logging, user controls… These things have been done over and over again by people before them but they stubbornly believe they will do it better than the legions of developers before them.&lt;/p&gt;  &lt;p&gt;Writing code that can become useful in “future”. One thing they forget is that if you make this consistent behavior their might not be a future for your project. I always try to keep de following sentence in mind “Simple is already complicated enough”, or to quote Einstein “&lt;em&gt;Make things as simple as possible, but not simpler…&lt;/em&gt;”. &lt;/p&gt;  &lt;p&gt;Successfully delivering software projects are not achieved by writing code that is really cool to write but by just restricting yourself to the bare minimum to turn a requirement into a working bit of software. In the passed I was writing a kind of address book application that had to synchronize data from the ERP system to active directory. After struggling a few hours trying to write a windows service that had to run on regular intervals, I wound up writing a console application that I scheduled in the windows task scheduler.&lt;/p&gt;  &lt;p&gt;Another thing that falls under this category is writing unnecessary code. Whether you have been writing this code or the code is generated by a tool (Code generators, Snippets, T4 templates etc, etc,…) is all the same. If you have repetitive patterns in your code try to look at design patterns, object oriented principles whatever and refactor them out. Every line of code that gets into your code base is a line of code you &lt;strong&gt;drag&lt;/strong&gt; along for the rest of the life of the product. &lt;/p&gt;  &lt;h3&gt;Waiting&lt;/h3&gt;  &lt;blockquote&gt;   &lt;p&gt;Whenever goods are not in transport or being processed, they are waiting. In traditional processes, a large part of an individual product's life is spent waiting to be worked &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Waiting is an obvious waste, although an obvious one a very common source of waste and they reside very stubbornly in an organization or process. I can not count the times I heard there is nothing we can do about that, it always was this way. Although upon prying to the root cause no good reasons can be given to sustain these impediments. Often very strong indicators of suboptimal communication path ways by sending mails, filling out forms… Waiting occurs a lot in teams that do not successfully self organize or are not cross functional. Bottlenecks are often enforced by formal approval procedures, the lack of mandate by a team, lack of access to the QA department that has to perform Acceptance testing. These impediments can however be easily overcome by a simple value stream map which will quickly show bottlenecks in the process. &lt;/p&gt;  &lt;h3&gt;References&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;Agile estimation And planning by Mike Cohn &lt;/li&gt;    &lt;li&gt;Lean Software Development: From Concept To Cash by Mary and Tom Poppendieck &lt;/li&gt;    &lt;li&gt;The Toyota Production System by Taiichi Ohno &lt;/li&gt;    &lt;li&gt;Wikipedia &lt;/li&gt; &lt;/ul&gt;  &lt;br /&gt;&lt;iframe style="width: 131px; padding-right: 10px; height: 245px; padding-top: 5px; align: left" marginheight="0" src="http://rcm.amazon.com/e/cm?t=jellebens-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=bpl&amp;amp;asins=0321437381&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;m=amazon&amp;amp;lc1=0000FF&amp;amp;bc1=CCCCCC&amp;amp;bg1=CCCCCC&amp;amp;f=ifr" frameborder="0" marginwidth="0" scrolling="no" align="left"&gt;&lt;/iframe&gt;&lt;iframe style="width: 131px; padding-right: 10px; height: 245px; padding-top: 5px; align: left" marginheight="0" src="http://rcm.amazon.com/e/cm?t=jellebens-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=bpl&amp;amp;asins=0131479415&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;m=amazon&amp;amp;lc1=0000FF&amp;amp;bc1=CCCCCC&amp;amp;bg1=CCCCCC&amp;amp;f=ifr" frameborder="0" marginwidth="0" scrolling="no" align="left"&gt;&lt;/iframe&gt;&lt;iframe style="width: 131px; padding-right: 10px; height: 245px; padding-top: 5px; align: left" marginheight="0" src="http://rcm.amazon.com/e/cm?t=jellebens-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=bpl&amp;amp;asins=0915299143&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;m=amazon&amp;amp;lc1=0000FF&amp;amp;bc1=CCCCCC&amp;amp;bg1=CCCCCC&amp;amp;f=ifr" frameborder="0" marginwidth="0" scrolling="no" align="left"&gt;&lt;/iframe&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-1986728902109511301?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/1986728902109511301/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=1986728902109511301' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/1986728902109511301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/1986728902109511301'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2011/01/lean-principle-eliminate-waste-muda.html' title='Lean Principle: Eliminate Waste (Muda)'/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/-Y8cHANNRqkg/ToLnDHUcVUI/AAAAAAAAAFs/Fb1h0GMdttE/s72-c/image_thumb%25255B1%25255D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-8257162831933447621</id><published>2011-01-13T22:54:00.000+01:00</published><updated>2011-01-13T17:51:35.242+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reporting'/><category scheme='http://www.blogger.com/atom/ns#' term='Lean'/><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><category scheme='http://www.blogger.com/atom/ns#' term='TFS Warehouse'/><title type='text'>Lean Principle “See the whole”</title><content type='html'>&lt;p&gt;&lt;a href="http://lh5.ggpht.com/_exD50ja0NRg/TS8tiHsBDzI/AAAAAAAAADk/RoXQ0UzqGEA/s1600-h/clip_image0016.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image001" border="0" alt="clip_image001" align="right" src="http://lh4.ggpht.com/_exD50ja0NRg/TS8tiufWMZI/AAAAAAAAADo/omSDY7gdMPE/clip_image001_thumb3.png?imgmax=800" width="127" height="239" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The remaining work report showed a clear buildup in items that were “Ready to Test” indicating a bottleneck somewhere in the process. I was wondering what was going on… I was under the assumption that the tester did not have any time to test these items (he had some work with existing customers who had to generate some kind of annual reports, so I was waiting for this surge to end). But after asking the tester what was going on he was quite surprised and responded that he only had 12 items that were ready to test instead of the more than 40 shown in the report. After some asking around the root cause of the problem was that the development team did not release a version to the test environment yet so the tester was not able to test the other items. &lt;/p&gt;  &lt;p&gt;This example clearly shows that the reporting help you in making bottlenecks visible. However they don’t show you exactly what the root cause is. You always have to keep in mind to See the Whole.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-8257162831933447621?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/8257162831933447621/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=8257162831933447621' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/8257162831933447621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/8257162831933447621'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2011/01/lean-principle-see-whole.html' title='Lean Principle “See the whole”'/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_exD50ja0NRg/TS8tiufWMZI/AAAAAAAAADo/omSDY7gdMPE/s72-c/clip_image001_thumb3.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-2471207317324703136</id><published>2011-01-10T23:48:00.000+01:00</published><updated>2011-01-11T14:46:24.659+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reporting'/><category scheme='http://www.blogger.com/atom/ns#' term='Lean'/><category scheme='http://www.blogger.com/atom/ns#' term='Team Foundation Server'/><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><category scheme='http://www.blogger.com/atom/ns#' term='TFS Warehouse'/><title type='text'>Product Backlog Pareto</title><content type='html'>&lt;p&gt;Pareto analysis on Product Backlog Items and Bugs&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_exD50ja0NRg/TSxfLcgKgiI/AAAAAAAAADc/aI0nN4-NVyE/s1600-h/clip_image001%5B4%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image001" border="0" alt="clip_image001" src="http://lh4.ggpht.com/_exD50ja0NRg/TSxfLyLg0UI/AAAAAAAAADg/O5Pu0buH3Mw/clip_image001_thumb%5B1%5D.png?imgmax=800" width="469" height="360" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;This report helps you analyze the “health” of your backlog for more information:Implementing Lean Software Development: From Concept to Cash (page 170).&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-2471207317324703136?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/2471207317324703136/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=2471207317324703136' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/2471207317324703136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/2471207317324703136'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2011/01/product-backlog-pareto.html' title='Product Backlog Pareto'/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_exD50ja0NRg/TSxfLyLg0UI/AAAAAAAAADg/O5Pu0buH3Mw/s72-c/clip_image001_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-7363213831982320122</id><published>2010-12-27T23:39:00.004+01:00</published><updated>2010-12-29T10:54:31.076+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reporting'/><category scheme='http://www.blogger.com/atom/ns#' term='Lean'/><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><category scheme='http://www.blogger.com/atom/ns#' term='TFS Warehouse'/><title type='text'>Average Cycle Time of Workitems</title><content type='html'>&lt;p&gt;Find below a query that shows the average Cycle Time per state, you can store the results in a temporary table and join it to provide averages to help in value stream mapping. &lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_exD50ja0NRg/TRnOsZ6I8wI/AAAAAAAAADM/Chsms4hpSW0/s1600-h/image%5B3%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_exD50ja0NRg/TRnOtDYGG8I/AAAAAAAAADQ/FGiUrgPiVHA/image_thumb%5B1%5D.png?imgmax=800" width="452" height="336" /&gt;&lt;/a&gt; Cycle Time Per Sprint    &lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;a href="http://lh3.ggpht.com/_exD50ja0NRg/TRoLdxNh7kI/AAAAAAAAADU/S9BK1MCYY_k/s1600-h/image%5B4%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_exD50ja0NRg/TRoLeQLqJCI/AAAAAAAAADY/GReizaTNkmw/image_thumb%5B1%5D.png?imgmax=800" width="459" height="281" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The bulk of the work is done by the query below&lt;/p&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;WITH&lt;/span&gt; cteStateChange(rowId, tpId, wiId, [&lt;span class="kwrd"&gt;State&lt;/span&gt;], PrevState, UpdTime) &lt;span class="kwrd"&gt;AS&lt;/span&gt;(&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    &lt;span class="kwrd"&gt;SELECT&lt;/span&gt; Row_Number() &lt;span class="kwrd"&gt;OVER&lt;/span&gt;(&lt;span class="kwrd"&gt;Order&lt;/span&gt; &lt;span class="kwrd"&gt;by&lt;/span&gt; wi.TeamProjectSK, wi.System_id, wi.System_Rev) &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;        , wi.TeamProjectSK&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        , wi.System_Id&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        , wi.System_State&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        , wi.PreviousState &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        , wi.System_ChangedDate&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    &lt;span class="kwrd"&gt;FROM&lt;/span&gt; dbo.DimWorkItem wi&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;    &lt;span class="kwrd"&gt;INNER&lt;/span&gt; &lt;span class="kwrd"&gt;JOIN&lt;/span&gt; dbo.FactWorkItemHistory wih&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        &lt;span class="kwrd"&gt;ON&lt;/span&gt; wih.WorkItemSK = wi.WorkItemSK&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        &lt;span class="kwrd"&gt;AND&lt;/span&gt; wih.TeamProjectSK = wi.TeamProjectSK&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;    &lt;span class="kwrd"&gt;WHERE&lt;/span&gt; 1=1&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;    &lt;span class="kwrd"&gt;AND&lt;/span&gt; (wih.StateChangeCount = 1)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;)&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-7363213831982320122?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/7363213831982320122/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=7363213831982320122' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/7363213831982320122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/7363213831982320122'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2010/11/average-cycle-time-of-bugs-by-severity.html' title='Average Cycle Time of Workitems'/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_exD50ja0NRg/TRnOtDYGG8I/AAAAAAAAADQ/FGiUrgPiVHA/s72-c/image_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-3916399127883548051</id><published>2010-12-22T22:52:00.001+01:00</published><updated>2011-01-04T10:05:48.738+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lean'/><category scheme='http://www.blogger.com/atom/ns#' term='Team Foundation Server'/><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><category scheme='http://www.blogger.com/atom/ns#' term='reportserver'/><title type='text'>Visualize your workflow with Team Foundation Server</title><content type='html'>&lt;p&gt;I created a custom report for Team Foundation Sever 2010 to visualize your workflow in order to identify bottlenecks&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Identify bottle necks&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_exD50ja0NRg/TRN563lAeAI/AAAAAAAAAC4/wuDpK_q_mNE/s1600-h/image%5B3%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_exD50ja0NRg/TRN57TWGTaI/AAAAAAAAAC8/oJxLv27q078/image_thumb%5B1%5D.png?imgmax=800" width="459" height="304" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;This indicates a bottleneck in testing there is work stacking up for the QA department. &lt;/p&gt;  &lt;p&gt;This report will tell you at a glance where to take action.&lt;/p&gt;  &lt;h3&gt;Inspect Flow&lt;/h3&gt;  &lt;p&gt;As you see in the picture above no clear “steps” for committed are noticeable in the above chart. The chart below shows a more healthy example. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_exD50ja0NRg/TRN57zX2J_I/AAAAAAAAADA/ddKiplClrJ8/s1600-h/image%5B8%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_exD50ja0NRg/TRN58Vc1HSI/AAAAAAAAADE/B2HP40QF2g0/image_thumb%5B4%5D.png?imgmax=800" width="466" height="285" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;You also notice that there is an inventory of untested items building up. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-3916399127883548051?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/3916399127883548051/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=3916399127883548051' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/3916399127883548051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/3916399127883548051'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2010/12/visualize-your-workflow-with-team.html' title='Visualize your workflow with Team Foundation Server'/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_exD50ja0NRg/TRN57TWGTaI/AAAAAAAAAC8/oJxLv27q078/s72-c/image_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-7002876118946300732</id><published>2010-11-30T21:34:00.003+01:00</published><updated>2010-12-02T00:48:56.617+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Team Foundation Server'/><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><category scheme='http://www.blogger.com/atom/ns#' term='Team Build'/><title type='text'>Keep Assembly version same as build number</title><content type='html'>I have been struggling all afernoon with Team Foundation Server 2010 Custom Activities to keep the BuildNumber and the AssemblyVersions in Sync. &lt;br /&gt;Apperantly System.Version is not serializable so the value gets lost when going into the Run On Agent Sequence. &lt;br /&gt;As a startiong point I used the code of Ewald Hoffman. Original Article: &lt;a href="http://www.ewaldhofman.nl/post/2010/04/20/Customize-Team-Build-2010-e28093-Part-1-Introduction.aspx" title="http://www.ewaldhofman.nl/post/2010/04/20/Customize-Team-Build-2010-e28093-Part-1-Introduction.aspx"&gt;http://www.ewaldhofman.nl/post/2010/04/20/Customize-Team-Build-2010-e28093-Part-1-Introduction.aspx&lt;/a&gt;&lt;br /&gt;Step 1: Create the Version Generator (+ offcource the necessary unit tests &lt;img alt="Smile" class="wlEmoticon wlEmoticon-smile" src="http://lh5.ggpht.com/_exD50ja0NRg/TPbciW99KxI/AAAAAAAAACU/cNHhRz5ITLg/wlEmoticon-smile%5B2%5D.png?imgmax=800" style="border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none;" /&gt;)… &lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Linq;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   5:&amp;nbsp; &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; SharpSolutions.Tfs.Build.BuildTasks&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;{&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;sealed&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; AssemblyVersionGenerator: IAssemblyVersionGenerator&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        &lt;span class="rem"&gt;/// Generatas a new Assembly version&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        &lt;span class="rem"&gt;/// int the following format: Major.Minor.Build.Revision&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;        &lt;span class="rem"&gt;/// Major: same as current version&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        &lt;span class="rem"&gt;/// Minor: same as current version&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;        &lt;span class="rem"&gt;/// Build: 2 digit year since 2000* 1000 + day of year eg 10001 = Build run on 1 jan 2010&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;        &lt;span class="rem"&gt;/// Revision: seconds since midnight&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;param name="currentVersion"&amp;gt;used to retrieve current major and minor version&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;A new Assembly version&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; Version Generate(Version currentVersion)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;            &lt;span class="rem"&gt;//If we did not force now use the real now&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;            &lt;span class="rem"&gt;//O_o get it?&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;            DateTime now = ((IAssemblyVersionGenerator)&lt;span class="kwrd"&gt;this&lt;/span&gt;).Now == &lt;span class="kwrd"&gt;default&lt;/span&gt;(DateTime)? DateTime.Now: ((IAssemblyVersionGenerator)&lt;span class="kwrd"&gt;this&lt;/span&gt;).Now;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;            &lt;span class="kwrd"&gt;int&lt;/span&gt; major = currentVersion.Major;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;            &lt;span class="kwrd"&gt;int&lt;/span&gt; minor = currentVersion.Minor;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;            &lt;span class="kwrd"&gt;int&lt;/span&gt; build = (now.Year % 2000) * 1000 + now.DayOfYear;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;            &lt;span class="kwrd"&gt;int&lt;/span&gt; revision = (&lt;span class="kwrd"&gt;int&lt;/span&gt;)(now - &lt;span class="kwrd"&gt;new&lt;/span&gt; DateTime(now.Year, now.Month, now.Day, 0, 0, 0)).TotalSeconds / 10;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; Version(major, minor, build, revision);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;        DateTime IAssemblyVersionGenerator.Now { get; set; }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;2. Create a new Code Activity. Offcourse you can easily implement your own version of IAssemblyVersionGenerator &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;br /&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Activities;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.TeamFoundation.Build.Client;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.TeamFoundation.Build.Workflow.Activities;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; SharpSolutions.Tfs.Build.BuildTasks.Activities&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;{&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    [BuildActivity(HostEnvironmentOption.Controller)]&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;sealed&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; GenerateAssemblyNumber : CodeActivity&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; IAssemblyVersionGenerator versionGenerator = &lt;span class="kwrd"&gt;new&lt;/span&gt; AssemblyVersionGenerator();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;        [RequiredArgument]&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; InArgument&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; AssemblyInfoFileMask { get; set; }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;        [RequiredArgument]&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; InArgument&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; Version { get; set; }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;        [RequiredArgument]&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; InArgument&amp;lt;IBuildDetail&amp;gt; BuildDetail { get; set; }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;        &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Execute(CodeActivityContext context)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;            &lt;span class="kwrd"&gt;string&lt;/span&gt; assemblyInfoFileMask = context.GetValue(&lt;span class="kwrd"&gt;this&lt;/span&gt;.AssemblyInfoFileMask);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;            &lt;span class="kwrd"&gt;string&lt;/span&gt; version = context.GetValue(&lt;span class="kwrd"&gt;this&lt;/span&gt;.Version);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;            Version currentVersion = &lt;span class="kwrd"&gt;new&lt;/span&gt; Version(version);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;            Version newVersion = versionGenerator.Generate(currentVersion);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;            context.TrackBuildMessage(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;"New Version is {0}"&lt;/span&gt;, newVersion.ToString()));&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; newVersion.ToString();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Step 3: Update the version number in the AssemblyInfo.cs&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;br /&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Linq;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Activities;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text.RegularExpressions;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.IO;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.TeamFoundation.Build.Client&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.TeamFoundation.Build.Workflow.Activities;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; SharpSolutions.Tfs.Build.BuildTasks.Activities&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;    [BuildActivity(HostEnvironmentOption.Agent)]&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;sealed&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; UpdateAssemblyVersion : CodeActivity&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;        [RequiredArgument]&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; InArgument&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; VersionNumber { get; set; }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;        [RequiredArgument]&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; InArgument&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; AssemblyInfoFileMask { get; set; }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;        &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;        [RequiredArgument]&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; InArgument&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; SourcesDirectory { get; set; }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;        &lt;span class="rem"&gt;// If your activity returns a value, derive from CodeActivity&amp;lt;TResult&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;        &lt;span class="rem"&gt;// and return the value from the Execute method.&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Execute(CodeActivityContext context)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;            &lt;span class="rem"&gt;// Obtain the runtime value of the input arguments&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;            &lt;span class="kwrd"&gt;string&lt;/span&gt; sourcesDirectory = context.GetValue(&lt;span class="kwrd"&gt;this&lt;/span&gt;.SourcesDirectory);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;            &lt;span class="kwrd"&gt;string&lt;/span&gt; assemblyInfoFileMask = context.GetValue(&lt;span class="kwrd"&gt;this&lt;/span&gt;.AssemblyInfoFileMask);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;            Version newVersion = &lt;span class="kwrd"&gt;new&lt;/span&gt; Version(context.GetValue(&lt;span class="kwrd"&gt;this&lt;/span&gt;.VersionNumber));&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;            &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;            &lt;span class="rem"&gt;// Get all AssemblyInfo files&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt;            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (&lt;span class="kwrd"&gt;string&lt;/span&gt; file &lt;span class="kwrd"&gt;in&lt;/span&gt; Directory.EnumerateFiles(sourcesDirectory, assemblyInfoFileMask, SearchOption.AllDirectories))&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  36:  &lt;/span&gt;            {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  37:  &lt;/span&gt;                &lt;span class="rem"&gt;// Read the text from the AssemblyInfo file&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  38:  &lt;/span&gt;                &lt;span class="kwrd"&gt;string&lt;/span&gt; assemblyInfoVersionText = File.ReadAllText(file);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  39:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  40:  &lt;/span&gt;                &lt;span class="kwrd"&gt;string&lt;/span&gt; updatedContents = Utilities.UpdateAssemblyVersion(assemblyInfoVersionText, newVersion);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  41:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  42:  &lt;/span&gt;                File.WriteAllText(file, updatedContents);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  43:  &lt;/span&gt;            }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  44:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  45:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  46:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  47:  &lt;/span&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-7002876118946300732?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/7002876118946300732/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=7002876118946300732' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/7002876118946300732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/7002876118946300732'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2010/11/team-foundation-server-build-custom.html' title='Keep Assembly version same as build number'/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_exD50ja0NRg/TPbciW99KxI/AAAAAAAAACU/cNHhRz5ITLg/s72-c/wlEmoticon-smile%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-7232705673930195306</id><published>2010-11-29T11:49:00.001+01:00</published><updated>2010-12-28T14:48:11.093+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BLOG'/><category scheme='http://www.blogger.com/atom/ns#' term='Formatting'/><title type='text'>Formatting Source code for BLOG</title><content type='html'>&lt;p&gt;Reminder to myself since I always have to search for it over and over: &lt;a title="http://www.manoli.net/csharpformat/format.aspx" href="http://www.manoli.net/csharpformat/format.aspx"&gt;http://www.manoli.net/csharpformat/format.aspx&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-7232705673930195306?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/7232705673930195306/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=7232705673930195306' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/7232705673930195306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/7232705673930195306'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2010/11/formatting-source-code-for-blog.html' title='Formatting Source code for BLOG'/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-3986872895491272789</id><published>2010-11-29T11:24:00.001+01:00</published><updated>2010-12-28T14:51:14.581+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lean'/><category scheme='http://www.blogger.com/atom/ns#' term='Kaizen'/><category scheme='http://www.blogger.com/atom/ns#' term='5S'/><title type='text'>5S for .NET</title><content type='html'>&lt;p&gt;I just finished Implementing lean software development: From Concept to Cash. In chapter 8: Quality (page 192) We find the 5S’s for Java find below my interpretation for .NET.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Sort (Seiri)&lt;/strong&gt;: Reduce the size of the code base. Throw away everything that is not needed. Remove:&lt;/li&gt;&lt;/ul&gt;&lt;ol&gt;&lt;ol&gt;&lt;li&gt;Dead Code &lt;/li&gt;&lt;li&gt;Unused using statements&lt;/li&gt;&lt;li&gt;Unused references&lt;/li&gt;&lt;li&gt;Unused variables &lt;/li&gt;&lt;li&gt;Unused Methods &lt;/li&gt;&lt;li&gt;Unused Classes &lt;/li&gt;&lt;li&gt;Refactor redundant/duplicate code&lt;/li&gt;&lt;li&gt;Delete code in comments&lt;/li&gt;&lt;li&gt;Delete or fix Ignored Unit Tests&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Systematize (Seiton):&lt;/strong&gt; Organize projects and packages. Have a place for everything and everything in its place&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Resolve package dependency cycles&lt;/li&gt;&lt;li&gt;Minimize dependencies&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;strong&gt;Shine (Seiso):&lt;/strong&gt; Clean up. Problems are more visible when everything is neat and clean.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Resolve unit test failures (Pass rate should be 100%)&lt;/li&gt;&lt;li&gt;Improve unit test coverage (&amp;gt; 80%)&lt;/li&gt;&lt;li&gt;Improve Unit test performance&lt;/li&gt;&lt;li&gt;Check duration to run all tests&lt;/li&gt;&lt;li&gt;Resolve compiler warnings&lt;/li&gt;&lt;li&gt;Resolve TODO’s&lt;/li&gt;&lt;li&gt;Resolve FxCop Warnings&lt;/li&gt;&lt;li&gt;Refactor methods that are too long&lt;/li&gt;&lt;li&gt;Refactor methods where Cyclomatic Complexity &amp;gt; 10&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;strong&gt;Standardize (Seiketsu):&lt;/strong&gt; Once you get a clean slate, keep it that way. Reduce complexity over time to improve ease of maintenance.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Sustain (Shitsuke):&lt;/strong&gt; Use and follow standard procedures&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Integrate FxCop in daily build&lt;/li&gt;&lt;li&gt;Fail Continuous integration build on unit test failure (Gated Check ins)&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;p&gt;These criteria can easily be found using ndepend which is word its price in gold&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-3986872895491272789?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/3986872895491272789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=3986872895491272789' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/3986872895491272789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/3986872895491272789'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2010/11/5s-for-net.html' title='5S for .NET'/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-5742949796319178827</id><published>2010-11-24T19:41:00.001+01:00</published><updated>2010-11-24T19:42:20.073+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MDX'/><category scheme='http://www.blogger.com/atom/ns#' term='Team Foundation Server'/><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><title type='text'>Team Foundation Server 2010 MDX to exclude the weekends</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;pre&gt;WITH &lt;br /&gt;	SET [WeekDays]&lt;br /&gt;	AS Filter(&lt;br /&gt;			[Date].[Date].[Date]&lt;br /&gt;			, COUNT(WTD([Date].[Year - Week - Date Hierarchy])) &amp;lt;&amp;gt; 1&lt;br /&gt;			AND COUNT(WTD([Date].[Year - Week - Date Hierarchy])) &amp;lt;&amp;gt; 7&lt;br /&gt;		)&lt;br /&gt;&lt;br /&gt;	SET [DateRangeFrom]&lt;br /&gt;	AS FILTER([WeekDays]&lt;br /&gt;				, [WeekDays].CurrentMember.Member_Value &amp;gt;= CDATE(&amp;quot;11/17/2010&amp;quot;)&lt;br /&gt;				)&lt;br /&gt;&lt;br /&gt;SELECT {&lt;br /&gt;	[Measures].[Work Item Count],[Measures].[Revision Count]&lt;br /&gt;	&lt;br /&gt;}&lt;br /&gt;ON COLUMNS,{&lt;br /&gt;	[DateRangeFrom]&lt;br /&gt;//	[Date].[Date].[Date]&lt;br /&gt;//	, WTD([Date].[Year - Week - Date Hierarchy].CurrentMember)&lt;br /&gt;//	&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;ON ROWS&lt;br /&gt;FROM [Team System]&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-5742949796319178827?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/5742949796319178827/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=5742949796319178827' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/5742949796319178827'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/5742949796319178827'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2010/11/team-foundation-server-2010-mdx-to.html' title='Team Foundation Server 2010 MDX to exclude the weekends'/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-8639826483349188250</id><published>2010-08-10T22:56:00.000+02:00</published><updated>2010-08-12T00:46:21.389+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>TDD Example Write function that calcutates a Fibonacci number</title><content type='html'>Step 1:&lt;br /&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;[TestMethod]&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; FibonacciSequanceTest(){&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;   Func&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt; fib = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;   Assert.AreEqual(0, fib(0));&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt;Step 2:&lt;br /&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;[TestMethod]&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; FibonacciSequanceTest(){&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;   Func&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt; fib = (n) =&amp;gt; { &lt;span class="kwrd"&gt;return&lt;/span&gt; n; };&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;   Assert.AreEqual(0, fib(0));&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt;Wee first test case passed!&lt;br /&gt;Step 3: Adding another testcase&lt;br /&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;[TestMethod]&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; FibonacciSequanceTest(){&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    Func&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt; fib = (n) =&amp;gt; { &lt;span class="kwrd"&gt;return&lt;/span&gt; n; };&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    Assert.AreEqual(0, fib(0));&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    Assert.AreEqual(1, fib(1));&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt;Works again&lt;br /&gt;Step 4: Removing duplication in the asserts&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;[TestMethod]&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; FibonacciSequanceTest(){&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    Func&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt; fib = (n) =&amp;gt; { &lt;span class="kwrd"&gt;return&lt;/span&gt; n; };&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    &lt;span style="color: red;"&gt;Assert.AreEqual(0, fib(0));&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    &lt;span style="color: red;"&gt;Assert.AreEqual(&lt;strong&gt;1&lt;/strong&gt;, fib(1));&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt;Refactored gives:&lt;br /&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;[TestMethod]&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; FibonacciSequanceTest(){&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    Func&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt; fib = (n) =&amp;gt; {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; n;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    };&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    Dictionary&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt; fibonacciSequence = &lt;span class="kwrd"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt;{&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;                {0 , 0},&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;                {1 , 1},&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;            };&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (KeyValuePair&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt; row &lt;span class="kwrd"&gt;in&lt;/span&gt; fibonacciSequence)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        Assert.AreEqual(row.Value, fib(row.Key));&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt;Step 5: Adding another testcase&lt;br /&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;[TestMethod]&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; FibonacciSequanceTest(){&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    Func&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt; fib = (n) =&amp;gt; {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; n;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    };&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    Dictionary&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt; fibonacciSequence = &lt;span class="kwrd"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt;{&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;                {0 , 0},&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;                {1 , 1},&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;                {2 , 1},&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;            };&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (KeyValuePair&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt; row &lt;span class="kwrd"&gt;in&lt;/span&gt; fibonacciSequence)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;        Assert.AreEqual(row.Value, fib(row.Key));&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt;Woops test failed!&lt;br /&gt;Ok lets fix it:&lt;br /&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;[TestMethod]&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; FibonacciSequanceTest(){&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    Func&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt; fib = (n) =&amp;gt; {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (n &amp;lt; 2) &lt;span class="kwrd"&gt;return&lt;/span&gt; n;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;strong&gt;&lt;span style="color: red;"&gt;1&lt;/span&gt;&lt;/strong&gt;;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    };&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    Dictionary&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt; fibonacciSequence = &lt;span class="kwrd"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;                {0 , 0},&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;                {1 , 1},&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;                {2 , &lt;span style="color: red;"&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/span&gt;},&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;            };&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (KeyValuePair&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt; row &lt;span class="kwrd"&gt;in&lt;/span&gt; fibonacciSequence)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;        Assert.AreEqual(row.Value, fib(row.Key));&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt;Test Fixed! &lt;br /&gt;Step&amp;nbsp;6: Adding another test case and taking 2 steps at the time since 1 will never equal 2 but 1 = &lt;b&gt;2&lt;/b&gt;-1 and 2 = &lt;b&gt;3&lt;/b&gt;-1 and thus return n-1 will do the trick for now&lt;br /&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;[TestMethod]&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; FibonacciSequanceTest(){&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    Func&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt; fib = (n) =&amp;gt; {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (n &amp;lt; 2) &lt;span class="kwrd"&gt;return&lt;/span&gt; n;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; n - 1;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    };&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    Dictionary&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt; fibonacciSequence = &lt;span class="kwrd"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;                {0 , 0},&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;                {1 , 1},&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;                {2 , 1},&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;                {3 , 2}&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;            };&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (KeyValuePair&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt; row &lt;span class="kwrd"&gt;in&lt;/span&gt; fibonacciSequence)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;        Assert.AreEqual(row.Value, fib(row.Key));&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;}&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;/div&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;/div&gt;Step 7: adding 2 more test cases (since the next we add will work fine too :))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;[TestMethod]&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; FibonacciSequanceTest(){&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    Func&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt; fib = (n) =&amp;gt; {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (n &amp;lt; 2) &lt;span class="kwrd"&gt;return&lt;/span&gt; n;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; n - 1;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    };&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    Dictionary&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt; fibonacciSequence = &lt;span class="kwrd"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;                {0 , 0},&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;                {1 , 1},&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;                {2 , 1},&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;                {3 , 2},&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;                &lt;span style="color: lime;"&gt;{4 , 3},&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;                &lt;span style="color: red;"&gt;{5 , 5}&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;            };&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (KeyValuePair&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt; row &lt;span class="kwrd"&gt;in&lt;/span&gt; fibonacciSequence)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;        Assert.AreEqual(row.Value, fib(row.Key));&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt;Test Fails again (the test case marked in &lt;span style="color: red;"&gt;red&lt;/span&gt;&lt;span style="color: black;"&gt;)&lt;/span&gt;&lt;br /&gt;The solution (fast forwarded):&lt;br /&gt;Because 5 = 2 + 3&lt;br /&gt;From the testcases we can see that fib(3) = 2 and fib(4)=3&lt;br /&gt;And thus 5 = fib(3) + fib(4)&lt;br /&gt;3 = 5 - 2 and 4 = 5 - 1&lt;br /&gt;5 = n and this 5 = fib(n-2) + fib(n-1)&lt;br /&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;[TestMethod]&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; FibonacciSequanceTest(){&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    Func&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt; fib = (n) =&amp;gt; {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (n &amp;lt; 2) &lt;span class="kwrd"&gt;return&lt;/span&gt; n;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; fib(n - 1) + fib(n - 2);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    };&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    Dictionary&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt; fibonacciSequence = &lt;span class="kwrd"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;                {0 , 0},&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;                {1 , 1},&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;                {2 , 1},&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;                {3 , 2},&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;                {4 , 3},&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;                {5 , 5}&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;            };&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (KeyValuePair&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt; row &lt;span class="kwrd"&gt;in&lt;/span&gt; fibonacciSequence)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;        Assert.AreEqual(row.Value, fib(row.Key));&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt;Does not compile :( Error: use of unsigned variable&lt;br /&gt;The fix:&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;[TestMethod]&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; FibonacciSequanceTest(){&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    Func&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt; fib = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        fib = (n) =&amp;gt; {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (n &amp;lt; 2) &lt;span class="kwrd"&gt;return&lt;/span&gt; n;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; fib(n - 2) + fib(n - 1);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    };&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;    Dictionary&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt; fibonacciSequence = &lt;span class="kwrd"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt;{&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;                {0 , 0},&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;                {1 , 1},&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;                {2 , 1},&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;                {3 , 2},&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;                {4 , 3},&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;                {5 , 5}&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;            };&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (KeyValuePair&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt; row &lt;span class="kwrd"&gt;in&lt;/span&gt; fibonacciSequence)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;        Assert.AreEqual(row.Value, fib(row.Key));&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Et voila done!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-8639826483349188250?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/8639826483349188250/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=8639826483349188250' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/8639826483349188250'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/8639826483349188250'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2010/08/tdd-example-write-function-that.html' title='TDD Example Write function that calcutates a Fibonacci number'/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-3734770428505045292</id><published>2010-04-02T11:27:00.005+02:00</published><updated>2010-04-06T09:36:41.508+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='methodology'/><category scheme='http://www.blogger.com/atom/ns#' term='estimation'/><title type='text'>Software Estimation</title><content type='html'>McConnell suggests in "Rapid Development: Taming Wild Software Schedules"  that on large projecs the actual cost of coding and unit testing is 15% of the time spent.&lt;br /&gt;&lt;br /&gt;So for a software estimation a good rule of thumb is &lt;br /&gt;Analyse: 50%&lt;br /&gt;Build:   15%&lt;br /&gt;Test:    35%&lt;br /&gt;&lt;br /&gt;Jack Reeves takes another perspective on this he says that source code is actually a design document and that the compiling and unit testing is the building (construction). So we can conclude that Construction of Software is actually very cheap and in software the design is the most costly activity in contrast with manufacturing and construction (engineering) where construction is the most expensive activity.&lt;br /&gt;&lt;br /&gt;Source: Martin Fowler: http://martinfowler.com/articles/newMethodology.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-3734770428505045292?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/3734770428505045292/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=3734770428505045292' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/3734770428505045292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/3734770428505045292'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2010/04/software-estimation.html' title='Software Estimation'/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-6302612264515665185</id><published>2010-03-18T16:22:00.002+01:00</published><updated>2010-03-18T16:23:47.954+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='unit test'/><category scheme='http://www.blogger.com/atom/ns#' term='Mstest'/><title type='text'>Error when running tests: Unable to load one or more of the requested types</title><content type='html'>Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information..&lt;br /&gt;&lt;br /&gt;1. Clean the solution&lt;br /&gt;2. Close Visual studio&lt;br /&gt;3. Delete all the bin en obj folders&lt;br /&gt;4. Try again&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-6302612264515665185?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/6302612264515665185/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=6302612264515665185' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/6302612264515665185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/6302612264515665185'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2010/03/error-when-running-tests-unable-to-load.html' title='Error when running tests: Unable to load one or more of the requested types'/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-7149222154962929573</id><published>2010-03-15T14:01:00.003+01:00</published><updated>2010-03-15T14:05:27.547+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sharepoint'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS 2007'/><title type='text'>Sharepoint configuration wizard fails after sysprep</title><content type='html'>If you sysprep a machine on which you installed sharepoint and ran the configuration wizard and you try to run it again you get the following error (after you ran the sp_dopserver and sp_addserver stored procedures):&lt;br /&gt;&lt;br /&gt;03/05/2010 17:16:12  8  ERR                              Exception: System.ArgumentNullException: Value cannot be null.&lt;br /&gt;Parameter name: password&lt;br /&gt;   at Microsoft.SharePoint.Administration.SPProcessIdentity.Update()&lt;br /&gt;   at Microsoft.SharePoint.Administration.SPApplicationPool.Update()&lt;br /&gt;   at Microsoft.SharePoint.Administration.SPWebApplication.CreateDefaultInstance(SPWebService service, Guid id, String applicationPoolId, IdentityType identityType, String applicationPoolUsername, SecureString applicationPoolPassword, String iisServerComment, Boolean secureSocketsLayer, String iisHostHeader, Int32 iisPort, Boolean iisAllowAnonymous, DirectoryInfo iisRootDirectory, Uri defaultZoneUri, Boolean iisEnsureNTLM, Boolean createDatabase, String databaseServer, String databaseName, String databaseUsername, String databasePassword, SPSearchServiceInstance searchServiceInstance, Boolean isPaired, Boolean autoActivateFeatures)&lt;br /&gt;   at Microsoft.SharePoint.Administration.SPAdministrationWebApplication.CreateDefaultInstance(SqlConnectionStringBuilder administrationContentDatabase, SPWebService adminService, IdentityType identityType, String farmUser, SecureString farmPassword)&lt;br /&gt;   at Microsoft.SharePoint.Administration.SPFarm.CreateAdministrationWebService(SqlConnectionStringBuilder administrationContentDatabase, IdentityType identityType, String farmUser, SecureString farmPassword)&lt;br /&gt;   at Microsoft.SharePoint.Administration.SPFarm.CreateBasicServices(SqlConnectionStringBuilder administrationContentDatabase, IdentityType identityType, String farmUser, SecureString farmPassword)&lt;br /&gt;   at Microsoft.SharePoint.Administration.SPFarm.Create(SqlConnectionStringBuilder configurationDatabase, SqlConnectionStringBuilder administrationContentDatabase, IdentityType identityType, String farmUser, SecureString farmPassword)&lt;br /&gt;   at Microsoft.SharePoint.Administration.SPFarm.Create(SqlConnectionStringBuilder configurationDatabase, SqlConnectionStringBuilder administrationContentDatabase, String farmUser, SecureString farmPassword)&lt;br /&gt;   at Microsoft.SharePoint.PostSetupConfiguration.ConfigurationDatabaseTask.CreateOrConnectConfigDb()&lt;br /&gt;   at Microsoft.SharePoint.PostSetupConfiguration.ConfigurationDatabaseTask.Run()&lt;br /&gt;   at Microsoft.SharePoint.PostSetupConfiguration.TaskThread.ExecuteTask()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This is related to the fact that there are allready Application pools created. if you delete the earlier created applicaiton pools and websites you should be able to run the wizard without errors.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-7149222154962929573?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/7149222154962929573/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=7149222154962929573' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/7149222154962929573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/7149222154962929573'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2010/03/sharepoint-configuration-wizard-fails.html' title='Sharepoint configuration wizard fails after sysprep'/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-3680982327460027634</id><published>2010-03-11T14:49:00.006+01:00</published><updated>2010-03-12T15:28:53.775+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Axapta; Business Connector'/><title type='text'>Ax Business Connector .NET Unable to log on to Microsoft Dynamics AX.</title><content type='html'>LogonFailedException: Unable to log on to Microsoft Dynamics AX.&lt;br /&gt;&lt;br /&gt;Method signature&lt;br /&gt;public void LogonAs(&lt;br /&gt;    string user, &lt;br /&gt;    string domain, &lt;br /&gt;    NetworkCredential &lt;strong&gt;bcProxyCredentials&lt;/strong&gt;, &lt;br /&gt;    string company, &lt;br /&gt;    string language, &lt;br /&gt;    string objectServer, &lt;br /&gt;    string configuration&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;When using the logon as method of the Business Connector .NET you face a lot off issues. After searching on the net I found that almost everyone forces the bcProxyCredentials but actually this not the way it is supposed to be used. &lt;br /&gt;&lt;br /&gt;but here the MSDN documentation contains an error:&lt;br /&gt;&lt;quote&gt;&lt;br /&gt;bcProxyCredentials&lt;br /&gt;Credentials of the Business Connector Proxy user used to authenticate and enable the use of LogonAs.&lt;br /&gt;&lt;br /&gt;You can create a NetworkCredential object with the following code:&lt;br /&gt;&lt;br /&gt;System.Net.NetworkCredential creds = new System.Net.NetworkCredential(&lt;br /&gt;ADUserName, ADUserPassword, ADDomain)The NetworkCredential parameters must match the Business Connector Proxy user set in the Business Connector Proxy dialog box: To &lt;strong&gt;verify your settings go to the Administration pane, click Setup, click Security, and then select BusinessConnectorProxy.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;/quote&gt;&lt;br /&gt;the part in bold is wrong. If you open the client application got the Administration pane &gt; Security &gt; System Service Accounts and there you can set the Business Connector Proxy accound and you can perform the LogonAs method to imperonate another user.&lt;br /&gt;&lt;br /&gt;From the installation guide:&lt;br /&gt;&lt;quote&gt;&lt;br /&gt;Some components require that the .NET Business Connector be configured to connect to Microsoft Dynamics AX with a proxy account. The use of a proxy enables the .NET Business Connector to connect on behalf of Microsoft Dynamics AX users when authenticating with an AOS instance.&lt;br /&gt;&lt;/quote&gt;&lt;br /&gt;Next you should be able to use the LogonAs method to logon as any valid Axapta user&lt;br /&gt;&lt;br /&gt;Edit: if you want to use the user that is running the process as the proxy account pass null to the LogonAs method for the bcProxyCredentials parameter&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-3680982327460027634?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/3680982327460027634/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=3680982327460027634' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/3680982327460027634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/3680982327460027634'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2010/03/ax-business-connector-net-unable-to-log.html' title='Ax Business Connector .NET Unable to log on to Microsoft Dynamics AX.'/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-7486334021688065372</id><published>2010-03-05T12:13:00.003+01:00</published><updated>2010-03-05T12:17:46.215+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='windows 7'/><category scheme='http://www.blogger.com/atom/ns#' term='windows 2008 R2'/><category scheme='http://www.blogger.com/atom/ns#' term='hyper-v'/><title type='text'>Booting from a VHD</title><content type='html'>With windows 7 and windows 2008 it is possible to boot from a hyper-v virtual disk&lt;br /&gt;&lt;br /&gt;I usually set up an image with hyper-v and sysprep it then follow these steps to add it to your bootloader&lt;br /&gt;&lt;br /&gt;C:\Windows\system32&gt;bcdedit  /copy {current} /d "JELLE-DEV"&lt;br /&gt;The entry was successfully copied to &lt;strong&gt;{8208ac27-0bca-11df-8dbb-a0ef01535d7b}&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;Copy the GUID that is &lt;br /&gt;&lt;br /&gt;bcdedit /set {guid} device vhd=[locate]\image.vhd&lt;br /&gt;bcdedit /set {guid} osdevice vhd=[locate]\image.vhd&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-7486334021688065372?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/7486334021688065372/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=7486334021688065372' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/7486334021688065372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/7486334021688065372'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2010/03/booting-from-vhd.html' title='Booting from a VHD'/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-5611394403463302704</id><published>2010-03-03T11:40:00.003+01:00</published><updated>2010-03-04T10:56:36.715+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><title type='text'>Webcam access in Silverlight 4</title><content type='html'>Code snippet to show webcam capture in silverlight 4&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;CaptureDeviceConfiguration.RequestDeviceAccess();&lt;br /&gt;            CaptureSource _capture = &lt;span class="kwrd"&gt;new&lt;/span&gt; CaptureSource();&lt;br /&gt;                        _capture.VideoCaptureDevice = CaptureDeviceConfiguration.GetDefaultVideoCaptureDevice();&lt;br /&gt;            _capture.Start();&lt;br /&gt;            VideoBrush videoBrush = &lt;span class="kwrd"&gt;new&lt;/span&gt; VideoBrush();&lt;br /&gt;            videoBrush.Stretch = Stretch.Uniform;&lt;br /&gt;            videoBrush.SetSource(_capture);&lt;br /&gt;            rectVideo.Fill = videoBrush;&lt;br /&gt;            rectVideo.UpdateLayout();&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Getting the output and resizing it to have a format of a picture that can be used in a profile&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;_capture.AsyncCaptureImage(img =&amp;gt;&lt;br /&gt;    {&lt;br /&gt;        _capture.Stop();&lt;br /&gt;        TranslateTransform tt = &lt;span class="kwrd"&gt;new&lt;/span&gt; TranslateTransform();&lt;br /&gt;&lt;br /&gt;        tt.Y = -73.5;&lt;br /&gt;        tt.X = -125;&lt;br /&gt;        WriteableBitmap bitmap = &lt;span class="kwrd"&gt;new&lt;/span&gt; WriteableBitmap(70, 93);&lt;br /&gt;&lt;br /&gt;        bitmap.Render(rectVideo, tt);&lt;br /&gt;        bitmap.Invalidate();&lt;br /&gt;        frameImage.Source = bitmap;&lt;br /&gt;        _capture.Start();&lt;br /&gt;    });&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-5611394403463302704?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/5611394403463302704/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=5611394403463302704' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/5611394403463302704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/5611394403463302704'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2010/03/webcam-access-in-silverlight-4.html' title='Webcam access in Silverlight 4'/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-939723688635623079</id><published>2010-02-26T16:50:00.001+01:00</published><updated>2010-02-26T16:52:59.018+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MVP'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>MVP in asp .net / sharepoint</title><content type='html'>The view interface&lt;br /&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Linq;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; SharpSoutions.MVP&lt;br /&gt;{&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; IView&lt;br /&gt;    {&lt;br /&gt;         Model DataSource { get; set; }&lt;br /&gt;         &lt;span class="kwrd"&gt;void&lt;/span&gt; DataBind();&lt;br /&gt;         &lt;span class="kwrd"&gt;void&lt;/span&gt; UpdateModel();&lt;br /&gt;&lt;br /&gt;         &lt;span class="kwrd"&gt;event&lt;/span&gt; EventHandler Saved;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Linq;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; SharpSoutions.MVP.Domain;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; SharpSoutions.MVP&lt;br /&gt;{&lt;br /&gt;    [Serializable]&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Model&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; Person NewPerson { get; set; }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; Title[] Titles { get; set; }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The presenter&lt;br /&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Linq;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; SharpSoutions.MVP.Domain;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Diagnostics;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; SharpSoutions.MVP&lt;br /&gt;{&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Presenter&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; Data.IRepository&amp;lt;Title&amp;gt; titleRepository;&lt;br /&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; Data.IRepository&amp;lt;Person&amp;gt; personRepository;&lt;br /&gt;        &lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; Presenter(Data.IRepository&amp;lt;Title&amp;gt; titleRepository, Data.IRepository&amp;lt;Person&amp;gt; personRepository)&lt;br /&gt;        {&lt;br /&gt;            Trace.TraceInformation(&lt;span class="str"&gt;"Begin Presenter.Ctor"&lt;/span&gt;);&lt;br /&gt;            &lt;span class="kwrd"&gt;this&lt;/span&gt;.titleRepository = titleRepository;&lt;br /&gt;            &lt;span class="kwrd"&gt;this&lt;/span&gt;.personRepository = personRepository;&lt;br /&gt;            &lt;br /&gt;            &lt;span class="kwrd"&gt;this&lt;/span&gt;.Model = &lt;span class="kwrd"&gt;new&lt;/span&gt; Model();&lt;br /&gt;            &lt;span class="kwrd"&gt;this&lt;/span&gt;.Model.NewPerson = &lt;span class="kwrd"&gt;new&lt;/span&gt; Person();&lt;br /&gt;            Trace.TraceInformation(&lt;span class="str"&gt;"End Presenter.Ctor"&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; Model Model { get; set; }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; IView View { get; set; }&lt;br /&gt;&lt;br /&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="rem"&gt;/// Init populates the "static" data&lt;/span&gt;&lt;br /&gt;        &lt;span class="rem"&gt;/// These are the data that is shown in dropdown boxes etc&lt;/span&gt;&lt;br /&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="rem"&gt;/// &amp;lt;param name="mockView"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Init(IView view)&lt;br /&gt;        {&lt;br /&gt;            Trace.TraceInformation(&lt;span class="str"&gt;"Begin Presenter.Init"&lt;/span&gt;);&lt;br /&gt;            AttachView(view);&lt;br /&gt;            &lt;span class="kwrd"&gt;this&lt;/span&gt;.View.DataSource = &lt;span class="kwrd"&gt;this&lt;/span&gt;.Model;&lt;br /&gt;            &lt;br /&gt;            &lt;span class="kwrd"&gt;this&lt;/span&gt;.Model.Titles = &lt;span class="kwrd"&gt;this&lt;/span&gt;.titleRepository.Query();&lt;br /&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;this&lt;/span&gt;.View.DataBind();&lt;br /&gt;            Trace.TraceInformation(&lt;span class="str"&gt;"End Presenter.Init"&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; AttachView(IView view) {&lt;br /&gt;            &lt;span class="kwrd"&gt;this&lt;/span&gt;.View = view;&lt;br /&gt;            &lt;span class="kwrd"&gt;this&lt;/span&gt;.View.Saved += &lt;span class="kwrd"&gt;new&lt;/span&gt; EventHandler(View_Saved);&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;void&lt;/span&gt; View_Saved(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;        {&lt;br /&gt;            System.Diagnostics.Trace.TraceInformation(&lt;span class="str"&gt;"Begin Presenter.View_Saved"&lt;/span&gt;);&lt;br /&gt;            &lt;span class="kwrd"&gt;this&lt;/span&gt;.Save();&lt;br /&gt;            System.Diagnostics.Trace.TraceInformation(&lt;span class="str"&gt;"End Presenter.View_Saved"&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Save()&lt;br /&gt;        {&lt;br /&gt;            System.Diagnostics.Trace.TraceInformation(&lt;span class="str"&gt;"Begin Presenter.Save"&lt;/span&gt;);&lt;br /&gt;            &lt;span class="kwrd"&gt;this&lt;/span&gt;.View.UpdateModel();&lt;br /&gt;&lt;br /&gt;            personRepository.Update(&lt;span class="kwrd"&gt;this&lt;/span&gt;.Model.NewPerson);&lt;br /&gt;            System.Diagnostics.Trace.TraceInformation(&lt;span class="str"&gt;"End Presenter.Save"&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The View implementation&lt;br /&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Linq;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.UI;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.UI.WebControls;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; SharpSoutions.MVP.Domain;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; SharpSoutions.MVP.Web&lt;br /&gt;{&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; View : System.Web.UI.UserControl, IView&lt;br /&gt;    {&lt;br /&gt;        &lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; Model DataSource{&lt;br /&gt;            get {&lt;br /&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; (ViewState[&lt;span class="str"&gt;"d"&lt;/span&gt;] != &lt;span class="kwrd"&gt;null&lt;/span&gt;) {&lt;br /&gt;                    &lt;span class="kwrd"&gt;return&lt;/span&gt; (Model)ViewState[&lt;span class="str"&gt;"d"&lt;/span&gt;];&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            set {&lt;br /&gt;                ViewState[&lt;span class="str"&gt;"d"&lt;/span&gt;] = &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; DataBind()&lt;br /&gt;        {&lt;br /&gt;            System.Diagnostics.Trace.TraceInformation(&lt;span class="str"&gt;"Begin View.Databind"&lt;/span&gt;);&lt;br /&gt;            &lt;span class="kwrd"&gt;base&lt;/span&gt;.DataBind();&lt;br /&gt;&lt;br /&gt;            TitleDropDown.DataSource = &lt;span class="kwrd"&gt;this&lt;/span&gt;.DataSource.Titles;&lt;br /&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;this&lt;/span&gt;.DataSource.NewPerson.Title != &lt;span class="kwrd"&gt;null&lt;/span&gt;) {&lt;br /&gt;                TitleDropDown.SelectedValue = &lt;span class="kwrd"&gt;this&lt;/span&gt;.DataSource.NewPerson.Title.Id.ToString();    &lt;br /&gt;            }&lt;br /&gt;                        &lt;br /&gt;            TitleDropDown.DataTextField = &lt;span class="str"&gt;"Name"&lt;/span&gt;;&lt;br /&gt;            TitleDropDown.DataValueField = &lt;span class="str"&gt;"Id"&lt;/span&gt;;&lt;br /&gt;            TitleDropDown.DataBind();&lt;br /&gt;&lt;br /&gt;            nameTextbox.Text = &lt;span class="kwrd"&gt;this&lt;/span&gt;.DataSource.NewPerson.Name;&lt;br /&gt;            System.Diagnostics.Trace.TraceInformation(&lt;span class="str"&gt;"End View.Databind"&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; UpdateModel()&lt;br /&gt;        {&lt;br /&gt;            System.Diagnostics.Trace.TraceInformation(&lt;span class="str"&gt;"Begin View.UpdateModel"&lt;/span&gt;);&lt;br /&gt;            &lt;span class="kwrd"&gt;this&lt;/span&gt;.DataSource.NewPerson.Name = nameTextbox.Text;&lt;br /&gt;            ListItem selectedTitle = TitleDropDown.SelectedItem;&lt;br /&gt;            &lt;span class="kwrd"&gt;this&lt;/span&gt;.DataSource.NewPerson.Title = &lt;span class="kwrd"&gt;new&lt;/span&gt; Title { Id = &lt;span class="kwrd"&gt;int&lt;/span&gt;.Parse(selectedTitle.Value), Name = selectedTitle.Text };&lt;br /&gt;            System.Diagnostics.Trace.TraceInformation(&lt;span class="str"&gt;"End View.UpdateModel"&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;event&lt;/span&gt; EventHandler Committed;&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; SaveButton_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;        {&lt;br /&gt;            System.Diagnostics.Trace.TraceInformation(&lt;span class="str"&gt;"Begin View.SaveButton_Click"&lt;/span&gt;);&lt;br /&gt;            &lt;br /&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;this&lt;/span&gt;.Saved != &lt;span class="kwrd"&gt;null&lt;/span&gt;) {&lt;br /&gt;                &lt;span class="kwrd"&gt;this&lt;/span&gt;.Saved(&lt;span class="kwrd"&gt;this&lt;/span&gt;, EventArgs.Empty);&lt;br /&gt;            }&lt;br /&gt;            System.Diagnostics.Trace.TraceInformation(&lt;span class="str"&gt;"End View.SaveButton_Click"&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;event&lt;/span&gt; EventHandler Saved;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-939723688635623079?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/939723688635623079/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=939723688635623079' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/939723688635623079'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/939723688635623079'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2010/02/mvp-in-asp-net-sharepoint.html' title='MVP in asp .net / sharepoint'/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-3761031157091036208</id><published>2010-01-31T10:44:00.003+01:00</published><updated>2010-01-31T11:29:00.387+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='windows 7'/><title type='text'>Windows 7 RDP with blank password</title><content type='html'>I have a windows 7 HTPC setup atr home that is not part of my domain (in orderr if it reboots it reboots all by its self and dont ask for a password or ALT+CTRL+DELETE&lt;br /&gt;&lt;br /&gt;but I wanted to work on it with RDP. But when I connected I gotr the following error:&lt;br /&gt;"Logon failure: user account restriction. Possible reasons are blank passwords not allowed, logon hour restrictions, or a policy restriction has been enforced.". Even&lt;br /&gt;&lt;br /&gt;Solution: &lt;br /&gt;run secpol.msc /s and then under Security Settings -&gt; Local Policies -&gt; Security Options set the Accounts: Limit local account use of blank passwords to console logon only to disabled&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-3761031157091036208?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/3761031157091036208/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=3761031157091036208' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/3761031157091036208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/3761031157091036208'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2010/01/windows-7-rdp-with-blank-password.html' title='Windows 7 RDP with blank password'/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-602708933087014320</id><published>2010-01-19T11:39:00.003+01:00</published><updated>2010-01-31T11:30:22.499+01:00</updated><title type='text'>Developer Interview question samples</title><content type='html'>FizzBuzz example.&lt;br /&gt;&lt;br /&gt;A fizzbuzz is a small code sample/program that can be given to a developer to test his skills and knowledge about certain subjects&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Linq;&lt;br /&gt;using System.Text;&lt;br /&gt;&lt;br /&gt;namespace ConsoleApplication1 {&lt;br /&gt;    public class ClassA {&lt;br /&gt;        public override string ToString() {&lt;br /&gt;            return "Hello from class A";&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public class ClassB : ClassA {&lt;br /&gt;        public override string ToString() {&lt;br /&gt;            return "Hello from class B";&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public class ClassC : ClassB {&lt;br /&gt;        public override string ToString() {&lt;br /&gt;            return "Hello from class C";&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    class Program {&lt;br /&gt;        static void Main(string[] args) {&lt;br /&gt;        &lt;br /&gt;                        ClassA first = new ClassC();                        &lt;br /&gt;                        ClassC second = new ClassC();            &lt;br /&gt;                        ClassB third = (ClassB)second;            &lt;br /&gt;                        ClassA fourth = (ClassA)third;            &lt;br /&gt;                        object fifth = (object)fourth;            &lt;br /&gt;                        &lt;br /&gt;                        Console.WriteLine("1: " + first.ToString());           &lt;br /&gt;                        Console.WriteLine("2: " + second.ToString());           &lt;br /&gt;                        Console.WriteLine("3: " + third.ToString());          &lt;br /&gt;                        Console.WriteLine("4: " + fourth.ToString());          &lt;br /&gt;                        Console.WriteLine("5: " + fifth.ToString());            &lt;br /&gt;                        Console.ReadLine();        &lt;br /&gt;                }    &lt;br /&gt;        &lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-602708933087014320?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/602708933087014320/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=602708933087014320' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/602708933087014320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/602708933087014320'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2010/01/developer-interview-question-samples.html' title='Developer Interview question samples'/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-5619089737503507165</id><published>2009-12-17T11:28:00.002+01:00</published><updated>2009-12-17T11:32:09.719+01:00</updated><title type='text'>Heading to 2010</title><content type='html'>Soon we will be in 2010... and microsoft gave us some early new years presents...&lt;br /&gt;&lt;br /&gt;Currently playing around with:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Team Foundation Server 2010&lt;/li&gt;&lt;li&gt;Visual Studio 2010&lt;/li&gt;&lt;li&gt;Sharepoint 2010&lt;/li&gt;&lt;li&gt;Office 2010&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;All looks quite neat and some really cool features have been implemented... Top 5 things i like...&lt;br /&gt;- Linked workitems in TFS&lt;br /&gt;- Improved reporting in TFS&lt;br /&gt;- Support for TDD in VSTS&lt;br /&gt;- Improved support for sharepoint development in VSTS&lt;br /&gt;- BCS in sharepoint 2010&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-5619089737503507165?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/5619089737503507165/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=5619089737503507165' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/5619089737503507165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/5619089737503507165'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2009/12/heading-to-2010.html' title='Heading to 2010'/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-6666530008483776230</id><published>2009-09-11T17:19:00.002+02:00</published><updated>2009-09-11T17:25:55.738+02:00</updated><title type='text'>Is code coverage usefull for measuring software quality?</title><content type='html'>There is a lot of debate going on how much percentage should be attained. But first however is code coverage a good measurement or quality? In my personal opinion it is very usefull if an historical trend is kept. if coverage drops over time this migt be an indicator of issues tha are arising somewhere else... not enough time, quick and dirty hacks,...&lt;br /&gt;&lt;br /&gt;But how much is enough? this like almost everything in software development is offcourse it depends. I think it largely depends on the type of application you are building, if it is ver largely dependant on workflows and long running processes the significance is going to be less then when you are doing a lot of calculations. And offcourse code coverage does not cover 1 thing which is quite important and usually the root of all evil: missing requirements :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-6666530008483776230?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/6666530008483776230/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=6666530008483776230' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/6666530008483776230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/6666530008483776230'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2009/09/is-code-coverage-usefull-for-measuring.html' title='Is code coverage usefull for measuring software quality?'/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-7397546827089165496</id><published>2009-09-07T15:08:00.004+02:00</published><updated>2009-09-07T15:41:10.620+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Unity'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='aop'/><category scheme='http://www.blogger.com/atom/ns#' term='Entlib'/><title type='text'>Implementing INotifyPropertyChanged by using Unity Interception</title><content type='html'>This example uses Unity interception to be able to bind objects to a UI by just applying a [Notify] attribute to a property, this done by intercepting the call and propagating it to a INotifyPropertyChanged implementation.&lt;br /&gt;From MSDN:&lt;br /&gt;&lt;em&gt;&lt;span style="font-size:85%;"&gt;The INotifyPropertyChanged interface is used to notify clients, typically binding clients, that a property value has changed.&lt;br /&gt;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;Step 1 create an abstract class that encapsulates all the functionality we need.&lt;br /&gt;See below for a class diagram:&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_exD50ja0NRg/SqUIUwX1pYI/AAAAAAAAABc/cnklxEU8tZ4/s1600-h/binableobject.jpg"&gt;&lt;img style="WIDTH: 178px; HEIGHT: 310px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5378714482639218050" border="0" alt="" src="http://4.bp.blogspot.com/_exD50ja0NRg/SqUIUwX1pYI/AAAAAAAAABc/cnklxEU8tZ4/s320/binableobject.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Step 2 create the handler:&lt;br /&gt;NotifyPropertyChangedHandler which inherits from ICallHandler&lt;br /&gt;public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext) {&lt;br /&gt;&lt;br /&gt;IMethodReturn result = getNext()(input, getNext);&lt;br /&gt;&lt;br /&gt;if (!input.MethodBase.Name.StartsWith("set_")) return result;&lt;br /&gt;//Remov the set_ to get the property's name&lt;br /&gt;var propertyName = input.MethodBase.Name.Remove(0, 4);&lt;br /&gt;//invoke the modified property&lt;br /&gt;//maybe we should check if the target is indeed o BindableOjectBase ;)&lt;br /&gt;BindableObjectBase target = (BindableObjectBase)input.Target;&lt;br /&gt;((IBindableObject)target).Modified(propertyName);&lt;br /&gt;return result;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Step 3: Create the attribute&lt;br /&gt;Create a NotifyPropertyChangedAttribute class which inherits from HandlerAttribute&lt;br /&gt;create a default constructor:&lt;br /&gt;public NotifyPropertyChangedAttribute() {&lt;br /&gt;_CallHandler = new NotifyPropertyChangedHandler();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;override the folowing method&lt;br /&gt;public override ICallHandler CreateHandler(IUnityContainer container) {&lt;br /&gt;return _CallHandler;&lt;br /&gt;}&lt;br /&gt;Step 4: Setting up the UnityContainer:&lt;br /&gt;UnityContainer_Container = new UnityContainer();&lt;br /&gt;//Registring interception extension&lt;br /&gt;_Container.AddNewExtension&lt;interception&gt;();&lt;br /&gt;_Container.RegisterInstance&lt;t&gt;(instance);&lt;br /&gt;_Container.Configure&lt;interception&gt;().SetDefaultInterceptorFor&lt;t&gt;(new TransparentProxyInterceptor());&lt;br /&gt;var object container.Resolve&lt;t&gt;();&lt;br /&gt;&lt;br /&gt;the last step took a little time to get it working the way I wanted since DI usually works by injecting interface implementations but this was not what I wanted to do. Since interfaces define behaviour and properties have nothing to do with behaviour but with state.&lt;br /&gt;&lt;br /&gt;I will post the full source code later&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-7397546827089165496?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/7397546827089165496/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=7397546827089165496' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/7397546827089165496'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/7397546827089165496'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2009/09/implementing-inotifypropertychanged-by.html' title='Implementing INotifyPropertyChanged by using Unity Interception'/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_exD50ja0NRg/SqUIUwX1pYI/AAAAAAAAABc/cnklxEU8tZ4/s72-c/binableobject.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-2702232121364170637</id><published>2009-08-26T10:58:00.002+02:00</published><updated>2009-08-26T11:04:27.948+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sharepoint'/><title type='text'>call javascript form a sharepoint cutom toolbar</title><content type='html'>Here is a short code snippet which calls a javascript when you click a custom button in sharepoint. You should register the custom javascript through Page.ClientScript.&lt;br /&gt;&lt;br /&gt;//Load the custom button&lt;br /&gt;ToolBarButton printButton = (ToolBarButton)Page.LoadControl("~/_controltemplates/ToolBarButton.ascx");&lt;br /&gt;printButton.ImageUrl = "~/layout/image/print.png";&lt;br /&gt;//Here is where the magic happens&lt;br /&gt;printButton.NavigateUrl = "javascript:PrintPage()";&lt;br /&gt;&lt;br /&gt;ToolBar toolBar = (ToolBar)Page.LoadControl("~/_controltemplates/ToolBar.ascx");&lt;br /&gt;toolBar.Buttons.Controls.Add(printButton);&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-2702232121364170637?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/2702232121364170637/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=2702232121364170637' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/2702232121364170637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/2702232121364170637'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2009/08/call-javascript-form-sharepoint-cutom.html' title='call javascript form a sharepoint cutom toolbar'/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-8969447380181149504</id><published>2009-08-21T11:09:00.007+02:00</published><updated>2009-08-21T11:49:59.498+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='principles'/><category scheme='http://www.blogger.com/atom/ns#' term='Patterns'/><title type='text'>Symptoms of Rotting Design</title><content type='html'>There are four primary symptoms that tell us that our designs are rotting. They are not&lt;br /&gt;orthogonal, but are related to each other in ways that will become obvious. they are:&lt;br /&gt;rigidity, fragility, immobility, and viscosity.&lt;br /&gt;&lt;strong&gt;Rigidity&lt;/strong&gt;. Rigidity is the tendency for software to be difficult to change, even in simple ways. Every change causes a cascade of subsequent changes in dependent modules. What begins as a simple two day change to one module grows into a multiweek marathon of change in module after module as the engineers chase the thread of the change through the application.&lt;br /&gt;When software behaves this way, managers fear to allow engineers to fix non-critical&lt;br /&gt;problems. This reluctance derives from the fact that they don’t know, with any reliability, when the engineers will be finished. If the managers turn the engineers loose on such problems, they may disappear for long periods of time. The software design begins to take on some characteristics of a roach motel -- engineers check in, but they don’t check out.&lt;br /&gt;When the manager’s fears become so acute that they refuse to allow changes to software, official rigidity sets in. Thus, what starts as a design deficiency, winds up being adverse management policy.&lt;br /&gt;&lt;strong&gt;Fragility&lt;/strong&gt;. Closely related to rigidity is fragility. Fragility is the tendency of the software to break in many places every time it is changed. Often the breakage occurs in areas that have no conceptual relationship with the area that was changed. Such errors fill the hearts of managers with foreboding. Every time they authorize a fix, they fear that the software will break in some unexpected way.&lt;br /&gt;As the fragility becomes worse, the probability of breakage increases with time,&lt;br /&gt;asymptotically approaching 1. Such software is impossible to maintain. Every fix&lt;br /&gt;makes it worse, introducing more problems than are solved. Such software causes managers and customers to suspect that the developers have lost control of their software. Distrust reigns, and credibility is lost.&lt;br /&gt;&lt;strong&gt;Immobility&lt;/strong&gt;. Immobility is the inability to reuse software from other projects or from parts of the same project. It often happens that one engineer will discover that he needs a module that is similar to one that another engineer wrote. However, it also often happens that the module in question has too much baggage that it depends upon. After much work, the engineers discover that the work and risk required to separate the desirable parts of the software from the undesirable parts are too great to tolerate. And so the software is simply rewritten instead of reused.&lt;br /&gt;&lt;strong&gt;Viscosity&lt;/strong&gt;. Viscosity comes in two forms: viscosity of the design, and viscosity of the environment. When faced with a change, engineers usually find more than one way to make the change. Some of the ways preserve the design, others do not (i.e. they are hacks.) When the design preserving methods are harder to employ than the hacks, then the viscosity of the design is high. It is easy to do the wrong thing, but hard to do the right thing.&lt;br /&gt;Viscosity of environment comes about when the development environment is slow&lt;br /&gt;and inefficient. For example, if compile times are very long, engineers will be tempted to make changes that don’t force large recompiles, even though those changes are not optiimal from a design point of view. If the source code control system requires hours to check in just a few files, then engineers will be tempted to make changes that require as few check-ins as possible, regardless of whether the design is preserved.&lt;br /&gt;&lt;br /&gt;These four symptoms are the tell-tale signs of poor architecture. Any application that exhibits them is suffering from a design that is rotting from the inside out. But what causes that rot to take place?&lt;br /&gt;&lt;br /&gt;Source: Robert C. Martin (&lt;a href="http://www.objectmentor.com/"&gt;http://www.objectmentor.com/&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;How can we detect sofware rot before or while it is occuring? Under the motto "To prevent is better than to cure".&lt;br /&gt;The problem is that software roth rarely shows on the short term. I like to compare it to building a house... you build the basement and you realise its not level but level enough for now since your scope is quite limited. When you start building the ground floor you notice that it the problem is becoming more eminent, if after a while you construct more and more floors you will notice that your apartment block will eventually collapse but by then its too late to do something about it.&lt;br /&gt;&lt;br /&gt;Everybody knows this but how can we prevent this? I have seen this occur over and over again due to short term quick and dirty hacks and solutions because developers do nor succeed in managing expectations. The only thing you can be certain about in software is change! "It works for now" is imo the beginning of the end.&lt;br /&gt;&lt;br /&gt;How can we prevent this? By applying the SOLID principles:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;S&lt;/strong&gt;RP: Single Reponsibility Principle &lt;/li&gt;&lt;li&gt;&lt;strong&gt;O&lt;/strong&gt;CP: Open Closed Principle &lt;/li&gt;&lt;li&gt;&lt;strong&gt;L&lt;/strong&gt;SP: Liskov Substitution Principle &lt;/li&gt;&lt;li&gt;&lt;strong&gt;I&lt;/strong&gt;SP: Integration Segragation Principle &lt;/li&gt;&lt;li&gt;&lt;strong&gt;D&lt;/strong&gt;IP: Dependency Inversion Principle &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;For more information on this I would recommend Robert C. Martin's Agile Principles, Patterns and Practices in C#&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-8969447380181149504?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/8969447380181149504/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=8969447380181149504' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/8969447380181149504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/8969447380181149504'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2009/08/symptoms-of-rotting-design.html' title='Symptoms of Rotting Design'/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-7425645011600534627</id><published>2009-08-17T13:01:00.004+02:00</published><updated>2009-08-17T13:05:33.715+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sharepoint'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS 2007'/><title type='text'>Adding custom properties to Webparts in Sharepoint 2007</title><content type='html'>Apparently the syntax changed in MOSS 2007 to add custom properties to your web part in.&lt;br /&gt;&lt;br /&gt;Code below:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;[WebBrowsable(true)]&lt;br /&gt;[WebDisplayName("Connection string:")]&lt;br /&gt;[SPWebCategoryName("Data")]&lt;br /&gt;[WebPartStorage(Storage.Shared)]&lt;br /&gt;[WebDescription("Connectionstring")]&lt;br /&gt;[Personalizable(PersonalizationScope.Shared)]&lt;br /&gt;public string ConnectionString { get; set; }&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-7425645011600534627?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/7425645011600534627/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=7425645011600534627' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/7425645011600534627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/7425645011600534627'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2009/08/adding-custom-properties-to-webparts-in.html' title='Adding custom properties to Webparts in Sharepoint 2007'/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-4692089265178291813</id><published>2009-02-24T09:56:00.012+01:00</published><updated>2009-02-24T10:29:49.859+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Team Build'/><title type='text'>Team Build: Setting up workspaces</title><content type='html'>One of the errors you might encounter whilst using team build is the following:&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;The specified path, file name, or both are too long. The fully qualified file&lt;br /&gt;name must be less than 260 characters, and the directory name must be less than&lt;br /&gt;248 characters.&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;The guide here below will help you to avoid these. But you should also keep in mind not to make your folder structure to complex or too deep. You can group your projects in your solution using solution folders which are not reflected in your physical project location.&lt;br /&gt;&lt;strong&gt;&lt;em&gt;&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;Working Directory Build Agent&lt;br /&gt;&lt;/em&gt;&lt;/strong&gt;Set the working Directory for the Build Agent to a path that is not to long (e.g. C:\BuildWorkSpace\$(BuildDefinitionPath). Be aware to add the $(BuildDefinitionPath) variable in order for every build to be stored in a unique location.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Note: this will be replacing the $(SourceDir) variable. (see below)&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://1.bp.blogspot.com/_exD50ja0NRg/SaO8PjA1sXI/AAAAAAAAABM/VdAl6jrtzC8/s1600-h/BuildAgent.jpg"&gt;&lt;img style="WIDTH: 320px; HEIGHT: 307px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5306291761255395698" border="0" alt="" src="http://1.bp.blogspot.com/_exD50ja0NRg/SaO8PjA1sXI/AAAAAAAAABM/VdAl6jrtzC8/s320/BuildAgent.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;Source Control Folder&lt;br /&gt;&lt;/em&gt;&lt;/strong&gt;Set the source control folder correctly to the folder containing the solution file.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://4.bp.blogspot.com/_exD50ja0NRg/SaO7i0a_n4I/AAAAAAAAABE/tDHdhbs_-18/s1600-h/Workspaces.jpg"&gt;&lt;img style="WIDTH: 320px; HEIGHT: 224px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5306290992834387842" border="0" alt="" src="http://4.bp.blogspot.com/_exD50ja0NRg/SaO7i0a_n4I/AAAAAAAAABE/tDHdhbs_-18/s320/Workspaces.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;See below for Solution structure. Te solution root is the parent folder where the solution resides.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;a href="http://2.bp.blogspot.com/_exD50ja0NRg/SaO8tWt3z_I/AAAAAAAAABU/Me1do2feppE/s1600-h/SolutionRoot.jpg"&gt;&lt;img style="WIDTH: 240px; HEIGHT: 320px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5306292273350692850" border="0" alt="" src="http://2.bp.blogspot.com/_exD50ja0NRg/SaO8tWt3z_I/AAAAAAAAABU/Me1do2feppE/s320/SolutionRoot.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-4692089265178291813?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/4692089265178291813/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=4692089265178291813' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/4692089265178291813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/4692089265178291813'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2009/02/team-build-setting-up-workspaces.html' title='Team Build: Setting up workspaces'/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_exD50ja0NRg/SaO8PjA1sXI/AAAAAAAAABM/VdAl6jrtzC8/s72-c/BuildAgent.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-6417130829825186635</id><published>2009-01-13T22:31:00.004+01:00</published><updated>2009-01-14T11:00:29.729+01:00</updated><title type='text'>Team Build: Strong naming assemblies and Team Build</title><content type='html'>This article provides a great Walkthrough for using strongly named assemblies and Team Build in combination with Automated Unit Testing.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://ozgrant.com/2008/03/13/strong-name-your-assemblies-with-team-build-using-a-private-key/"&gt;http://ozgrant.com/2008/03/13/strong-name-your-assemblies-with-team-build-using-a-private-key/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;One additional problem I came across though is when you are running x64 make sure you disable the strong name verification as wel in x64 and x86 consoles!&lt;br /&gt;&lt;br /&gt;sn -Vr *,7f668b9f3b05cdd1&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-6417130829825186635?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/6417130829825186635/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=6417130829825186635' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/6417130829825186635'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/6417130829825186635'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2009/01/team-build-strong-naming-assemblies-and.html' title='Team Build: Strong naming assemblies and Team Build'/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-6167665638289590896</id><published>2009-01-13T18:16:00.004+01:00</published><updated>2009-01-13T19:19:38.430+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Code Coverage'/><category scheme='http://www.blogger.com/atom/ns#' term='Team Build'/><title type='text'>Team Build: Enabling Code Coverage without using a test list</title><content type='html'>&lt;a href="http://2.bp.blogspot.com/_exD50ja0NRg/SWzWy2skoQI/AAAAAAAAAAs/kjvkG7uBrOQ/s1600-h/CodeCoverage.jpg"&gt;&lt;/a&gt;Modify the Test Arguments PropertyGroup to contain the RunConfigFile tag and point it to the correct location&lt;br /&gt;&lt;propertygroup&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;runconfigfile&gt;&amp;lt;RunConfigFile&amp;gt;$(SolutionRoot)\01 Dev\Sharpsolutions.SharpMoney\LocalTestRun.testrunconfig&amp;lt;/RunConfigFile&amp;gt;&lt;/runconfigfile&gt;&lt;br /&gt;&lt;/propertygroup&gt;&lt;br /&gt;&lt;br /&gt;After you have enabled ofcourse the code coverage for the correct projects.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-6167665638289590896?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/6167665638289590896/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=6167665638289590896' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/6167665638289590896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/6167665638289590896'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2009/01/team-build-enabling-code-coverage.html' title='Team Build: Enabling Code Coverage without using a test list'/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-374264358776961907</id><published>2009-01-12T19:14:00.007+01:00</published><updated>2009-01-23T08:59:17.540+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Buildstore'/><category scheme='http://www.blogger.com/atom/ns#' term='Rhino Mocks'/><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><category scheme='http://www.blogger.com/atom/ns#' term='Team Build'/><category scheme='http://www.blogger.com/atom/ns#' term='Referenced Assemblies'/><category scheme='http://www.blogger.com/atom/ns#' term='Entlib'/><title type='text'>Team Build and Referenced Assemblies</title><content type='html'>This session I am going to give some tip how you should reference shared assemblies.&lt;br /&gt;&lt;br /&gt;I am currently building an application that uses several things of Enterprise Library and RhinoMocks for unit testing. Now these references have to be made to fixed locations but this can impose problems when building from different machines (think build agents differebt developer machine setups).&lt;br /&gt;&lt;br /&gt;What I did was on my build agent I shared the build folder and mapped a networkdrive to it (in my case s:\). then I created a structure like this:&lt;br /&gt;Enltlib\latest\ to which I copied the complete bin directory from entlib. The big advantages is that if you decide to upgrade later you just rename the folder to v4.1 and create a new latest folder where you copy the latest binaries to. Like this everybody will always be referencing the latest binaries without having to redo all their references in their projects&lt;br /&gt;&lt;br /&gt;The advantages of this approach is that its completely independent of your machine setup. And if you have to work offline from your TFS once in a while you just make sure you check out the latest version of your BuildStore share the drive on your local machine and map it to the same network drive and your projects will continue to build without having to redirect the references all the time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-374264358776961907?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/374264358776961907/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=374264358776961907' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/374264358776961907'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/374264358776961907'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2009/01/automated-builds-and-referenced.html' title='Team Build and Referenced Assemblies'/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-368578950414368828</id><published>2008-12-31T19:32:00.003+01:00</published><updated>2009-01-06T18:09:37.809+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XP'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>XP And new years resolutions</title><content type='html'>At the verge on a new year people tend to have new years resolutions and things like that mine is blog more :p amongst others. So here we go.&lt;br /&gt;&lt;br /&gt;I recently started reading Ron Jeffries Extreme Programming Adventures in C# (&lt;a href="http://www.amazon.com/Extreme-Programming-Adventures-DV-Microsoft-Professional/dp/0735619492"&gt;http://www.amazon.com/Extreme-Programming-Adventures-DV-Microsoft-Professional/dp/0735619492&lt;/a&gt;). Since quite a little more then a year I Agile Development Methodologies caught my eye. Recently I am starting to dig deeper in TDD and XP. In this series of posts I will let you follow me on my journey.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-368578950414368828?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/368578950414368828/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=368578950414368828' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/368578950414368828'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/368578950414368828'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2008/12/xp-and-new-years-resolutions.html' title='XP And new years resolutions'/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-7375271046890805387</id><published>2008-12-01T17:06:00.003+01:00</published><updated>2008-12-05T17:54:38.102+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Team Foundation Server'/><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><category scheme='http://www.blogger.com/atom/ns#' term='reportserver'/><category scheme='http://www.blogger.com/atom/ns#' term='2008'/><title type='text'>Team Foundation Server 2008 SP1 with SQL 2008</title><content type='html'>I installed TFS 2008 with sql server 2008 and when I opened Team Explorer the Reports node in the team project was marked with a red cross and thus inaccessible.&lt;br /&gt;&lt;br /&gt;Simply upgrade your Visual Team System 2008 WITH team explorer installed to SP1&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-7375271046890805387?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/7375271046890805387/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=7375271046890805387' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/7375271046890805387'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/7375271046890805387'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2008/12/team-foundation-server-2008-sp1-with.html' title='Team Foundation Server 2008 SP1 with SQL 2008'/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-3867490289069938968</id><published>2008-10-04T13:56:00.006+02:00</published><updated>2008-12-17T18:36:34.983+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project server 2007'/><category scheme='http://www.blogger.com/atom/ns#' term='EPM'/><title type='text'>Microsoft Project Server 2007</title><content type='html'>I finished installing microsoft Project Server 2007. I came across 2 issues.&lt;br /&gt;The first one was the 2 Services (Microsoft Office Project Eventing Service and the Queue service) not starting this happens when the machine is not connected to the internet and tries to get some certificates from:&lt;br /&gt;http://crl.microsoft.com/pki/crl/products/CodeSignPCA.crl&lt;br /&gt;http://crl.microsoft.com/pki/crl/products/CodeSignPCA2.crl&lt;br /&gt;&lt;br /&gt;When you try to start them manually you get "Service did not respond in a timely fashion" and in the Eventlog you have: "Unexpected exception occured".&lt;br /&gt;&lt;br /&gt;This can be solved by using this woirkaround:&lt;br /&gt;"&lt;br /&gt;Manually add the CRLs from the above Urls to the server manually (assumes&lt;br /&gt;you've downloaded them locally first):&lt;br /&gt;certutil -addstore CA CodeSignPCA.crl&lt;br /&gt;certutil -addstore CA CodeSignPCA2.crl&lt;br /&gt;&lt;br /&gt;Resolution Workaround (don't try this unless you've exhausted everything&lt;br /&gt;else):&lt;br /&gt;&lt;br /&gt;We haven't tried this yet, but it is our hunch that if you cannot allow the&lt;br /&gt;server access to the internet that it may be possible to fool .Net into using&lt;br /&gt;locally hosted .crl files. This could only work if the restrictions that&lt;br /&gt;prevent the service account and server reaching the internet still permit a&lt;br /&gt;loop-back request to itself (calling web pages from the local server).&lt;br /&gt;&lt;br /&gt;The way to do this is to add this to your HOSTS file on the servers:&lt;br /&gt;127.0.0.1 crl.microsoft.com&lt;br /&gt;&lt;br /&gt;"&lt;br /&gt;&lt;br /&gt;or make sure you are connected to the internet for the easy solution :p&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;the other one was that jobs got stuck in the queue in "Waiting to be processed status". This I solved by running the service under the same credentials as the SSPService account.&lt;br /&gt;&lt;br /&gt;that all for now folks :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-3867490289069938968?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/3867490289069938968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=3867490289069938968' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/3867490289069938968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/3867490289069938968'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2008/10/microsoft-project-server-2007.html' title='Microsoft Project Server 2007'/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-3919501486922106586</id><published>2008-04-14T22:37:00.012+02:00</published><updated>2009-01-19T11:07:38.104+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DefaultDataPath'/><category scheme='http://www.blogger.com/atom/ns#' term='TargetDataBase'/><category scheme='http://www.blogger.com/atom/ns#' term='Team Foundation Server'/><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><category scheme='http://www.blogger.com/atom/ns#' term='MSBuild'/><category scheme='http://www.blogger.com/atom/ns#' term='Database'/><category scheme='http://www.blogger.com/atom/ns#' term='Continous Integration'/><title type='text'></title><content type='html'>&lt;strong&gt;&lt;span style="font-family:lucida grande;font-size:130%;"&gt;Continous Integration and the Database&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Spend some few days setting up a continous integration for a database project. Found some stuff on the internet but they got it all wrong :)&lt;br /&gt;&lt;br /&gt;I am using Team Foundation Server 2008.&lt;br /&gt;&lt;br /&gt;The only thing you need to do is modify the TFSBuild.proj&lt;br /&gt;&lt;br /&gt;Modify the following sections. This enabled the automatic generation of a sql script that will be copied in the Drop Folder.&lt;br /&gt;Find the SoltionToBuild tag and add the properties as shown below:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;SolutionToBuild&lt;/span&gt; &lt;span class="attr"&gt;Include&lt;/span&gt;&lt;span class="kwrd"&gt;="$(BuildProjectFolderPath)/../../CIDB/CIDB.sln"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Targets&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Targets&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Properties&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;DefaultDataPath=C:\BuildDrop\;TargetDataBase=TestDb&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Properties&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;SolutionToBuild&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Add the default configuration to the ConfigurationToBuild ItemGroup as shown below (make sure to match it to your settings in the Configuration Manager)&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ItemGroup&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;&amp;lt;!-- CONFIGURATIONS&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;The list of configurations to build. To add/delete configurations, edit this value. For example,&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;to add a new configuration, add the following lines:&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;&amp;lt;ConfigurationToBuild Include="Debugx86"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;&amp;lt;FlavorToBuild&amp;gt;Debug&amp;lt;/FlavorToBuild&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;&amp;lt;PlatformToBuild&amp;gt;x86&amp;lt;/PlatformToBuild&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;&amp;lt;/ConfigurationToBuild&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;The Include attribute value should be unique for each ConfigurationToBuild node.&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;--&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ConfigurationToBuild&lt;/span&gt; &lt;span class="attr"&gt;Include&lt;/span&gt;&lt;span class="kwrd"&gt;="ReleaseAny CPU"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;FlavorToBuild&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Release&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;FlavorToBuild&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;PlatformToBuild&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Any CPU&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;PlatformToBuild&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ConfigurationToBuild&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;&amp;lt;!--Include the configuration to build this generates a .sql file in the drop folder--&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ConfigurationToBuild&lt;/span&gt; &lt;span class="attr"&gt;Include&lt;/span&gt;&lt;span class="kwrd"&gt;="DefaultAnyCPU"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;FlavorToBuild&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Default&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;FlavorToBuild&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;PlatformToBuild&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Any CPU&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;PlatformToBuild&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ConfigurationToBuild&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ItemGroup&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Next add the following section to the end of the TFSBuild.proj file. the %3B is the escape character for ';' in MSBuild&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;PropertyGroup&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;TargetConnection&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Data Source=.%3BIntegrated Security=True%3BPooling=False&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;TargetConnection&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;DefaultDataPath&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;C:\BuildDrop\&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;DefaultDataPath&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;TargetDataBase&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;DevDb&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;TargetDataBase&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;PropertyGroup&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Target&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;="AfterDropBuild"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;MSBuild&lt;/span&gt; &lt;span class="attr"&gt;Projects&lt;/span&gt;&lt;span class="kwrd"&gt;="$(SolutionRoot)\CIDB\CIDB\CIDB.dbproj"&lt;/span&gt;&lt;br /&gt;&lt;span class="attr"&gt;Properties&lt;/span&gt;&lt;span class="kwrd"&gt;="Configuration=Default;&lt;br /&gt;OutDir=$(SolutionRoot)\..\binaries\Default\;&lt;br /&gt;AlwaysCreateNewDatabase=false;&lt;br /&gt;TargetConnectionString=$(TargetConnection);&lt;br /&gt;DefaultDataPath=$(DefaultDataPath);&lt;br /&gt;TargetDataBase=$(TargetDataBase)"&lt;/span&gt;&lt;br /&gt;&lt;span class="attr"&gt;Targets&lt;/span&gt;&lt;span class="kwrd"&gt;="ReBuild;Deploy"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;!&lt;/span&gt;—Need to specify the Rebuild target otherwise fails --&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Target&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;Update:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;If you modify your source folder setting in the workspace - defaults to $(SourceDir)- make sure that you override your SolutionRoot property&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;by adding the following&lt;/span&gt;&lt;/p&gt;&lt;p&gt;...&lt;/p&gt;&lt;p&gt;&amp;lt;/ProjectExtensions&amp;gt;&lt;br /&gt;&amp;lt;PropertyGroup&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;SolutionRoot&amp;gt;C:\Workspace_Build02 &amp;lt;/SolutionRoot&amp;gt;&lt;/p&gt;&lt;p&gt;....&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Thats all there is to it :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Coming up automatically generate an upgrade script to deploy to production systems... I installed the Database Team Edition on the build agent but I am not quite sure if its necessary I will investigate this... I dont know if its default part of ms build&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-3919501486922106586?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/3919501486922106586/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=3919501486922106586' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/3919501486922106586'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/3919501486922106586'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2008/04/continous-integration-and-database.html' title=''/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-1240102226306727537</id><published>2008-02-13T11:51:00.003+01:00</published><updated>2008-10-04T12:40:18.681+02:00</updated><title type='text'></title><content type='html'>Long time since I made a blogpost. But finally got my TFS server running at home and it works like a charm&lt;br /&gt;&lt;br /&gt;This guide proved to be very usefull:&lt;br /&gt;&lt;a href="http://bloggingabout.net/blogs/mglaser/archive/2007/01/31/hosting-team-foundation-server-on-a-fully-qualified-domain-name-fqdn.aspx"&gt;http://bloggingabout.net/blogs/mglaser/archive/2007/01/31/hosting-team-foundation-server-on-a-fully-qualified-domain-name-fqdn.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-1240102226306727537?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/1240102226306727537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=1240102226306727537' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/1240102226306727537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/1240102226306727537'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2008/02/long-time-since-i-made-blogpost.html' title=''/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-7099445322123141712</id><published>2007-09-24T15:13:00.004+02:00</published><updated>2008-12-17T18:35:31.866+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Webservices'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET 2.0'/><title type='text'></title><content type='html'>Create A Compression extension using .NET 2.0&lt;br /&gt;(original version can be found here: http://www.123aspx.com/redir.aspx?res=29459)&lt;br /&gt;&lt;br /&gt;First of all we create a class that does all the work&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; CompressionExtension : SoapExtension {&lt;br /&gt;Stream _OldStream;&lt;br /&gt;Stream _NewStream;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt; GetInitializer(LogicalMethodInfo methodInfo,&lt;br /&gt;SoapExtensionAttribute attribute) {&lt;br /&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt; attribute;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;// Get the Type&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt; GetInitializer(Type t) {&lt;br /&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(CompressionExtension);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;// Get the CompressionExtensionAttribute&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Initialize(&lt;span class="kwrd"&gt;object&lt;/span&gt; initializer) {&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (initializer &lt;span class="kwrd"&gt;is&lt;/span&gt; CompressionExtensionAttribute) {&lt;br /&gt;CompressionExtensionAttribute attribute =&lt;br /&gt;(CompressionExtensionAttribute)initializer;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;// Process the SOAP Message&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; ProcessMessage(SoapMessage message) {&lt;br /&gt;&lt;span class="rem"&gt;// Check for the various SOAP Message Stages&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;switch&lt;/span&gt; (message.Stage) {&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;case&lt;/span&gt; SoapMessageStage.BeforeSerialize:&lt;br /&gt;&lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;case&lt;/span&gt; SoapMessageStage.AfterSerialize:&lt;br /&gt;&lt;span class="rem"&gt;// ZIP the contents of the SOAP Body after it has&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;// been serialized&lt;/span&gt;&lt;br /&gt;Zip();&lt;br /&gt;&lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;case&lt;/span&gt; SoapMessageStage.BeforeDeserialize:&lt;br /&gt;&lt;span class="rem"&gt;// Unzip the contents of the SOAP Body before it is&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;// deserialized&lt;/span&gt;&lt;br /&gt;Unzip();&lt;br /&gt;&lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;case&lt;/span&gt; SoapMessageStage.AfterDeserialize:&lt;br /&gt;&lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;default&lt;/span&gt;:&lt;br /&gt;&lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; Exception(&lt;span class="str"&gt;"invalid stage"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;// Gives us the ability to get hold of the RAW SOAP message&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; Stream ChainStream(Stream stream) {&lt;br /&gt;_OldStream = stream;&lt;br /&gt;_NewStream = &lt;span class="kwrd"&gt;new&lt;/span&gt; MemoryStream();&lt;br /&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt; _NewStream;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;// Utility method to copy streams&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;void&lt;/span&gt; Copy(Stream from, Stream to) {&lt;br /&gt;TextReader reader = &lt;span class="kwrd"&gt;new&lt;/span&gt; StreamReader(from);&lt;br /&gt;TextWriter writer = &lt;span class="kwrd"&gt;new&lt;/span&gt; StreamWriter(to);&lt;br /&gt;writer.WriteLine(reader.ReadToEnd());&lt;br /&gt;writer.Flush();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;// Zip the SOAP Body&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Zip() {&lt;br /&gt;_NewStream.Position = 0;&lt;br /&gt;&lt;span class="rem"&gt;// Zip the SOAP Body&lt;/span&gt;&lt;br /&gt;_NewStream = ZipSoap(_NewStream);&lt;br /&gt;&lt;span class="rem"&gt;// Copy the streams&lt;/span&gt;&lt;br /&gt;Copy(_NewStream, _OldStream);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;// The actual ZIP method&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] Zip(&lt;span class="kwrd"&gt;string&lt;/span&gt; stringToZip) {&lt;br /&gt;&lt;span class="kwrd"&gt;byte&lt;/span&gt;[] inputByteArray = Encoding.UTF8.GetBytes(stringToZip);&lt;br /&gt;MemoryStream ms = &lt;span class="kwrd"&gt;new&lt;/span&gt; MemoryStream();&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;// Check the #ziplib docs for more information&lt;/span&gt;&lt;br /&gt;GZipStream zipOut = &lt;span class="kwrd"&gt;new&lt;/span&gt; GZipStream(ms, CompressionMode.Compress);&lt;br /&gt;zipOut.Write(inputByteArray, 0, inputByteArray.Length);&lt;br /&gt;zipOut.Close();&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;// Return the zipped contents&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt; ms.ToArray();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;// Select and Zip the appropriate parts of the SOAP message&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; MemoryStream ZipSoap(Stream streamToZip) {&lt;br /&gt;streamToZip.Position = 0;&lt;br /&gt;&lt;span class="rem"&gt;// Load a XML Reader&lt;/span&gt;&lt;br /&gt;XmlTextReader reader = &lt;span class="kwrd"&gt;new&lt;/span&gt; XmlTextReader(streamToZip);&lt;br /&gt;XmlDocument dom = &lt;span class="kwrd"&gt;new&lt;/span&gt; XmlDocument();&lt;br /&gt;dom.Load(reader);&lt;br /&gt;&lt;span class="rem"&gt;// Load a NamespaceManager to enable XPath selection&lt;/span&gt;&lt;br /&gt;XmlNamespaceManager nsmgr = &lt;span class="kwrd"&gt;new&lt;/span&gt; XmlNamespaceManager(dom.NameTable);&lt;br /&gt;nsmgr.AddNamespace(&lt;span class="str"&gt;"soap"&lt;/span&gt;, &lt;span class="str"&gt;"http://schemas.xmlsoap.org/soap/envelope/"&lt;/span&gt;);&lt;br /&gt;XmlNode node = dom.SelectSingleNode(&lt;span class="str"&gt;"//soap:Body"&lt;/span&gt;, nsmgr);&lt;br /&gt;&lt;span class="rem"&gt;// Select the contents within the method defined in the SOAP body&lt;/span&gt;&lt;br /&gt;node = node.FirstChild.FirstChild;&lt;br /&gt;&lt;span class="rem"&gt;// Check if there are any nodes selected&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;while&lt;/span&gt; (node != &lt;span class="kwrd"&gt;null&lt;/span&gt;) {&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (node.InnerXml.Length &amp;gt; 0) {&lt;br /&gt;&lt;span class="rem"&gt;// Zip the data&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;byte&lt;/span&gt;[] outData = Zip(node.InnerXml);&lt;br /&gt;&lt;span class="rem"&gt;// Convert it to Base64 for transfer over the internet&lt;/span&gt;&lt;br /&gt;node.InnerXml = Convert.ToBase64String(outData);&lt;br /&gt;}&lt;br /&gt;&lt;span class="rem"&gt;// Move to the next parameter&lt;/span&gt;&lt;br /&gt;node = node.NextSibling;&lt;br /&gt;}&lt;br /&gt;MemoryStream ms = &lt;span class="kwrd"&gt;new&lt;/span&gt; MemoryStream();&lt;br /&gt;&lt;span class="rem"&gt;// Save the updated data&lt;/span&gt;&lt;br /&gt;dom.Save(ms);&lt;br /&gt;ms.Position = 0;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt; ms;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;// Unzip the SOAP Body&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Unzip() {&lt;br /&gt;MemoryStream unzipedStream = &lt;span class="kwrd"&gt;new&lt;/span&gt; MemoryStream();&lt;br /&gt;&lt;br /&gt;TextReader reader = &lt;span class="kwrd"&gt;new&lt;/span&gt; StreamReader(_OldStream);&lt;br /&gt;TextWriter writer = &lt;span class="kwrd"&gt;new&lt;/span&gt; StreamWriter(unzipedStream);&lt;br /&gt;writer.WriteLine(reader.ReadToEnd());&lt;br /&gt;writer.Flush();&lt;br /&gt;&lt;span class="rem"&gt;// Unzip the SOAP Body&lt;/span&gt;&lt;br /&gt;unzipedStream = UnzipSoap(unzipedStream);&lt;br /&gt;&lt;span class="rem"&gt;// Copy the streams&lt;/span&gt;&lt;br /&gt;Copy(unzipedStream, _NewStream);&lt;br /&gt;&lt;br /&gt;_NewStream.Position = 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;// Actual Unzip logic&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] Unzip(&lt;span class="kwrd"&gt;string&lt;/span&gt; stringToUnzip) {&lt;br /&gt;&lt;span class="rem"&gt;// Decode the Base64 encoding&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;byte&lt;/span&gt;[] inputByteArray = Convert.FromBase64String(stringToUnzip);&lt;br /&gt;MemoryStream ms = &lt;span class="kwrd"&gt;new&lt;/span&gt; MemoryStream(inputByteArray);&lt;br /&gt;MemoryStream ret = &lt;span class="kwrd"&gt;new&lt;/span&gt; MemoryStream();&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;// Refer to #ziplib documentation for more info on this&lt;/span&gt;&lt;br /&gt;GZipStream zipIn = &lt;span class="kwrd"&gt;new&lt;/span&gt; GZipStream(ms, CompressionMode.Decompress);&lt;br /&gt;Byte[] buffer = &lt;span class="kwrd"&gt;new&lt;/span&gt; Byte[2048];&lt;br /&gt;&lt;span class="kwrd"&gt;int&lt;/span&gt; size = 2048;&lt;br /&gt;&lt;span class="kwrd"&gt;while&lt;/span&gt; (&lt;span class="kwrd"&gt;true&lt;/span&gt;) {&lt;br /&gt;size = zipIn.Read(buffer, 0, buffer.Length);&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (size &amp;gt; 0) {&lt;br /&gt;ret.Write(buffer, 0, size);&lt;br /&gt;} &lt;span class="kwrd"&gt;else&lt;/span&gt; {&lt;br /&gt;&lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt; ret.ToArray();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;// Unzip the SOAP Body&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; MemoryStream UnzipSoap(Stream streamToUnzip) {&lt;br /&gt;streamToUnzip.Position = 0;&lt;br /&gt;&lt;span class="rem"&gt;// Load a XmlReader&lt;/span&gt;&lt;br /&gt;XmlTextReader reader = &lt;span class="kwrd"&gt;new&lt;/span&gt; XmlTextReader(streamToUnzip);&lt;br /&gt;XmlDocument dom = &lt;span class="kwrd"&gt;new&lt;/span&gt; XmlDocument();&lt;br /&gt;dom.Load(reader);&lt;br /&gt;&lt;br /&gt;XmlNamespaceManager nsmgr = &lt;span class="kwrd"&gt;new&lt;/span&gt; XmlNamespaceManager(dom.NameTable);&lt;br /&gt;nsmgr.AddNamespace(&lt;span class="str"&gt;"soap"&lt;/span&gt;, &lt;span class="str"&gt;"http://schemas.xmlsoap.org/soap/envelope/"&lt;/span&gt;);&lt;br /&gt;&lt;span class="rem"&gt;// Select the SOAP Body node&lt;/span&gt;&lt;br /&gt;XmlNode node = dom.SelectSingleNode(&lt;span class="str"&gt;"//soap:Body"&lt;/span&gt;, nsmgr);&lt;br /&gt;node = node.FirstChild.FirstChild;&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;// Check if node exists&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;while&lt;/span&gt; (node != &lt;span class="kwrd"&gt;null&lt;/span&gt;) {&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (node.InnerXml.Length &amp;gt; 0) {&lt;br /&gt;&lt;span class="rem"&gt;// Send the node's contents to be unziped&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;byte&lt;/span&gt;[] outData = Unzip(node.InnerXml);&lt;br /&gt;&lt;span class="kwrd"&gt;string&lt;/span&gt; sTmp = Encoding.UTF8.GetString(outData);&lt;br /&gt;node.InnerXml = sTmp;&lt;br /&gt;}&lt;br /&gt;&lt;span class="rem"&gt;// Move to the next parameter&lt;/span&gt;&lt;br /&gt;node = node.NextSibling;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;MemoryStream ms = &lt;span class="kwrd"&gt;new&lt;/span&gt; MemoryStream();&lt;br /&gt;&lt;br /&gt;dom.Save(ms);&lt;br /&gt;ms.Position = 0;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt; ms;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Next we create a class that will be able to use as an attribute&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; CompressionExtensionAttribute : System.Web.Services.Protocols.SoapExtensionAttribute {&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; _Priority;&lt;br /&gt;&lt;br /&gt;        &lt;span class="rem"&gt;// Override the base class properties&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; Type ExtensionType {&lt;br /&gt;            get { &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(CompressionExtension); }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Priority {&lt;br /&gt;            get {&lt;br /&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; _Priority;&lt;br /&gt;            }&lt;br /&gt;            set {&lt;br /&gt;                _Priority = &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This approach involves updating the reference.cs manually. We are going to extend this in order that if we choose update webreference in Visual studion the attribute is added immediately to the proxy class. (For more detail goto: http://msdn2.microsoft.com/en-us/library/x4s9z3yc.aspx)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-7099445322123141712?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/7099445322123141712/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=7099445322123141712' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/7099445322123141712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/7099445322123141712'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2007/09/create-compression-extension-using.html' title=''/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-2131181211054672096</id><published>2007-04-20T12:29:00.002+02:00</published><updated>2008-12-17T18:35:10.762+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WinForms'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET 2.0'/><title type='text'></title><content type='html'>&lt;p&gt;&lt;strong&gt;Create a Winforms ComboBox with a default text when nothing is selected.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Follow these easy steps to create a combox that shows a text instead of an empty line when nothing is selected&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Create a new UserControl&lt;/li&gt;&lt;br /&gt;&lt;li&gt;in the code view make sure the Class Enherits from ComboBox instead of UserControl&lt;/li&gt;&lt;br /&gt;&lt;li&gt;In the default constructor set the DrawMode to OwnerDrawn.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Add two properties UnSelectedColor of type Color and UnSelectedText of type string&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Override the OnDrawItem method&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;I will put a more detailed article on my personal homepage. Link will follow later.&lt;br /&gt;&lt;br /&gt;Thanks to Richard Everett who provided me the example code &lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-2131181211054672096?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/2131181211054672096/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=2131181211054672096' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/2131181211054672096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/2131181211054672096'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2007/04/create-winforms-combobox-with-default.html' title=''/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-7663824834756060686</id><published>2007-04-16T16:52:00.001+02:00</published><updated>2008-12-17T18:34:41.789+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET 2.0'/><title type='text'></title><content type='html'>&lt;strong&gt;&lt;span style="font-size:130%;"&gt;Easy way for filtering a BindingList&lt;t&gt;&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;Found this opensource project: &lt;a href="http://sourceforge.net/projects/blw/"&gt;http://sourceforge.net/projects/blw/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As a replacement for datasets/dataTables&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-7663824834756060686?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/7663824834756060686/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=7663824834756060686' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/7663824834756060686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/7663824834756060686'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2007/04/easy-way-for-filtering-bindinglist.html' title=''/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-7102107017157859046</id><published>2007-04-03T13:42:00.002+02:00</published><updated>2008-12-17T18:34:04.507+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL 2005'/><category scheme='http://www.blogger.com/atom/ns#' term='Database'/><title type='text'></title><content type='html'>&lt;strong&gt;&lt;span style="font-size:130%;"&gt;Guid vs Int&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Rather interesting article on when tho use a guid or an int as a Primary Key:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://databases.aspfaq.com/database/what-should-i-choose-for-my-primary-key.html"&gt;http://databases.aspfaq.com/database/what-should-i-choose-for-my-primary-key.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Summary:&lt;br /&gt;&lt;br /&gt;&lt;table bordercolor="#cccccc" cellspacing="0" cellpadding="5" border="1"&gt;&lt;tbody&gt;&lt;tr bgcolor="#dedede"&gt;&lt;th align="left"&gt;IDENTITY&lt;/th&gt;&lt;/tr&gt;&lt;tr bgcolor="#efefef"&gt;&lt;th align="left"&gt;PROS&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;ul type="square"&gt;&lt;li&gt;small storage footprint;&lt;br /&gt;&lt;li&gt;optimal join / index performance (e.g. for time range queries, most rows recently inserted will be on a limited number of pages);&lt;br /&gt;&lt;li&gt;highly useful for data warehousing;&lt;br /&gt;&lt;li&gt;native data type of the OS, and easy to work with in all languages;&lt;br /&gt;&lt;li&gt;easy to debug (where userid = 457);&lt;br /&gt;&lt;li&gt;generated automatically (retrieved through SCOPE_IDENTITY() rather than assigned);&lt;br /&gt;&lt;li&gt;not updateable (though some consider this a disadvantage, strangely enough).&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr bgcolor="#efefef"&gt;&lt;th align="left"&gt;CONS&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;ul type="square"&gt;&lt;li&gt;cannot be reliably "predicted" by applications â€” can only be retrieved after the INSERT;&lt;br /&gt;&lt;li&gt;need a complex scheme in multi-server environments, since IDENTITY is not allowed in some forms of replication;&lt;br /&gt;&lt;li&gt;can be duplicated, if not explicitly set to PRIMARY KEY:&lt;br /&gt;&lt;table cellspacing="0" cellpadding="10" border="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="code"&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;CREATE TABLE splunge(&lt;br /&gt;splungeID INT IDENTITY(1,1),&lt;br /&gt;foo CHAR(1)&lt;br /&gt;)&lt;br /&gt;GO&lt;br /&gt;SET NOCOUNT ON&lt;br /&gt;INSERT splunge(foo) VALUES('a')&lt;br /&gt;INSERT splunge(foo) VALUES('b')&lt;br /&gt;INSERT splunge(foo) VALUES('c')&lt;br /&gt;GO&lt;br /&gt;DBCC CHECKIDENT('splunge', RESEED, 2)&lt;br /&gt;GO&lt;br /&gt;INSERT splunge(foo) VALUES('d')&lt;br /&gt;GO&lt;br /&gt;SELECT * FROM splunge&lt;br /&gt;GO&lt;br /&gt;DROP TABLE splunge&lt;br /&gt;GO&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;li&gt;if part of the clustered index on the table, this can create an insert hot-spot;&lt;br /&gt;&lt;li&gt;proprietary and not directly portable;&lt;br /&gt;&lt;li&gt;only unique within a single table;&lt;br /&gt;&lt;li&gt;gaps can occur (e.g. with a rolled back transaction), and this can cause chicken little-style alarms.&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr bgcolor="#dedede"&gt;&lt;th style="BORDER-TOP: #666666 3px solid" align="left"&gt;GUID()&lt;/th&gt;&lt;/tr&gt;&lt;tr bgcolor="#efefef"&gt;&lt;th align="left"&gt;PROS&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;ul type="square"&gt;&lt;li&gt;since they are {more or less} guaranteed to be unique, multiple tables/databases/instances/servers/networks/data centers can generate them independently, then merged without clashes;&lt;br /&gt;&lt;li&gt;required for some forms of replication;&lt;br /&gt;&lt;li&gt;can be generated outside the database (e.g. by an application);&lt;br /&gt;&lt;li&gt;distributed values prevent hot-spot (as long as you don't cluster this column, which can lead to abnormally high fragmentation).&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr bgcolor="#efefef"&gt;&lt;th align="left"&gt;CONS&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;ul type="square"&gt;&lt;li&gt;the wider datatype leads to a drop in index performance (if clustered, each insert almost guaranteed to 'dirty' a different page), and an increase in storage requirements;&lt;br /&gt;&lt;li&gt;cumbersome to debug (where userid = {BAE7DF4-DDF-3RG-5TY3E3RF456AS10});&lt;br /&gt;&lt;li&gt;updateable (need to propogate changes, or prevent the activity altogether);&lt;br /&gt;&lt;li&gt;sensitive to time rollbacks in certain environments (e.g. daylight savings time rollbacks);&lt;br /&gt;&lt;li&gt;GROUP BY and other set operations often require CAST/CONVERT;&lt;br /&gt;&lt;li&gt;not all languages and environments directly support GUIDs;&lt;br /&gt;&lt;li&gt;there is no statement like SCOPE_GUID() to determine the value that was generated, e.g. by NEWID();&lt;br /&gt;&lt;li&gt;there are display issues to consider, such as response.write issues (see &lt;a title="http://www.aspfaq.com/show.asp?id=" href="http://www.aspfaq.com/show.asp?id=2358" target="_self"&gt;Article #2358&lt;/a&gt;), and also consider cases where you display a large amount of rows as checkboxes or other form elements with IDs - your page just got a whole lot bigger, and you have to handle the IDs in a custom way because JavaScript can't deal with objects that have dashes in their name/id.&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-7102107017157859046?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/7102107017157859046/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=7102107017157859046' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/7102107017157859046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/7102107017157859046'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2007/04/rather-interesting-article-on-when-tho.html' title=''/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-8394957221804344664</id><published>2007-03-06T22:33:00.002+01:00</published><updated>2008-12-17T18:34:55.344+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WinForms'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET 2.0'/><title type='text'></title><content type='html'>I came across an annoying little thing trying to trigger an event that updates the UI...&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;{"Cross-thread operation not valid: Control 'label1' accessed from a thread other than the thread it was created on."}&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This happens because the UI runs in a specific thread. Now we create another thread and try to access the UI thread which throws the above exception. There is a solution in msdn but imo its not a good one.&lt;br /&gt;&lt;br /&gt;Thus we need to marshal the event from one thread to the other thread as shown below.&lt;br /&gt;&lt;br /&gt;the source (just create a new form called form1 and drag a label and a button on it):&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#9999ff;"&gt;ThreadComponent.cs&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="FONT-SIZE: 7pt"&gt;&lt;br /&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.Threading;&lt;br /&gt;using System.ComponentModel;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;namespace WindowsApplication3 {&lt;br /&gt;    public delegate void ShowSomethingHandler(string message);&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;    public class ThreadedComponent {&lt;br /&gt;        private Thread _Thread;      &lt;br /&gt;&lt;br /&gt;        public ThreadedComponent() {&lt;br /&gt;            _Thread = new Thread(Poll);&lt;br /&gt;            _Thread.Start();&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private void Poll() {&lt;br /&gt;            int i = 0;&lt;br /&gt;            ISynchronizeInvoke invoker = ShowSomething.Target as ISynchronizeInvoke;&lt;br /&gt;            while(true) {&lt;br /&gt;                if(ShowSomething != null) {&lt;br /&gt;                  &lt;br /&gt;                   //ShowSomething("Message N°:" + (++i));&lt;br /&gt;                    if(!invoker.InvokeRequired) {&lt;br /&gt;                        object[] args = {"Message N°:" + (++i)};&lt;br /&gt;                        invoker.Invoke(ShowSomething, args);&lt;br /&gt;                    } else {&lt;br /&gt;                        ShowSomething("Message N°:" + (++i));&lt;br /&gt;                    }&lt;br /&gt;                  &lt;br /&gt;                  &lt;br /&gt;                }&lt;br /&gt;                Thread.Sleep(1000);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public event ShowSomethingHandler ShowSomething;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#9999ff;"&gt;Form1.cs&lt;/span&gt;&lt;br /&gt;&lt;pre style="FONT-SIZE: 7pt"&gt;&lt;br /&gt;namespace WindowsApplication3 {&lt;br /&gt;    public partial class Form1 : Form {&lt;br /&gt;        public Form1() {&lt;br /&gt;            InitializeComponent();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private void button1_Click(object sender, EventArgs e) {&lt;br /&gt;            ThreadedComponent c = new ThreadedComponent();&lt;br /&gt;            c.ShowSomething += new ShowSomethingHandler(c_ShowSomething);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        void c_ShowSomething(string message) {&lt;br /&gt;            label1.Text = message;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-8394957221804344664?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/8394957221804344664/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=8394957221804344664' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/8394957221804344664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/8394957221804344664'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2007/03/i-came-across-annoying-little-thing.html' title=''/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-8662392904420790633</id><published>2007-02-24T17:46:00.000+01:00</published><updated>2007-02-24T17:47:35.544+01:00</updated><title type='text'></title><content type='html'>Finished my MCPD: Enterprise applications cerification last week&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-8662392904420790633?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/8662392904420790633/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=8662392904420790633' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/8662392904420790633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/8662392904420790633'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2007/02/finished-my-mcpd-enterprise.html' title=''/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-117061344418016605</id><published>2007-02-04T19:21:00.000+01:00</published><updated>2007-02-04T19:24:04.180+01:00</updated><title type='text'></title><content type='html'>Finally managed to solve a problem that has been bugging me for ages now. When tryinng to use the wizard for databinding to an object the Wizard gave an error :&lt;br /&gt;"An unexpected error has occurred"&lt;br /&gt;"Error Message: Object reference not set to an instance of an object"&lt;br /&gt;&lt;br /&gt;The solution can be found here:&lt;br /&gt;&lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=380441&amp;SiteId=1&amp;amp;PageID=3"&gt;http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=380441&amp;SiteId=1&amp;amp;PageID=3&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-117061344418016605?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/117061344418016605/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=117061344418016605' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/117061344418016605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/117061344418016605'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2007/02/finally-managed-to-solve-problem-that.html' title=''/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-117061330650866478</id><published>2007-02-04T19:15:00.000+01:00</published><updated>2007-02-04T19:21:46.523+01:00</updated><title type='text'></title><content type='html'>Finished the 70-553 upgrade exam. I am now officially&lt;br /&gt;MCTS: .NET Framework&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Windows Applications&lt;/li&gt;&lt;li&gt;WebApplications&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/34744747-117061330650866478?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/117061330650866478/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=117061330650866478' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/117061330650866478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/117061330650866478'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2007/02/finished-70-553-upgrade-exam.html' title=''/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-116558372924546165</id><published>2006-12-08T14:12:00.000+01:00</published><updated>2006-12-08T14:15:29.256+01:00</updated><title type='text'></title><content type='html'>Passed my second CRM exam, Extending Microsoft CRM 3.0 today . I am now a Microsoft Certified Business Management Solutions Professional - Microsoft Dynamics CRM Developer.... ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-116558372924546165?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/116558372924546165/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=116558372924546165' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/116558372924546165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/116558372924546165'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2006/12/passed-my-second-crm-exam-extending.html' title=''/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-116533007133822580</id><published>2006-12-05T15:42:00.000+01:00</published><updated>2006-12-05T15:47:51.356+01:00</updated><title type='text'></title><content type='html'>Struggling to install virtual server RC2 on Vista :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Found the solution here : &lt;a href="http://blogs.msdn.com/virtual_pc_guy/archive/2006/06/05/618547.aspx"&gt;http://blogs.msdn.com/virtual_pc_guy/archive/2006/06/05/618547.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;in short:&lt;br /&gt;&lt;br /&gt;Install Virtual server like this:&lt;br /&gt;&lt;span style="font-family:courier new;color:#6666cc;"&gt;&lt;em&gt;start /w pkgmgr /l:log.etw /iu:IIS-WebServerRole;IIS-WebServer;IIS-CommonHttpFeatures;IIS-StaticContent;IIS-DefaultDocument;IIS-DirectoryBrowsing;IIS-HttpErrors;IIS-HttpRedirect;IIS-ApplicationDevelopment;IIS-ASPNET;IIS-NetFxExtensibility;IIS-ASP;IIS-CGI;IIS-ISAPIExtensions;IIS-ISAPIFilter;IIS-ServerSideIncludes;IIS-HealthAndDiagnostics;IIS-HttpLogging;IIS-LoggingLibraries;IIS-RequestMonitor;IIS-HttpTracing;IIS-CustomLogging;IIS-ODBCLogging;IIS-Security;IIS-BasicAuthentication;IIS-WindowsAuthentication;IIS-DigestAuthentication;IIS-ClientCertificateMappingAuthentication;IIS-IISCertificateMappingAuthentication;IIS-URLAuthorization;IIS-RequestFiltering;IIS-IPSecurity;IIS-Performance;IIS-HttpCompressionStatic;IIS-HttpCompressionDynamic;IIS-WebServerManagementTools;IIS-ManagementConsole;IIS-ManagementScriptingTools;IIS-ManagementService;IIS-IIS6ManagementCompatibility;IIS-Metabase;IIS-WMICompatibility;IIS-LegacyScripts;IIS-LegacySnapIn;IIS-FTPPublishingService;IIS-FTPServer;IIS-FTPManagement;WAS-WindowsActivationservice;WAS-ProcessModel;WAS-NetFxEnvironment;WAS-ConfigurationAPI&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If this does not work look at the above link for the manual install you just have to install IIS and see that the 'IIS 6 Management Compatibility' is checked&lt;br /&gt;&lt;br /&gt;Then I got this error:&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;The following error occurred:An error occurred accessing the website application data folder.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;This is solved by running Internet Explorer as Administrator (make sure you have windows authentication enabled in "Authentication" In your websites managment console)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-116533007133822580?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/116533007133822580/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=116533007133822580' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/116533007133822580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/116533007133822580'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2006/12/struggling-to-install-virtual-server.html' title=''/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-116487310434512083</id><published>2006-11-30T08:46:00.000+01:00</published><updated>2006-12-13T10:14:02.096+01:00</updated><title type='text'></title><content type='html'>Run across a minor issue while trying to install Visual Studion 2005 on Vista.&lt;br /&gt;When installing he suddenly says he can not copy a certain file. you can retry or cancel. Cancel the installation and rerun the setup.exe with &lt;strong&gt;"Elevated Administrator Rights" &lt;/strong&gt;. This should solve that issue. If this does not work try to install the latest version of Daemon tools because second time i tried the elevated administrator rights did not resolve the issue. &lt;br /&gt;&lt;br /&gt;When I tried to run Visual Studio I get a warning. I recommend that you read what it has to say because there are numerous issues that may occur...&lt;br /&gt;&lt;br /&gt;Do not forget to install the latest  service pack either.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-116487310434512083?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/116487310434512083/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=116487310434512083' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/116487310434512083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/116487310434512083'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2006/11/run-across-minor-issue-while-trying-to.html' title=''/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-116481183786302330</id><published>2006-11-29T15:47:00.000+01:00</published><updated>2006-11-29T15:50:37.880+01:00</updated><title type='text'></title><content type='html'>Today spent a large part of the day installing VISTA on my laptop&lt;br /&gt;Something I had to look for was how to sync my Qtec s200 with vista. Figured out I had to install &lt;strong&gt;"Microsoft Windows Mobile Device Center Beta 3 for Windows Vista"&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;You can download it here:&lt;br /&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=C23C8E6A-A72D-4AEF-9663-31CE2FEFBADA&amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyId=C23C8E6A-A72D-4AEF-9663-31CE2FEFBADA&amp;amp;displaylang=en&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Works more stable than the RC2 from october that I installed on my desktop a month ago. (until now :p)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-116481183786302330?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/116481183786302330/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=116481183786302330' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/116481183786302330'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/116481183786302330'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2006/11/today-spent-large-part-of-day.html' title=''/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-116341598941939644</id><published>2006-11-13T12:03:00.000+01:00</published><updated>2006-11-13T12:06:29.430+01:00</updated><title type='text'></title><content type='html'>Installed windows vista and office 2007 this weekend. Looks great only computer is a lot slower now :/ thnking about reverting back.&lt;br /&gt;&lt;br /&gt;Only problem I came across is that I could not install daemon tools to mount iso images. Found a very good (free) alternative: elby Virtual CloneDrive is  can be found here : http://www.elby.de/fun/software/index.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-116341598941939644?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/116341598941939644/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=116341598941939644' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/116341598941939644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/116341598941939644'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2006/11/installed-windows-vista-and-office.html' title=''/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-116187182528040877</id><published>2006-10-26T15:06:00.000+02:00</published><updated>2006-10-26T16:10:25.333+02:00</updated><title type='text'></title><content type='html'>Playing around with the WPF (Avalon) looks neat!&lt;br /&gt;&lt;br /&gt;Made my first databound custom control its pretty easy...&lt;br /&gt;I had been struggling with it for a short while but then turned on some scandicrust and it did wonders ;)&lt;br /&gt;&lt;br /&gt;Also extending my framework bit by bit. Starts to look quit nice.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-116187182528040877?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/116187182528040877/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=116187182528040877' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/116187182528040877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/116187182528040877'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2006/10/playing-around-with-wpf-avalon-looks.html' title=''/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34744747.post-115876377907108232</id><published>2006-09-20T15:52:00.000+02:00</published><updated>2006-09-20T19:09:20.420+02:00</updated><title type='text'></title><content type='html'>Yesterday I came across a small problem in CRM I needed to disable all fields in a form except one o_O. So this is what I came up with:&lt;br /&gt;&lt;br /&gt;I put this in my form_load event&lt;br /&gt;&lt;br /&gt;Since I am a lazy programmer is used a loop :D&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;var type = 'hidden+text+select-one+checkbox+textarea+radio';&lt;br /&gt;for (i=0;i &amp;lt;crmform.all.length;i++){&lt;br /&gt;     if(type.indexOf(crmForm.all[i].type) != -1){&lt;br /&gt;//disable all fields except new_SomeField&lt;br /&gt;         crmForm.all[i].disabled= (crmForm.all[i].id != 'new_SomeField');&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;//Disable lookup fields manually&lt;br /&gt;crmForm.all.ownerid.disabled = true;&lt;br /&gt;crmForm.all.preferredserviceid.disabled = true;&lt;br /&gt;crmForm.all.preferredequipmentid.disabled = true;&lt;br /&gt;crmForm.all.preferredsystemuserid.disabled = true;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;For the future maybe use an array containing all &lt;br /&gt;the fields you want to disable / leave enabled.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34744747-115876377907108232?l=jellebens.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jellebens.blogspot.com/feeds/115876377907108232/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34744747&amp;postID=115876377907108232' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/115876377907108232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34744747/posts/default/115876377907108232'/><link rel='alternate' type='text/html' href='http://jellebens.blogspot.com/2006/09/yesterday-i-came-across-small-problem.html' title=''/><author><name>Jelle Bens</name><uri>http://www.blogger.com/profile/04614790746997025594</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-oRcH9ApNg70/TgrifvQtiGI/AAAAAAAAAEY/3uBYhxmjo2s/s220/me.jpg'/></author><thr:total>0</thr:total></entry></feed>
